本文将结合实例代码,介绍 OpenCV 如何查找轮廓、获取边界框。

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 个人实践的经验分享,可关注公众号!

最新文章

  1. ReSharper.8.0.14.856注册码
  2. 。。。IO流学习之二。。。
  3. java 多态2
  4. LeetCode题解-----Median of Two Sorted Arrays
  5. 项目管理利器——Maven
  6. Hdu 5444 Elven Postman dfs
  7. 我的Photoshop第一个作品
  8. MFC——error LNK2005: "protected: static struct AFX_MSGMAP
  9. EEPlat 的数据层模式
  10. SQL使用单引号
  11. 网易云课堂_程序设计入门-C语言_第二周:判断_1时间换算
  12. 消息队列NetMQ 原理分析1-Context和ZObject
  13. byte数组与int,long,short,byte转换 (转载)
  14. Mvc分页组件MvcSimplePager代码重构及使用
  15. WebForm 生成并显示二维码
  16. 查看eclipse ADT SDK JDK版本号
  17. mysql数据库 ,java 代码巧妙结合提升系统性能。
  18. PHP事件机制
  19. day_2安装Python解释器和pycharm
  20. netsh 转发 5000 端口到 80端口的命令和删除方法

热门文章

  1. 探索使用 Golang 和 Webassembly 构建一个多人游戏服务器
  2. C++ 2.0新特性
  3. PHP生成随机数的几种方法
  4. 数据链路层协议(Ethernet、IEEE802.3、PPP、HDLC)
  5. Windows PE 第一章 熟悉OD(顺便破解一个小工具)
  6. Swift系列三 - 函数
  7. PhpStorm 配置本地文件自动上传至服务器
  8. python三元(三目)运算
  9. 腾讯云原生混合云-第三方集群弹EKS应对突发流量的利器
  10. 通过Dapr实现一个简单的基于.net的微服务电商系统(十三)——istio+dapr构建多运行时服务网格之生产环境部署