01
問題一:尋找靶心
圖一
02
問題二:尋找其中的缺失點(diǎn)
圖二
解決方法
01
尋找靶心
仔細(xì)觀察圖一,可以看到兩個(gè)最直接的是靶心有十字交叉線,而在OpenCV形態(tài)學(xué)處理中,支持十字交叉結(jié)構(gòu)元素,所以我們可以先檢測(cè)兩條線,然后獲取十字交叉結(jié)構(gòu),最后對(duì)結(jié)構(gòu)進(jìn)行輪廓分析,獲取中心點(diǎn),即可獲得最終的靶心位置,最終尋找到的靶心位置圖示如下:
獲取水平與垂直線如下:
獲取十字交叉線如下:
代碼實(shí)現(xiàn)如下:
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
尋找缺失
仔細(xì)觀察圖二,缺失是偶發(fā)情況,針對(duì)這種情況下,要完成計(jì)數(shù)與缺失位置標(biāo)定!我感覺我的密集恐懼癥已經(jīng)開始犯了!首先需要獲取這些位置,通過二值話與輪廓發(fā)現(xiàn)搞定,然后根據(jù)這些輪廓位置,重新繪制統(tǒng)一的圓形標(biāo)記,輪廓發(fā)現(xiàn)對(duì)每個(gè)圓形標(biāo)記進(jìn)行上下左右位置最近領(lǐng)搜索,返回間隔距離,-1表示邊界,根據(jù)間隔距離設(shè)置閾值查找缺失,最終運(yùn)行結(jié)果如下:
從原圖得到的標(biāo)記圖如下:
代碼實(shí)現(xiàn)如下:
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
+關(guān)注
關(guān)注
31文章
635瀏覽量
41595 -
圖像分析
+關(guān)注
關(guān)注
0文章
82瀏覽量
18725
原文標(biāo)題:OpenCV二值圖像分析之尋找缺失與靶心
文章出處:【微信號(hào):CVSCHOOL,微信公眾號(hào):OpenCV學(xué)堂】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
AI模型部署邊緣設(shè)備的奇妙之旅:如何在邊緣端部署OpenCV
![AI模型部署邊緣設(shè)備的奇妙之旅:如何在邊緣端部署<b class='flag-5'>OpenCV</b>](https://file.elecfans.com/web2/M00/26/21/pYYBAGG5jjSALfrEAAAwAa9Oig8799.png)
一個(gè)月速成python+OpenCV圖像處理
![一<b class='flag-5'>個(gè)</b>月速成python+<b class='flag-5'>OpenCV</b><b class='flag-5'>圖像</b><b class='flag-5'>處理</b>](https://file1.elecfans.com/web3/M00/00/7F/wKgZPGdJlvGANv8EAAAl3WfWse8658.png)
從時(shí)域和頻域兩個(gè)角度對(duì)信號(hào)進(jìn)行分析
![從時(shí)域和頻域<b class='flag-5'>兩個(gè)</b>角度對(duì)信號(hào)進(jìn)行<b class='flag-5'>分析</b>](https://file1.elecfans.com/web1/M00/F5/62/wKgaoWc79c2AATzBAAAtESXiWJQ215.png)
OpenCV教程之OpenCV圖像閾值處理
![<b class='flag-5'>OpenCV</b>教程之<b class='flag-5'>OpenCV</b><b class='flag-5'>圖像</b>閾值<b class='flag-5'>處理</b>](https://file1.elecfans.com/web1/M00/F5/38/wKgaoWc4AN-AHePNAABA-YFx7dI869.png)
評(píng)論