01
問(wèn)題一:尋找靶心

圖一
02
問(wèn)題二:尋找其中的缺失點(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)定!我感覺(jué)我的密集恐懼癥已經(jīng)開(kāi)始犯了!首先需要獲取這些位置,通過(guò)二值話與輪廓發(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)注
33文章
652瀏覽量
44784 -
圖像分析
+關(guān)注
關(guān)注
0文章
82瀏覽量
19230
原文標(biāo)題:OpenCV二值圖像分析之尋找缺失與靶心
文章出處:【微信號(hào):CVSCHOOL,微信公眾號(hào):OpenCV學(xué)堂】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
兩個(gè)RS485-Modbus主站如何通訊
曙光存儲(chǔ)連續(xù)斬獲兩個(gè)行業(yè)獎(jiǎng)項(xiàng)
沒(méi)有專(zhuān)利的opencv-python 版本
那些年我用OpenCV+Qt趟過(guò)哪些坑?寫(xiě)給視覺(jué)應(yīng)用開(kāi)發(fā)者的避坑指南
機(jī)器視覺(jué)雙雄YOLO 和 OpenCV 到底有啥區(qū)別?別再傻傻分不清!
一個(gè)硬件SPI兩個(gè)CS操作兩個(gè)norflash,怎么互斥操作兩個(gè)norflash?
基本半導(dǎo)體連獲兩個(gè)行業(yè)獎(jiǎng)項(xiàng)
【GM-3568JHF開(kāi)發(fā)板免費(fèi)體驗(yàn)】OpenCV開(kāi)發(fā)環(huán)境安裝和計(jì)數(shù)程序開(kāi)發(fā)
看到STM8L152用兩個(gè)IO用兩個(gè)或非門(mén)檢測(cè)兩個(gè)通斷,是什么原理呢?
itop-3568開(kāi)發(fā)板機(jī)器視覺(jué)opencv開(kāi)發(fā)手冊(cè)-圖像繪制-畫(huà)線
ADAU1787四個(gè)ADC、兩個(gè)DAC、帶音頻DSP的低功耗編解碼器技術(shù)手冊(cè)
基于LockAI視覺(jué)識(shí)別模塊:C++使用圖像的統(tǒng)計(jì)信息
基于LockAI視覺(jué)識(shí)別模塊:C++圖像的基本運(yùn)算
基于LockAI視覺(jué)識(shí)別模塊:C++圖像的基本運(yùn)算
分享兩個(gè)OpenCV圖像處理與分析的問(wèn)題


評(píng)論