0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

分享两个OpenCV图像处理与分析的问题

OpenCV学堂 来源:OpenCV学堂 作者:gloomyfish 2022-08-22 09:40 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

01

问题一:寻找靶心

cc1f6f48-2156-11ed-ba43-dac502259ad0.jpg

图一

02

问题二:寻找其中的缺失点

cc2b1a50-2156-11ed-ba43-dac502259ad0.png

图二

解决方法

01

寻找靶心

仔细观察图一,可以看到两个最直接的是靶心有十字交叉线,而在OpenCV形态学处理中,支持十字交叉结构元素,所以我们可以先检测两条线,然后获取十字交叉结构,最后对结构进行轮廓分析,获取中心点,即可获得最终的靶心位置,最终寻找到的靶心位置图示如下:

cc50fc02-2156-11ed-ba43-dac502259ad0.png

获取水平与垂直线如下:

cc64914a-2156-11ed-ba43-dac502259ad0.png

获取十字交叉线如下:

cc734aaa-2156-11ed-ba43-dac502259ad0.png

代码实现如下:

 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表示边界,根据间隔距离设置阈值查找缺失,最终运行结果如下:

cc81afd2-2156-11ed-ba43-dac502259ad0.png

从原图得到的标记图如下:

cca33f62-2156-11ed-ba43-dac502259ad0.png

代码实现如下:

 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

    文章

    651

    浏览量

    44412
  • 图像分析
    +关注

    关注

    0

    文章

    82

    浏览量

    19150

原文标题:OpenCV二值图像分析之寻找缺失与靶心

文章出处:【微信号:CVSCHOOL,微信公众号:OpenCV学堂】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    机器视觉双雄YOLO 和 OpenCV 到底有啥区别?别再傻傻分不清!

    很多人一听到 “YOLO”和“OpenCV” ,总以为它们是同一种东西。其实, 一是AI算法,一是视觉工具库;一会“识别”,一会“
    的头像 发表于 10-14 16:00 536次阅读
    机器视觉双雄YOLO 和 <b class='flag-5'>OpenCV</b> 到底有啥区别?别再傻傻分不清!

    硬件SPI两个CS操作两个norflash,怎么互斥操作两个norflash?

    硬件SPI两个CS操作两个norflash,怎么互斥操作两个norflash,有一norflash被模拟成U盘,会在中断中操作spi。
    发表于 09-26 06:18

    基本半导体连获两个行业奖项

    近日,基本半导体凭借在碳化硅模块领域的突出表现,连获“国产SiC模块TOP企业奖”和“年度优秀功率器件产品奖”两个行业奖项。
    的头像 发表于 09-05 16:31 886次阅读

    【GM-3568JHF开发板免费体验】OpenCV开发环境安装和计数程序开发

    查看ip SSH链接 远程登录账号和密码是linaro 二、安装Pip管理工具 Sudo apt-get install python3-pip 三、安装cv2环境 cv2支持图像处理(如滤波、边缘
    发表于 08-09 13:30

    基于LockAI视觉识别模块:C++使用图像的统计信息

    图像处理中,统计信息可以帮助我们了解图像的特性,例如区域内的像素分布、颜色转换以及特定区域的分析。本文将介绍基于LockAI视觉识别模块如何提取兴趣区域(ROI)、转换颜色通道、计算
    发表于 05-08 10:31

    基于LockAI视觉识别模块:C++图像的基本运算

    图像处理中,理解图像的基本操作是掌握计算机视觉技术的关键。本文章将介绍 基于LockAI视觉识别模块下OpenCV图像的基本运算方法,
    发表于 05-06 16:56

    基于LockAI视觉识别模块:C++图像的基本运算

    图像处理中,理解图像的基本操作是掌握计算机视觉技术的关键。本文章将介绍基于LockAI视觉识别模块下OpenCV图像的基本运算方法,包括
    的头像 发表于 05-06 16:20 529次阅读
    基于LockAI视觉识别模块:C++<b class='flag-5'>图像</b>的基本运算

    DLP3310可以外部触发两个相机采集图像吗?

    请问有谁用过TI的DLP3310这款光机么?请教以下几个问题: 1.可以外部触发两个相机采集图像吗?; 2.针对1920*1080分辨率的24位图片,其投射的频率是多少?最快可以达到多少呢? 3.
    发表于 03-03 08:29

    FPGA图像处理基础----实现缓存卷积窗口

    像素行与像素窗口 一幅图像是由一个个像素点构成的,对于一幅480*272大小的图片来说,其宽度是480,高度是272。在使用FPGA进行图像处理时,最关键的就是使用FPGA内部的存储资
    的头像 发表于 02-07 10:43 1414次阅读
    FPGA<b class='flag-5'>图像</b><b class='flag-5'>处理</b>基础----实现缓存卷积窗口

    两个不同频率晶振靠的近会怎样

    晶振的振荡本质上是一种机械振动(在压电晶体层面)。当两个晶振靠得很近时,它们的机械振动可能会相互影响。一晶振的振动可能会通过电路板或者外壳等介质传递给另一晶振,从而改变另一晶振的
    的头像 发表于 01-20 13:55 2018次阅读
    <b class='flag-5'>两个</b>不同频率晶振靠的近会怎样

    如何把两个数据返回给调用函数

    函数的处理结果包含两个数据,如何把两个数据返回给调用函数? 第一种,把两个数据封装成一结构体,函数返回结构体。 调用函数的地方同样用结构体
    的头像 发表于 01-08 10:15 678次阅读

    EE-98:使用外部总线仲裁将两个以上的ADSP-21065L组合到一处理集群中

    电子发烧友网站提供《EE-98:使用外部总线仲裁将两个以上的ADSP-21065L组合到一处理集群中.pdf》资料免费下载
    发表于 01-05 09:38 0次下载
    EE-98:使用外部总线仲裁将<b class='flag-5'>两个</b>以上的ADSP-21065L组合到一<b class='flag-5'>个</b>多<b class='flag-5'>处理</b>集群中

    使用TVP7002现在遇到两个问题求解答

    我们使用TVP7002现在遇到两个问题(VGA转YCbCr 4:2:2,embedded sync, 参考外部27MHz时钟) 1 输入信号1080P的情况下,有些电脑输出的1080P图像很正常
    发表于 01-01 07:41

    AI模型部署边缘设备的奇妙之旅:如何在边缘端部署OpenCV

    视觉领域最有力的研究工具。在深度学习中,我们会经常接触到两个名称,图像处理和计算机视觉,它们之间有什么区别呢? 图像处理 (Image Pr
    发表于 12-14 09:31

    AI模型部署边缘设备的奇妙之旅:如何在边缘端部署OpenCV

    力的研究工具。在深度学习中,我们会经常接触到两个名称,图像处理和计算机视觉,它们之间有什么区别呢?图像处理(ImageProcessing)
    的头像 发表于 12-14 09:10 1262次阅读
    AI模型部署边缘设备的奇妙之旅:如何在边缘端部署<b class='flag-5'>OpenCV</b>