OpenCV半小时掌握基本操作之图像轮廓
作者:我是小白呀 发布时间:2022-08-22 12:43:13
【OpenCV】⚠️高手勿入! 半小时学会基本操作 ⚠️ 图像轮廓
概述
OpenCV 是一个跨平台的计算机视觉库, 支持多语言, 功能强大. 今天小白就带大家一起携手走进 OpenCV 的世界.
图像轮廓
cv2.findContours
可以帮助我们查找轮廓.
格式:
cv2.findContours(image, mode, method, contours=None, hierarchy=None, offset=None)
参数:
image: 需要查找轮廓的图片
mode: 模式
RETR_EXTERNAL: 只检测最外面的轮廓
RETR_LIST: 检测所有的轮廓, 并将其保存到一条链表中
RETR_CCOMP: 检索所有的轮廓, 将他们组织为两层: 顶部是各分部法外部边界, 第二层是空洞的边界
RRTR_TREE: 检索所有的轮廓, 并重构嵌套轮廓的整个层次
method: 轮廓逼近的方法
CHAIN_APPROX_NONE: 以 Freeman 链码的方式输出轮廓, 所有其他方法输出多边形 (定点的序列)
CHAIN_APPROX_SIMPLE: 压缩水平的, 垂直的和斜的部分, 只保留他们的终点部分
返回值:
contours:轮廓本身
hierarchy: 轮廓的对应编号
原图:
绘制轮廓
cv2.drawContours
可以实现轮廓绘制.
格式:
cv2.drawContours(image, contours, contourIdx, color, thickness=None, lineType=None, hierarchy=None, maxLevel=None, offset=None):
参数:
image: 需要绘制轮廓的图片
contours: 轮廓
color: 颜色
thickness: 轮廓粗细
绘制所有轮廓:
# 读取图片
img = cv2.imread("contours.jpg")
# 转换成灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 获取轮廓 (所有)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
# 绘制轮廓
draw_img = img.copy()
res = cv2.drawContours(draw_img, contours, -1, (0, 0, 255), 2)
# 图片展示
cv2.imshow("res", res)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出结果:
绘制单个轮廓:
# 读取图片
img = cv2.imread("contours.jpg")
# 转换成灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 获取轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
# 绘制轮廓 (单一)
draw_img = img.copy()
res = cv2.drawContours(draw_img, contours, 0, (0, 0, 255), 2)
# 图片展示
cv2.imshow("res", res)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出结果:
轮廓特征
# 获取轮廓
cnt = contours[0] # 取第一个轮廓
# 面积
area = cv2.contourArea(cnt)
print("轮廓面积:", area)
# 周长, True表示合并
perimeter = cv2.arcLength(cnt, True)
print("轮廓周长:", perimeter)
输出结果:
轮廓面积: 8500.5
轮廓周长: 437.9482651948929
轮廓近似
原图:
代码:
# 读取图片
img = cv2.imread("contours2.jpg")
# 转换成灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 获取轮廓
contours, hieratchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
# 绘制轮廓
draw_img = img.copy()
res = cv2.drawContours(draw_img, contours, 0, (0, 0, 255), 2)
# 图片展示
cv2.imshow("res", res)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 取外围轮廓
cnt = contours[0]
# 轮廓近似
epsilon = 0.1 * cv2.arcLength(cnt, True)
approx = cv2.approxPolyDP(cnt, epsilon, True)
# 绘制轮廓
draw_img = img.copy()
res = cv2.drawContours(draw_img, [approx], -1, (0, 0, 255), 2)
# 图片展示
cv2.imshow("res", res)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出结果:
直接绘制轮廓:
轮廓近似:
边界矩形
cv2.boundingRect
可以帮助我们得到边界矩形的位置和长宽.
例子:
# 读取图片
img = cv2.imread("contours.jpg")
# 转换成灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 获取轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
# 获取第一个轮廓
cnt = contours[0]
# 获取正方形坐标长宽
x, y, w, h = cv2.boundingRect(cnt)
# 图片展示
img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 轮廓面积
area = cv2.contourArea(cnt)
# 边界矩形面积
rect_area = w * h
# 占比
extent = area / rect_area
print('轮廓面积与边界矩形比:', extent)
输出结果:
轮廓面积与边界矩形比: 0.5154317244724715
外接圆
cv2.minEnclosingCircle
可以帮助我们得到外接圆的位置和半径.
例子:
# 读取图片
img = cv2.imread("contours.jpg")
# 转换成灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 获取轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
# 获取第一个轮廓
cnt = contours[0]
# 获取外接圆
(x, y), radius = cv2.minEnclosingCircle(cnt)
# 获取图片
img = cv2.circle(img, (int(x), int(y)), int(radius), (255, 100, 0), 2)
# 图片展示
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出结果:
来源:https://blog.csdn.net/weixin_46274168/article/details/118891765?spm=1001.2014.3001.5502


