前言#
最近在做卡片上的數字識別。調用 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]))