基于Python的OpenCV轮廓检测聚类

news/2024/7/3 0:54:57

点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

简介

OpenCV的“findContours”功能经常被计算机视觉工程师用来检测物体。OpenCV的存在,使得我们只需要编写几行代码就可以检测轮廓(对象)。然而,OpenCV检测到的轮廓通常是分散的。例如,一个功能丰富的图像可能有数百到数千个轮廓,但这并不意味着图像中有那么多对象。一些属于同一对象的轮廓是单独检测的,因此我们感兴趣的是对它们进行分组,使一个轮廓对应一个对象。

实现思路

当我在项目中遇到这个问题时,我花了很多时间尝试使用不同的参数或不同的OpenCV函数来检测轮廓,但没有一个有效。然后,我做了更多的研究,在OpenCV的论坛上找到了一篇帖子,它提到了凝聚聚类。但是,没有给出源代码。我还发现sklearn支持聚合聚类,但我没有使用它,原因有两个:

  1. 这个功能对我来说似乎很复杂。我不知道如何输入正确的参数,我怀疑轮廓检测的数据类型是否适合该函数。

  2. 我需要使用python 2.7、OpenCV 3.3.1和Numpy 1.11.3。它们与sklearn的版本(0.20+)不兼容,后者支持聚类。

源代码

为了分享我编写的函数,我在Github中对其进行了开源,并将其作为要点发布在下面。以下版本适用于Python3,若需要要在Python2.7中使用它,只需将“range”更改为“xrange”。

#!/usr/bin/env python3import os
import cv2
import numpydef calculate_contour_distance(contour1, contour2): x1, y1, w1, h1 = cv2.boundingRect(contour1)c_x1 = x1 + w1/2c_y1 = y1 + h1/2x2, y2, w2, h2 = cv2.boundingRect(contour2)c_x2 = x2 + w2/2c_y2 = y2 + h2/2return max(abs(c_x1 - c_x2) - (w1 + w2)/2, abs(c_y1 - c_y2) - (h1 + h2)/2)def merge_contours(contour1, contour2):return numpy.concatenate((contour1, contour2), axis=0)def agglomerative_cluster(contours, threshold_distance=40.0):current_contours = contourswhile len(current_contours) > 1:min_distance = Nonemin_coordinate = Nonefor x in range(len(current_contours)-1):for y in range(x+1, len(current_contours)):distance = calculate_contour_distance(current_contours[x], current_contours[y])if min_distance is None:min_distance = distancemin_coordinate = (x, y)elif distance < min_distance:min_distance = distancemin_coordinate = (x, y)if min_distance < threshold_distance:index1, index2 = min_coordinatecurrent_contours[index1] = merge_contours(current_contours[index1], current_contours[index2])del current_contours[index2]else: breakreturn current_contours

注意:

  • “calculate_contour_distance”函数获取轮廓的边界框,并计算两个矩形之间的距离。

  • “merge_contours”函数,我们只需使用'numpy.concatenate'即可,因为每个轮廓只是一个点的numpy数组。

  • 使用聚类算法,我们不需要事先知道有多少个聚类。相反,可以向函数提供阈值距离,例如40个像素,因此如果所有轮廓中最近的距离大于阈值,则函数将停止处理。

结果

要可视化集群效果,请参见下面的两幅图像。第一幅图像显示最初检测到12个轮廓,聚类后只剩下4个轮廓,如第二幅图像所示。这两个小对象是由于噪声造成的,它们没有合并,因为与阈值距离相比,它们离太远。

2e30f17f23ef8f29dc760c93dec6e283.png

eafa9e47c1f4976f3e320f282b967042.png

GITHUB代码链接:

https://github.com/CullenSUN/fish_vision/blob/master/obstacle_detector_node/src/opencv_utils.py

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

dd22ec70d8f0b42b75120992d0c8d2ad.png

c42a54977b0de3b1d139cec5fe4ac3e9.png


http://lihuaxi.xjx100.cn/news/270355.html

相关文章

为了杀蚊子,这位博士用树莓派DIY了一把激光枪!网友:伤到人怎么办?

点击上方“视学算法”&#xff0c;选择加"星标"或“置顶”重磅干货&#xff0c;第一时间送达来源&#xff1a;学术头条本文约1057字&#xff0c;建议阅读3分钟。本文介绍了国外博士用树莓派DIY了“高端”灭蚊激光枪。世人苦蚊子久矣。尤其在夏夜&#xff0c;耳边嗡嗡…

变换判断滤波器类型_7.4 低通IIR滤波器的频率变换

本文将会介绍&#xff0c;怎样将一个离散型低通滤波器转换为其他的选频滤波器。设计连续时间选频滤波器的传统方法都是首先设计一个频率归一化的原型低通滤波器&#xff0c;然后用一个袋鼠变换&#xff0c;从原型低通滤波器推出期望的滤波器。一般在设计离散时间选频滤波器的时…

BCH专属“谷歌地图”凸显BCH魅力

2019独角兽企业重金招聘Python工程师标准>>> 在我们的日常生活中&#xff0c;地图作为一种工具给我们带来了很多便利。尤其是类似于谷歌地图、百度地图这些电子地图不仅仅有地图的功能&#xff0c;能为我们提供路线导航&#xff0c;更是综合了很多功能&#xff0c;例…

黑科技:绕过眼睛植入幻觉,科学家成功在盲人脑海中呈现指定图像!

来源 | 学术头条&#xff08;ID:SciTouTiao&#xff09;头图 | CSDN付费下载自视觉中国对于全球 5000 多万盲人来说&#xff0c;重见光明是一个遥不可及的梦想。而为了与盲人朋友进行交互&#xff0c;我们发明了盲文&#xff0c;用各种凸起的字符集合来表达各种意思。但这种通过…

NoSQl分类

2019独角兽企业重金招聘Python工程师标准>>> http://nosql-database.org/ nosql简单分类 类型 部分代表 特点 列存储 hbase cassandra hypertable 顾名思义&#xff0c;是按列存储数据的。最大的特点是方便存储结构化和半结构化数据&#xff0c;方便做数据压缩&…

Python环境的安装(Anaconda+Jupyter notebook+Pycharm)

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶”重磅干货&#xff0c;第一时间送达本文总结了Windows下Python环境的安装&#xff0c;包括Anaconda、Jupyter notebook和Pycharm的安装和基本使用技巧&#xff0c;方便初学者搭建Python环境。一、Anaconda1.…

面试官:来说说单点登录的三种实现方式

点击上方蓝色“方志朋”&#xff0c;选择“设为星标”回复“666”获取独家整理的学习资料&#xff01;来源&#xff1a;cnblogs.com/yonghengzh/p/13712729.html前言在 B/S 系统中&#xff0c;登录功能通常都是基于 Cookie 来实现的。当用户登录成功后&#xff0c;一般会将登录…

CSS3关于过渡效果的问题

首先trasition:transform只是单单表示后面只要有含有的tranform的所有属性可以参与动画&#xff0c;而trasition:all表示后面所有动画属性都可以参动画&#xff0c;当父容器有relative时&#xff0c;子容器有absolute&#xff0c;子容器会跟着父容器相对定位。当你想要然后一个…