猜你喜欢
- 依赖条件:需要有Hadoop,hive,zookeeper,hbase环境映射:每一个在 Hive 表中的域都存在于 HBase 中,而在
- 前言我们知道当文件不存在的时候,open()方法的写模式与追加模式都会新建文件,但是对文件进行判断的场景还有很多,比如,在爬虫下载图片的时候
- 1、XML 是什么?XML仅仅是一种数据存放格式,这种格式是一种文本(虽然XML规范中也提供了存放二进制数据的解决方案)。事实上有很多文本格
- python3 读取串口数据 demo最近在写一个demo,zigbee串口连接树莓派,树莓派使用串口通信接受zigbee穿过来得值。其中我
- 以网页表格为例:https://www.kuaidaili.com/free/该网站数据存在table标签,直接用requests,需要结合
- 本文实例为大家分享了python机器学习实现决策树的具体代码,供大家参考,具体内容如下# -*- coding: utf-8 -*-&quo
- 这篇文章主要介绍了Python文本处理简单易懂方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- 本文实例为大家分享了php微信跳一跳的具体代码,供大家参考,具体内容如下<?php require 'config.php
- 几个月前,我开始学习个人形象管理,从发型、妆容、服饰到仪表仪态,都开始做全新改造,在塑造个人风格时,最基础的是先了解自己属于哪种风格,然后找
- 在网上找了很多资料,但是一直没有实际效果,现在终于搞定问题如下: 用的post请求,然后入参格式为json并且入参中包含中文,调用
- AddHeaderAddHeader 方法用指定的值添加 HTML 标题。该方法常常向响应添加新的 HTTP 标题。它并不替代现有的同名标题
- Wordpress 2.6.2 出来了,今天将网站程序从2.6升级上来,比较了一下2个版本的代码,发现2.6的版本中的代码还有几个地方出现了
- 数据库操作类的优点优点可以说是非常多了,常见的优点就是便于维护、复用、高效、安全、易扩展。例如PDO支持的数据库类型是非常多的,与mysql
- 该模块用perl的数组代表一个文件,文件的每一行对应数组的一个元素,第一行为元素0,第二回为1,... 文件本身实际并不加载到内
- Selenium爬虫遇到 数据是以 JSON 字符串的形式包裹在 Script 标签中,假设Script标签下代码如下:<script
- 我就废话不多说了,大家还是直接看代码吧~import tensorflow as tfh_doc=tf.placeholder(tf.int
- Git 标签如果你达到一个重要的阶段,并希望永远记住那个特别的提交快照,你可以使用 git tag 给它打上标签。比如说,我们想为我们的 w
- 本文实例讲述了Python3实现对列表按元组指定列进行排序的方法。分享给大家供大家参考,具体如下:Python版本: python3.+ 运
- 很多开发人员在使用MySQL时经常会在部分列上进行函数计算等,导致无法走索引,在数据量大的时候,查询效率低下。针对此种情况本文从MySQL5
- 本文为大家分享了Win中安装mysql的详细步骤,供大家参考,具体内容如下mysql下载目录选择免安装版“Windows (x86, 64-