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
猜你喜欢
- 本文实例为大家分享了python实现电子词典的具体代码,供大家参考,具体内容如下服务端#!/usr/bin/env python3from
- js给span标签赋值的方法?一般有两种方法:第一种方法:输出html<body onload="s()">
- 1.漏洞介绍在XHTML 1.0标准下,使用特殊构造的CSS样式,在Internet Explorer 7.0
- 前言我们上一篇博客,给大家展现了一个动态的爱心。今天,我们给大家画一个圣诞树,我们一起来看看效果吧。效果展示我们先来看看最终的效果看看我们画
- 内容摘要: ASP具备管理不同语言脚本程序的能力,能够自动调用合适的脚本引擎以解释脚本代码和执行内置函数。ASP开发环境提供了两种
- 如果遇到下述错误,表示当启动mysqld时或重新加载授权表时,在用户表中发现具有非法密码的账户。发现用户'some_user'
- 自己写了玩的一个小脚本,百度图片下载import reimport osimport requestsimport hashlibdef d
- <?php $fp = fopen("http://www.***.com/**
- 由于一些不可预测的因素,必须使用python2.7进行开发,所以研究了一下怎么在Anaconda3下建立2.7的开发环境,发现十分方便,在此
- 首先比较下return 与 yield的区别:return:在程序函数中返回某个值,返回之后函数不在继续执行,彻底结束。yield: 带有y
- 其实所有的死锁最深层的原因就是一个:资源竞争。表现一:一个用户A 访问表A(锁住了表A),然后又访问表B
- 在对于时间准确度的把握上,为了使操作的更加细化,很多人习惯把时间精确到秒。但在实际程序操作中,虽然秒数方便我们的查阅,但是计算机并不能直接的
- 一、Browser Capabilities组件 该组件最主要的作用是:提取识别客户端浏览器的版本信息。其原理是这样的:当客户端浏览器向服务
- 本文实例讲述了php mailer类调用远程SMTP服务器发送邮件实现方法。分享给大家供大家参考,具体如下:php mailer 是一款很好
- 在使用pip安装Tensorflow后,在其目录中没有找到model目录,重复安装了两遍依然没有,原因未知。于是,使用源码安装的方法:(1)
- time模块1:概述时间表示的分类时间戳格式化的时间字符串结构化时间时间戳:时间戳表示的是从1970年1月1日整0点到目前秒的偏移量,数据类
- 首先我们放出tf2.0关于tf.keras.layers.Conv2D()函数的官方文档,然后逐一对每个参数的含义和用法进行解释:tf.ke
-   跨平台的pywifi模块支持操作无线网卡,该模块易于使用,同时支持Windows、Linux等多个系
- 前言其实就是个小问题,但是爆出来的时候也很莫名其妙。因为之前都跑得好好的,只是换了不同的文件去跑才出的问题,关键是不同的文件要处理的内容和格
- 出自: 编程中国 http://www.bc-cn.net作者: 天涯听雨 &nbs