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的Django框架中显示对象子集的方法
Jul 21 Python
在PyCharm环境中使用Jupyter Notebook的两种方法总结
May 24 Python
pandas 把数据写入txt文件每行固定写入一定数量的值方法
Dec 28 Python
python使用Paramiko模块实现远程文件拷贝
Apr 30 Python
python 计算数据偏差和峰度的方法
Jun 29 Python
使用Python和Scribus创建一个RGB立方体的方法
Jul 17 Python
seek引发的python文件读写的问题及解决
Jul 26 Python
Pycharm最新激活码2019(推荐)
Dec 31 Python
在Python中使用K-Means聚类和PCA主成分分析进行图像压缩
Apr 10 Python
基于Python快速处理PDF表格数据
Jun 03 Python
如何用python反转图片,视频
Apr 24 Python
Python如何加载模型并查看网络
Jul 15 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中isset()和unset()函数的用法小结
2014/03/11 PHP
php浏览历史记录的方法
2015/03/10 PHP
PHP简单检测网址是否能够正常打开的方法
2016/09/04 PHP
php版微信小店调用api示例代码
2016/11/12 PHP
php使用gd2绘制基本图形示例(直线、圆、正方形)
2017/02/15 PHP
浅谈PHP面向对象之访问者模式+组合模式
2017/05/22 PHP
PHP示例演示发送邮件给某个邮箱
2019/04/03 PHP
PHP基于进程控制函数实现多线程
2020/12/09 PHP
基于JQuery的Pager分页器实现代码
2010/07/17 Javascript
js与jquery获取父级元素,子级元素,兄弟元素的实现方法
2014/01/09 Javascript
js实现简单的购物车有图有代码
2014/05/26 Javascript
JavaScript indexOf方法入门实例(计算指定字符在字符串中首次出现的位置)
2014/10/17 Javascript
JS实现的论坛Ajax打分效果完整实例
2015/10/31 Javascript
js中获取键盘事件的简单实现方法
2016/10/10 Javascript
JavaScript数据结构之链表的实现
2017/03/19 Javascript
vue构建单页面应用实战
2017/04/10 Javascript
webpack配置sass模块的加载的方法
2017/07/30 Javascript
对angularJs中ng-style动态改变样式的实例讲解
2018/09/30 Javascript
NodeJS服务器实现gzip压缩的示例代码
2018/10/12 NodeJs
Nuxt v-bind绑定img src不显示的解决
2019/12/05 Javascript
详解vue-template-admin三级路由无法缓存的解决方案
2020/03/10 Javascript
vue设置默认首页的操作
2020/08/12 Javascript
python自动翻译实现方法
2016/05/28 Python
Python3实现爬取简书首页文章标题和文章链接的方法【测试可用】
2018/12/11 Python
用python写一个带有gui界面的密码生成器
2020/11/06 Python
荷兰牛仔裤网上商店:Jeans Centre
2018/04/03 全球购物
DOUGLAS波兰:在线销售香水和化妆品
2020/07/05 全球购物
Prototype如何为一个Ajax添加一个参数
2015/12/06 面试题
《一株紫丁香》教学反思
2014/02/19 职场文书
小学生爱国演讲稿
2014/04/25 职场文书
学习焦裕禄精神践行三严三实心得体会
2014/10/13 职场文书
2015年社区教育工作总结
2015/05/13 职场文书
初中化学教学反思
2016/02/22 职场文书
原生JS实现飞机大战小游戏
2021/06/09 Javascript
仅用几行Python代码就能复制她的U盘文件?
2021/06/26 Python
Oracle以逗号分隔的字符串拆分为多行数据实例详解
2021/07/16 Oracle