首页/新闻资讯/正文详情

基于Python的OpenCV轮廓检测聚类

发布时间:2026/9/26 4:17:29 来源:云帆数科 栏目:资讯中心
基于Python的OpenCV轮廓检测聚类
简介在计算机视觉领域, 工程师们经常会用到某些特定的“”功能”。因为这些功能的存在, 大家只需编写寥寥几行代码, 就能够检测出轮廓或者对应的对象。不过, 需要注意的是, 通过这种方法检测出来的轮廓, 往往呈现出一种分散的状态。举例来说, 一张内容丰富且包含较多细节的图片, 可能会生成成百上千个轮廓, 但千万不要以为这意味着图片里真的存在那么多独立的对象。有些情况下, 同一个对象会对应多个独立的轮廓线, 所以我们想做的, 就是把这些零散的轮廓给凑到一块儿去。这么一处理呢就能使得一个单独的轮廓, 刚好就代表着那一个对象了。实现思路当我的项目中碰到了这个麻烦的时候, 我花了不少功夫去试着用别的参数或者换其他的函数来看能不能找出轮廓线出来, 可惜试了一遍又一个, 没有一个是管用的。后来, 我又做了不少调查研究工作, 最终在那一个叫的那个论坛上, 还真就让我看到了一篇帖子, 里面说到了什么叫做凝聚聚类这么一回事。不过, 这篇帖子上面并没有把源代码给贴出来供人参考。我也确实还发现了好像有个地方是支持那个聚合聚类的算法的, 但是我最后决定还是别去用它了, 原因有两个方面需要考虑进去嘛:就我个人的感觉而言, 这个功能实际上显得有些过于复杂了。我根本不清楚该如何去输入那些正确的参数, 同时我也一直在怀疑, 关于轮廓检测所得出的数据类型, 到底是不是能够直接适配到这样一个函数里面去使用的状态之中。在具体的版本要求方面, 我必须得要去使用版本号是2.7的那个系统, 还需要用到版本号是3.3.1的某种环境支持, 另外也得把Numpy的库升级到1.11.3这个特定的版本才行。可是目前这种状况下, 它跟我们现有的版本也就是0.20之间完全是对不兼容的, 因为后面提到的那个更高版本的软件环境, 恰恰才是真正能够支持聚类算法运作的那一个版本选项。源代码为了向大家分享我自己编写的这个函数, 我将它进行了开源操作。同时, 我会把相关内容作为要点发布在下面部分。这个特定的版本是用来适配某个环境的。如果你需要在“.7”这个环境当中使用它的话, 那么你只需要进行一个简单的替换动作就可以搞定了。具体来说, 就是要把代码里的“range”这个词给更换掉, 把它替换成空白的内容, 或者说替换为对应的占位符。#!/usr/bin/env python3import osimport cv2import 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), axis0)def agglomerative_cluster(contours, threshold_distance40.0):current_contours contourswhile len(current_contours) 1:min_distance Nonemin_coordinate Nonefor x in range(len(current_contours)-1):for y in range(x1, 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注意结果如果想要查看集群处理之后的效果, 那么请看下面提供的这两幅图像。第一张图片展示的是在最开始的时候, 一共检测出了12个轮廓。而在进行了聚类操作之后, 这些轮廓的数量就减少了, 具体只剩下4个轮廓了, 这一点可以从第二张图像中看出来。在这两幅图对应的场景中, 其中有两个很小的物体, 它们是因为受到噪声干扰才出现的。这两个小物体并没有与其他的物体合并到一起, 造成这种现象的原因是它们之间的距离太远了, 相比之下, 这个距离是超过了预设的阈值距离的。

相关推荐

Work Agent长程任务深度解读:AI从问答到自主执行的技术跃迁
Work Agent长程任务深度解读:AI从问答到自主执行的技术跃迁

AI的交互范式正在发生持续转变。早期大模型以单轮问答作为核心形态,用户提出问题,模型给出一次性文本输出,对话上下文仅短暂留存,无法自主拆分复杂诉求。随后多轮对话拓展了上下文承载能力,可以在一段对话内持续补充信… · 2026/9/26 4:17:29

STM32F103 + FreeRTOS 串口控制项目:从踩坑到重构的完整调试记录
STM32F103 + FreeRTOS 串口控制项目:从踩坑到重构的完整调试记录

STM32F103 FreeRTOS 串口控制项目:从踩坑到重构的完整调试记录 前言 最近做了一个基于 STM32F103C8T6 和 FreeRTOS 的串口控制小项目。本来以为就是"串口收个字符、翻个 GPIO"的简单事,结果前后踩了好几个坑——从 CMSIS-RTOS 版本混用&#… · 2026/9/26 4:17:29

Fiddler绿色中文版v5.0:免安装HTTPS抓包与弱网模拟实战指南
Fiddler绿色中文版v5.0:免安装HTTPS抓包与弱网模拟实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 4:17:23

如何注册文件预览器:DSH-better-sidebar的FileViewer API完整参考(匹配算法/取数策略/真实案例)
如何注册文件预览器:DSH-better-sidebar的FileViewer API完整参考(匹配算法/取数策略/真实案例)

如何注册文件预览器:DSH-better-sidebar的FileViewer API完整参考(匹配算法/取数策略/真实案例) 【免费下载链接】DSH-better-sidebar 开放的侧边栏底座,支持三方拓展注册新侧边栏页面。内置文件渲染编辑/终端/侧边对话/Git/子代理… · 2026/9/26 5:05:01

SpringBoot+Vue+MySQL语言考试报名系统毕业设计全攻略
SpringBoot+Vue+MySQL语言考试报名系统毕业设计全攻略

很多同学拿到“语言考试报名系统”这个毕业设计题目时,第一反应是“不就是增删改查吗”,但真做起来会发现,里面藏着一整套围绕“报名状态”的业务逻辑:考生注册、考试计划发布、资格校验、名额限制、审核流转、准考证生成、成绩查… · 2026/9/26 5:05:01

【67GHz射频开关大比拼】
【67GHz射频开关大比拼】

67GHz射频开关大比拼 本文根据Keysight, 思仪,Radiall公开的产品手册,对Keysight U7106F, 思仪80103L和Radiall的R574J02605进行了对比。分别是隔离度VS频率、插损VS频率、和驻波VS频率。 数据来源: 1) Keysight U7106F&#xff0… · 2026/9/26 5:05:01

Docker核心概念拆解:镜像分层、网络排障与数据持久化实战
Docker核心概念拆解:镜像分层、网络排障与数据持久化实战

Docker 核心概念这东西,我一开始是吃了亏才愿意回炉重造的。当时接手一个项目,要把跑着的 MySQL 容器整个搬到新机器,图省事直接docker commit打了个“备份镜像”,结果拖过去启动之后账户全乱、数据时好时坏,最后花了整… · 2026/9/26 5:05:01

卡巴斯基免费版无需激活码:核心功能与安装配置指南
卡巴斯基免费版无需激活码:核心功能与安装配置指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 5:04:55

Spring Boot酒店在线预订系统:订单状态机与并发控制实战
Spring Boot酒店在线预订系统:订单状态机与并发控制实战

临近毕业季,总有人拿“基于Spring Boot的酒店在线预订系统的设计与实现”这个毕设题目来找我看代码。这个选题确实讨巧:Spring Boot是Java方向使用率最高的框架之一,酒店预订又有清晰的CRUD、订单、支付等业务场景,做完后不管是录… · 2026/9/26 5:04:55

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21

OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40

向下兼容与向上兼容:接口设计中的兼容性策略与工程实践
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践

一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码