前言#
最近在做卡片上的数字识别。调用 caffe 模块,直接用的 mnist 模型,不过这篇文章不讲 caffe。
需要先对图片进行一系列预处理,把卡片上的数字分离出来,有点 OCR 的感觉。
我把这次使用到的所有 opencv 函数简单写一下。
1. 读取视频 cv2.VideoCapture ()#
参数 1:可以是数字,对应摄像头编号。可以是视频名。
如果用的摄像头,下面要用循环来不断读帧。
c = cv2.VideoCapture(0)
while 1:
ret, image = c.read()
cv2.imshow("Origin", image) # 显示画面
cv2.waitKey(1) # 一定要搭配这句才出画面
2. 等待 cv2.waitKey ()#
参数 1:等待时间,单位毫秒。
一般与 cv2.imshow () 搭配使用
另一个实用的功能就是通过按键进入 if 条件语句
比如下面按 ESC 关闭窗口,退出循环,结束程序。
c = cv2.VideoCapture(0)
while 1:
ret, image = c.read()
cv2.imshow("Origin", image)
key = cv2.waitKey(1)
if key == 27:
cv2.destroyAllWindows()
break
3. 图像加文字 cv2.putText ()#
参数 1:图像
参数 2:文字内容
参数 3:坐标位置
参数 4:字体
参数 5:字号
参数 6:颜色
参数 7:字体粗细
c = cv2.VideoCapture(0)
while 1:
ret, image = c.read()
cv2.putText(image,‘HandsomeHans’,(220,130),cv2.FONT_HERSHEY_SIMPLEX,4,(127,127,255),2)
cv2.imshow("Origin", image)
key = cv2.waitKey(1)
if key == 27:
cv2.destroyAllWindows()
break
4. 图像加框 cv2.rectangle ()#
参数 1:图像
参数 2:左上角坐标
参数 3:右下角坐标
参数 4:框的颜色
参数 5:框的粗细
5. 提取图像轮廓 cv2.findContours ()#
参数 1:图像
参数 2:提取规则。cv2.RETR_EXTERNAL:只找外轮廓,cv2.RETR_TREE:内外轮廓都找。
参数 3:输出轮廓内容格式。cv2.CHAIN_APPROX_SIMPLE:输出少量轮廓点。cv2.CHAIN_APPROX_NONE:输出大量轮廓点。
输出参数 1:图像
输出参数 2:轮廓列表
输出参数 3:层级
contours_map, contours, hierarchy = cv2.findContours(image,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
6. 画出轮廓 cv2.drawContours ()#
参数 1:图像
参数 2:轮廓列表
参数 3:轮廓索引,如果负数则画出所有轮廓。
参数 4:轮廓颜色
参数 5:轮廓粗细
cv2.drawContours(image,contours,-1,(0,0,255),2)
7. 判断像素点是否在某一轮廓内 cv2.pointPolygonTest ()#
参数 1:某一轮廓列表
参数 2:像素点坐标
参数 3:如果为 True 则输出该像素点到轮廓最近距离。如果为 False,则输出为正表示在轮廓内,0 为轮廓上,负为轮廓外。
result = cv2.pointPolygonTest(biggest, (w,h), False)
8. 求轮廓面积 cv2.contourArea ()#
参数 1:某一轮廓
area = cv2.contourArea(contours[i])
9. 求包含轮廓的最小方框 cv2.minAreaRect ()#
参数 1:某一轮廓
输出参数 1:四个角点坐标和偏移角度
求最小方框并将其画出:
rect = cv2.minAreaRect(contours[i])
box = np.int0(cv2.boxPoints(rect)) # boxPoints()是opencv3的函数
cv2.drawContours(image,[box],0,(0,255,255),2)
10. 求包含轮廓的正方框 cv2.boundingRect ()#
参数 1:某一轮廓
x, y, w, h = cv2.boundingRect(contours[i])
11. 图像颜色转换 cv2.cvtColor ()#
参数 1:图像
参数 2:转换方式。cv2.COLOR_BGR2GRAY:转换为灰度图。cv2.COLOR_BGR2HSV:转换为 HSV 颜色空间。
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
12. 高斯平滑滤波 cv2.GaussianBlur ()#
参数 1:图像
参数 2:滤波器大小
参数 3:标准差
gray = cv2.GaussianBlur(gray,(3,3),0) #模糊图像
13. 中值滤波 cv2.medianBlur ()#
参数 1:图像
参数 2:滤波尺寸
gray = cv2.medianBlur(gray,5) # 填充白色噪点
14. 图像二值化 cv2.threshold ()#
参数 1:灰度图像
参数 2:阈值
参数 3:最大值
参数 4:转换方式 cv2.THRESH_BINARY、 cv2.THRESH_BINARY_INV、 cv2.THRESH_TRUNC、
cv2.THRESH_TOZERO、 cv2.THRESH_TOZERO_INV
ret, thres = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
15. 扩充图像 cv2.copyMakeBorder ()#
参数 1:图像
参数 2:top 扩充长度
参数 3:down 扩充长度
参数 4:left
参数 5:right
参数 6:边界类型:
BORDER_CONSTANT: 常量,增加的变量通通为 value 色 [value][value] | abcdef |
[value][value][value]
BORDER_REFLICATE: 直接用边界的颜色填充, aaaaaa | abcdefg | gggg
BORDER_REFLECT: 倒映,abcdefg | gfedcbamn | nmabcd
BORDER_REFLECT_101: 倒映,和上面类似,但在倒映时,会把边界空开,abcdefg | egfedcbamne | nmabcd
BORDER_WRAP: 类似于这种方式 abcdf | mmabcdf | mmabcd
参数 7:常量数值
iimgg = cv2.copyMakeBorder(num_thres,top,down,left,right,cv2.BORDER_CONSTANT,value=0)
16. 旋转图像 cv2.getRotationMatrix2D ()#
参数 1:旋转中心点
参数 2:旋转角度
参数 3:缩放大小
输出参数 1:旋转矩阵
rotateMatrix = cv2.getRotationMatrix2D(center=(thres.shape[1]/2, thres.shape[0]/2), angle = rect[2], scale = 1)
rotImg = cv2.warpAffine(thres, rotateMatrix, (thres.shape[1], thres.shape[0]))