在OpenCV裡實現條碼區域識別的方法示例
阿新 • • 發佈:2020-01-09
在我們識別條碼的過程裡,首先要找到條碼所在的區域,那麼怎麼樣來找到這個條碼的區域呢?如果仔細地觀察條碼,會發現條碼有一個特性,就是水平的梯度和垂值的梯度會不一樣,如果進行相減,會發現差值比較大。如果其它位置的影象一般不會這樣。利用這個特性,就可以把條碼所在區域求出來。
演示的程式碼如下:
#python 3.7.4,opencv4.1 #蔡軍生 https://blog.csdn.net/caimouse/article/details/51749579 #[email protected] # import numpy as np import cv2 from matplotlib import pyplot as plt #讀取圖片 img = cv2.imread('barcode6.jpg') # gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) cv2.imshow('gray',gray) gradX = cv2.Sobel(gray,ddepth=cv2.CV_32F,dx=1,dy=0,ksize=-1) gradY = cv2.Sobel(gray,dx=0,dy=1,ksize=-1) gradient = cv2.subtract(gradX,gradY) gradient = cv2.convertScaleAbs(gradient) cv2.imshow('gradient',gradient) blurred = cv2.blur(gradient,(9,9)) (_,thresh) = cv2.threshold(blurred,225,255,cv2.THRESH_BINARY) cv2.imshow('thresh',thresh) kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(21,7)) closed = cv2.morphologyEx(thresh,cv2.MORPH_CLOSE,kernel) closed = cv2.erode(closed,None,iterations = 4) closed = cv2.dilate(closed,iterations = 4) cv2.imshow('closed',closed) cnts,hierarchy = cv2.findContours(closed.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) c = sorted(cnts,key = cv2.contourArea,reverse = True)[0] #找最大的邊框 rect = cv2.minAreaRect(c) box = cv2.boxPoints(rect) box = np.int0(box) # 畫一個找到的方框 cv2.drawContours(img,[box],-1,(0,0),3) cv2.imshow('img',img) # cv2.waitKey(0) cv2.destroyAllWindows()
結果輸出如下:
轉換為灰度圖
X軸梯度減去Y軸梯度求絕對值
經過閾值處理後的圖片
經過形態學處理後的圖片
最後的輸出結果
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。