01
問題一:尋找靶心
圖一
02
問題二:尋找其中的缺失點
圖二
解決方法
01
尋找靶心
仔細觀察圖一,可以看到兩個最直接的是靶心有十字交叉線,而在OpenCV形態學處理中,支持十字交叉結構元素,所以我們可以先檢測兩條線,然后獲取十字交叉結構,最后對結構進行輪廓分析,獲取中心點,即可獲得最終的靶心位置,最終尋找到的靶心位置圖示如下:
獲取水平與垂直線如下:
獲取十字交叉線如下:
代碼實現如下:
1image=cv.imread("D:/images/zsxq/cross.jpg") 2cv.imshow("input",image) 3gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY) 4ret,binary=cv.threshold(gray,0,255,cv.THRESH_OTSU|cv.THRESH_BINARY_INV) 5se1=cv.getStructuringElement(cv.MORPH_CROSS,(50,1)) 6se2=cv.getStructuringElement(cv.MORPH_CROSS,(1,50)) 7hline=cv.morphologyEx(binary,cv.MORPH_OPEN,se1) 8vline=cv.morphologyEx(binary,cv.MORPH_OPEN,se2) 9contours,hireachy=cv.findContours(hline,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_SIMPLE) 10mask=np.zeros_like(hline) 11max=-1 12index=0 13forcntinrange(len(contours)): 14x,y,w,h=cv.boundingRect(contours[cnt]) 15ifmax
02
尋找缺失
仔細觀察圖二,缺失是偶發情況,針對這種情況下,要完成計數與缺失位置標定!我感覺我的密集恐懼癥已經開始犯了!首先需要獲取這些位置,通過二值話與輪廓發現搞定,然后根據這些輪廓位置,重新繪制統一的圓形標記,輪廓發現對每個圓形標記進行上下左右位置最近領搜索,返回間隔距離,-1表示邊界,根據間隔距離設置閾值查找缺失,最終運行結果如下:
從原圖得到的標記圖如下:
代碼實現如下:
1image=cv.imread("D:/images/zsxq/zsxq_40.png") 2gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY) 3ret,binary=cv.threshold(gray,0,255,cv.THRESH_OTSU|cv.THRESH_BINARY_INV) 4cv.imshow("binary",binary) 5contours,hireachy=cv.findContours(binary,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_SIMPLE) 6mask=np.zeros_like(binary) 7forcntinrange(len(contours)): 8area=cv.contourArea(contours[cnt]) 9ifarea50: 10????????continue 11????x,?y,?w,?h?=?cv.boundingRect(contours[cnt]) 12????if?(y?+?h)?>(binary.shape[0]-10): 13continue 14cx=(x+w//2) 15cy=(y+h//2) 16cv.circle(mask,(cx,cy),4,(255),4,8,0) 17cv.imshow("mask",mask) 18contours,hireachy=cv.findContours(mask,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_SIMPLE) 19forcntinrange(len(contours)): 20x,y,w,h=cv.boundingRect(contours[cnt]) 21cx=(x+w//2) 22cy=(y+h//2) 23left=find_neighborhood(mask,cx,cy,1) 24right=find_neighborhood(mask,cx,cy,2) 25#top=find_neighborhood(mask,cx,cy,3) 26#bottom=find_neighborhood(mask,cx,cy,4) 27ifleft==-1orright==-1:#ortop==-1orbottom==-1: 28continue 29dx=right-left 30#dy=top-bottom 31#print(dx,dy) 32ifdx>15: 33cv.circle(image,(cx+left+10,cy),4,(0,0,255),4,8,0) 34 35cv.imshow("test",image) 36cv.imwrite("D:/find_miss.png",image) 37cv.waitKey(0) 38cv.destroyAllWindows()
審核編輯:劉清
-
OpenCV
+關注
關注
31文章
634瀏覽量
41338 -
圖像分析
+關注
關注
0文章
82瀏覽量
18676
原文標題:OpenCV二值圖像分析之尋找缺失與靶心
文章出處:【微信號:CVSCHOOL,微信公眾號:OpenCV學堂】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論