OpenCV 查找轮廓
2024-09-02 19:03:41
本文将结合实例代码,介绍 OpenCV 如何查找轮廓、获取边界框。
- 代码: contours.py
OpenCV 提供了 findContours 函数查找轮廓,需要以二值化图像作为输入、并指定些选项调用即可。
我们以下图作为示例:
二值化图像
代码工程 data/
提供了小狗和红球的二值化掩膜图像:
其使用预训练好的实例分割模型来生成的,脚本可见 detectron2_seg_threshold.py。模型检出结果,如下:
模型用的 Mask R-CNN 已有预测边框。但其他模型会有只出预测掩膜的,此时想要边框就可以使用 OpenCV 来提取。
本文代码也提供了根据色域来获取红球掩膜的办法:
import cv2 as cv
import numpy as np
# 读取图像
img = cv.imread(args.image, cv.IMREAD_COLOR)
# HSV 阈值,获取掩膜
def _threshold_hsv(image, lower, upper):
hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV)
mask = cv.inRange(hsv, lower, upper)
result = cv.bitwise_and(image, image, mask=mask)
return result, mask
_, thres = _threshold_hsv(img, np.array([0,110,190]), np.array([7,255,255]))
# 清除小点(可选)
kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3), (1, 1))
thres = cv.morphologyEx(thres, cv.MORPH_OPEN, kernel)
查找轮廓
# 查找轮廓
# cv.RETR_EXTERNAL: 只查找外部轮廓
contours, hierarchy = cv.findContours(
threshold, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
# 近似轮廓,减点(可选)
contours_poly = [cv.approxPolyDP(c, 3, True) for c in contours]
# 绘制轮廓
h, w = threshold.shape[:2]
drawing = np.zeros((h, w, 3), dtype=np.uint8)
for i in range(len(contours)):
cv.drawContours(drawing, contours_poly, i, (0, 255, 0), 1, cv.LINE_8, hierarchy)
获取边界框
boundingRect
获取边界框,并绘制:
for contour in contours_poly:
rect = cv.boundingRect(contour)
cv.rectangle(drawing,
(int(rect[0]), int(rect[1])),
(int(rect[0]+rect[2]), int(rect[1]+rect[3])),
(0, 255, 0), 2, cv.LINE_8)
minEnclosingCircle
获取边界圈,并绘制:
for contour in contours_poly:
center, radius = cv.minEnclosingCircle(contour)
cv.circle(drawing, (int(center[0]), int(center[1])), int(radius),
(0, 255, 0), 2, cv.LINE_8)
参考
GoCoding 个人实践的经验分享,可关注公众号!
最新文章
- ReSharper.8.0.14.856注册码
- 。。。IO流学习之二。。。
- java 多态2
- LeetCode题解-----Median of Two Sorted Arrays
- 项目管理利器——Maven
- Hdu 5444 Elven Postman dfs
- 我的Photoshop第一个作品
- MFC——error LNK2005: ";protected: static struct AFX_MSGMAP
- EEPlat 的数据层模式
- SQL使用单引号
- 网易云课堂_程序设计入门-C语言_第二周:判断_1时间换算
- 消息队列NetMQ 原理分析1-Context和ZObject
- byte数组与int,long,short,byte转换 (转载)
- Mvc分页组件MvcSimplePager代码重构及使用
- WebForm 生成并显示二维码
- 查看eclipse ADT SDK JDK版本号
- mysql数据库 ,java 代码巧妙结合提升系统性能。
- PHP事件机制
- day_2安装Python解释器和pycharm
- netsh 转发 5000 端口到 80端口的命令和删除方法
热门文章
- 探索使用 Golang 和 Webassembly 构建一个多人游戏服务器
- C++ 2.0新特性
- PHP生成随机数的几种方法
- 数据链路层协议(Ethernet、IEEE802.3、PPP、HDLC)
- Windows PE 第一章 熟悉OD(顺便破解一个小工具)
- Swift系列三 - 函数
- PhpStorm 配置本地文件自动上传至服务器
- python三元(三目)运算
- 腾讯云原生混合云-第三方集群弹EKS应对突发流量的利器
- 通过Dapr实现一个简单的基于.net的微服务电商系统(十三)——istio+dapr构建多运行时服务网格之生产环境部署