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< w: 16 max = w 17 index = cnt 18cv.drawContours(mask, contours, index, (255), -1, 8) 19 20cv.imshow("vline", vline) 21contours, hireachy = cv.findContours(vline, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE) 22max = -1 23index = 0 24for cnt in range(len(contours)): 25 x, y, w, h = cv.boundingRect(contours[cnt]) 26 if max < h and x < int(gray.shape[1]*0.75): 27 max = h 28 index = cnt 29 30cv.drawContours(mask, contours, index, (255), -1, 8) 31cv.imshow("mask", mask) 32 33se3 = cv.getStructuringElement(cv.MORPH_CROSS, (13, 13)) 34mask = cv.morphologyEx(mask, cv.MORPH_OPEN, se3) 35cv.imshow("corss", mask) 36contours, hireachy = cv.findContours(mask, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE) 37for cnt in range(len(contours)): 38 x, y, w, h = cv.boundingRect(contours[cnt]) 39 print(x, y, w, h) 40 cx = (x + w//2) 41 cy = (y + h//2) 42 cv.circle(image, (cx, cy), 4, (0, 0, 255), 4, 8, 0) 43cv.imshow("result", image) 44cv.imwrite("D:/find_cross.png", image) 45cv.waitKey(0) 46cv.destroyAllWindows()
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])
9ifarea< 50:
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
+关注
关注
33文章
652浏览量
45090 -
图像分析
+关注
关注
0文章
82浏览量
19254
原文标题:OpenCV二值图像分析之寻找缺失与靶心
文章出处:【微信号:CVSCHOOL,微信公众号:OpenCV学堂】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
热点推荐
两个RS485-Modbus主站如何通讯
本产品能很好解决Master-1主站向模块写入数据,Master-2主站读取数据;Master-2主站向模块写入数据,Master-1主站读取数据。由此解决两个主站之间的互相读通信难题。
发表于 02-08 15:32
•0次下载
没有专利的opencv-python 版本
3.4.x 无专利版)
如果因代码兼容性需使用 3.4.x 系列,且要无专利风险,需满足两个条件:
降级 Python 到 3.9 及以下(3.4.x 最高支持 Python 3.9);
仅安装核心
发表于 12-13 12:37
那些年我用OpenCV+Qt趟过哪些坑?写给视觉应用开发者的避坑指南
最典型的几个场景做成了深度实战案例,每个案例都贯穿了前两个阶段的所有知识点:
12. 案例:嵌入式人脸识别门禁系统 (涉及模型集成、实时视频处理、界面交互)
13. 案例:YOLOv8健身动作计数
发表于 12-02 09:43
机器视觉双雄YOLO 和 OpenCV 到底有啥区别?别再傻傻分不清!
很多人一听到 “YOLO”和“OpenCV” ,总以为它们是同一种东西。其实, 一个是AI算法,一个是视觉工具库;一个会“识别”,一个会“
一个硬件SPI两个CS操作两个norflash,怎么互斥操作两个norflash?
一个硬件SPI两个CS操作两个norflash,怎么互斥操作两个norflash,有一个norflash被模拟成U盘,会在中断中操作spi。
发表于 09-26 06:18
基本半导体连获两个行业奖项
近日,基本半导体凭借在碳化硅模块领域的突出表现,连获“国产SiC模块TOP企业奖”和“年度优秀功率器件产品奖”两个行业奖项。
【GM-3568JHF开发板免费体验】OpenCV开发环境安装和计数程序开发
查看ip
SSH链接
远程登录账号和密码是linaro
二、安装Pip管理工具
Sudo apt-get install python3-pip
三、安装cv2环境
cv2支持图像处理(如滤波、边缘
发表于 08-09 13:30
看到STM8L152用两个IO用两个或非门检测两个通断,是什么原理呢?
图中两个按键开关是两个干簧管,为什么不直接对GND设计来检测这个干簧管通断呢?
这样设计的原理是什么?
发表于 06-12 06:25
itop-3568开发板机器视觉opencv开发手册-图像绘制-画线
demo11_line.py
然后向该文件中添加以下内容:
第 1 行和第 2 行分别导入了 opencv 和 numpy 库;
第 3 行使用 zeros()函数创建一个 512x512 的黑色图片;
第 4 行使
发表于 06-04 10:38
ADAU1787四个ADC、两个DAC、带音频DSP的低功耗编解码器技术手册
ADAU1787 是一款具有四个输入和两个输出的编解码器,其中整合了两个数字信号处理器 (DSP)。从模拟输入到 DSP 内核再到模拟输出的路径已针对低延迟进行优化,适用于噪声消除耳机
基于LockAI视觉识别模块:C++使用图像的统计信息
在图像处理中,统计信息可以帮助我们了解图像的特性,例如区域内的像素分布、颜色转换以及特定区域的分析。本文将介绍基于LockAI视觉识别模块如何提取兴趣区域(ROI)、转换颜色通道、计算
发表于 05-08 10:31
基于LockAI视觉识别模块:C++图像的基本运算
在图像处理中,理解图像的基本操作是掌握计算机视觉技术的关键。本文章将介绍 基于LockAI视觉识别模块下OpenCV 中图像的基本运算方法,
发表于 05-06 16:56
分享两个OpenCV图像处理与分析的问题
评论