Python中OpenCV实现查找轮廓的实例


Posted in Python onJune 08, 2021

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

代码: contours.py

OpenCV 提供了 findContours 函数查找轮廓,需要以二值化图像作为输入、并指定些选项调用即可。

Python中OpenCV实现查找轮廓的实例

我们以下图作为示例:

Python中OpenCV实现查找轮廓的实例

二值化图像

代码工程 data/ 提供了小狗和红球的二值化掩膜图像:

Python中OpenCV实现查找轮廓的实例

Python中OpenCV实现查找轮廓的实例

其使用预训练好的实例分割模型来生成的,脚本可见 detectron2_seg_threshold.py。模型检出结果,如下:

Python中OpenCV实现查找轮廓的实例

模型用的 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)

Python中OpenCV实现查找轮廓的实例

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)

Python中OpenCV实现查找轮廓的实例

参考

OpenCV Tutorials / Image Processing

到此这篇关于OpenCV实现查找轮廓的实例的文章就介绍到这了,更多相关OpenCV 查找轮廓内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
二种python发送邮件实例讲解(python发邮件附件可以使用email模块实现)
Dec 03 Python
Python基于scrapy采集数据时使用代理服务器的方法
Apr 16 Python
理解Python中函数的参数
Apr 27 Python
举例讲解如何在Python编程中进行迭代和遍历
Jan 19 Python
Python中函数及默认参数的定义与调用操作实例分析
Jul 25 Python
Django添加sitemap的方法示例
Aug 06 Python
Python实现将数据写入netCDF4中的方法示例
Aug 30 Python
Python 带有参数的装饰器实例代码详解
Dec 06 Python
Django实现跨域请求过程详解
Jul 25 Python
Python3 使用pillow库生成随机验证码
Aug 26 Python
pygame实现成语填空游戏
Oct 29 Python
详解使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
Apr 01 Python
python字符串的多行输出的实例详解
Jun 08 #Python
Python机器学习之基于Pytorch实现猫狗分类
Python中json.load()和json.loads()有哪些区别
python 爬取哔哩哔哩up主信息和投稿视频
Jun 07 #Python
OpenCV-Python直方图均衡化实现图像去雾
OpenCV-Python实现人脸磨皮算法
Python实现拼音转换
You might like
php防止sql注入代码实例
2013/12/18 PHP
php版本的cron定时任务执行器使用实例
2014/08/19 PHP
php防止站外远程提交表单的方法
2014/10/20 PHP
PHP框架Laravel中使用UUID实现数据分表操作示例
2018/05/30 PHP
php快速导入大量数据的实例方法
2019/09/23 PHP
BOOM vs RR BO3 第二场2.13
2021/03/10 DOTA
JSON 学习之完全手册 图文
2007/05/29 Javascript
ASP.NET jQuery 实例17 通过使用jQuery validation插件校验ListBox
2012/02/03 Javascript
JQuery筛选器全系列介绍
2013/08/27 Javascript
使用upstart把nodejs应用封装为系统服务实例
2014/06/01 NodeJs
ZeroClipboard插件实现多浏览器复制功能(支持firefox、chrome、ie6)
2014/08/30 Javascript
jQuery使用removeClass方法删除元素指定Class的方法
2015/03/26 Javascript
使用AngularJS来实现HTML页面嵌套的方法
2015/06/17 Javascript
JavaScript实现数据类型的相互转换
2016/03/06 Javascript
Vue.js每天必学之过渡与动画
2016/09/06 Javascript
Zabbix添加Node.js监控的方法
2016/10/20 Javascript
js时间戳格式化成日期格式的多种方法介绍
2017/02/16 Javascript
基于vue2.0+vuex的日期选择组件功能实现
2017/03/13 Javascript
强大的 Angular 表单验证功能详细介绍
2017/05/23 Javascript
基于vue实现可搜索下拉框定制组件
2020/03/26 Javascript
vue中vee validate表单校验的几种基本使用
2018/06/25 Javascript
jQuery利用cookie 实现本地收藏功能(不重复无需多次命名)
2019/11/07 jQuery
JS 创建对象的模式实例小结
2020/04/28 Javascript
nodeJS与MySQL实现分页数据以及倒序数据
2020/06/05 NodeJs
[00:27]DOTA2战队VP、Secret贺新春
2018/02/11 DOTA
Linux下使用python调用top命令获得CPU利用率
2015/03/10 Python
解决pycharm无法识别本地site-packages的问题
2018/10/13 Python
python 日志模块 日志等级设置失效的解决方案
2020/05/26 Python
Python爬虫模拟登陆哔哩哔哩(bilibili)并突破点选验证码功能
2020/12/21 Python
巴西备受欢迎的服装和生活方式品牌:FARM Rio
2020/02/04 全球购物
一套带网友答案的.NET笔试题
2016/12/06 面试题
Java如何读取CLOB字段
2013/10/10 面试题
服装设计行业个人的自我评价
2013/12/20 职场文书
车间组长岗位职责
2013/12/20 职场文书
邀请函样本
2015/02/02 职场文书
Nginx利用Logrotate实现日志分割
2022/05/20 Servers