Python OpenCV 图像区域轮廓标记(框选各种小纸条)

 更新时间:2021年03月12日 10:57:54   作者:梦想橡皮擦  
这篇文章主要介绍了Python OpenCV 图像区域轮廓标记(框选各种小纸条),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

学在前面

上篇 OpenCV 博客原计划完成一个 识别银行卡号 的项目,但是写的过程中发现,技术储备不足,我无法在下述图片中,提取出卡号区域,也就无法进行后续的识别了,再次意识到了自己技术还不达标,继续学习。完不成,就实现其它学习项目。

Python OpenCV 图像区域轮廓标记,可用于框选各种小纸条

轮廓识别实战

先看一下最终实现的效果,针对一张图片(该图片前景色和背景色差异较大),进行轮廓标记。

Python OpenCV 图像区域轮廓标记,可用于框选各种小纸条

图片基本处理

import cv2 as cv

src = cv.imread("./demo.jpg")

gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
# cv.imshow("src", src)

gray = cv.GaussianBlur(gray, (5, 5), 0)
edges = cv.Canny(gray, 70, 210)

cv.imshow("edged", edges)

转换成灰度图,高斯模糊去噪,Canny 边缘检测,这些都是图像处理的基本函数,使用方法已经在前文进行过相关学习。

运行上述代码之后,获取基本边缘数据。

Python OpenCV 图像区域轮廓标记,可用于框选各种小纸条

轮廓检测

下面就是检测图像轮廓具体位置的代码了:

contours, hierarchy = cv.findContours(edges.copy(), cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE)
print(f"轮廓数量:{len(contours)}")

cv.findContours(edges, cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE) 中,第二个参数使用的是 cv.RETR_LIST,该参数值表示检测所有轮廓,不建立等级关系,彼此独立。如果只想获取轮廓边缘信息,不关心是否嵌套在另一个轮廓之内,使用该参数值即可。

第三个参数使用的是 cv.CHAIN_APPROX_SIMPLE,表示压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需 4 个点来保存轮廓信息,这也是为了后面便于计算。

观察上图,可以发现最外侧的边缘面积是最大的,所以依据面积进行排序,依据其他值也可以,获取面积最大的轮廓。

contours = sorted(contours, key = cv.contourArea, reverse = True)[:3]

对轮廓进行简单绘制,获得下图效果。

cv.drawContours(src,contours,-1,(0,0,255),2)

Python OpenCV 图像区域轮廓标记,可用于框选各种小纸条

遍历轮廓,计算轮廓近似

先看代码:

# 遍历轮廓
for c in contours:
	# 计算轮廓近似
	peri = cv.arcLength(c, True)
	approx = cv.approxPolyDP(c, 0.02 * peri, True)

一个新的函数 cv.arcLength,该函数的原型如下:

retval = cv2.arcLength(curve, closed)

该函数用于计算轮廓的周长。

下面的 cv.approxPolyDP 函数原型如下:

approxCurve = cv2.approxPolyDP(curve, epsilon, closed[, approxCurve])

函数参数如下:

  • curve:源图像的某个轮廓;
  • epsilon:距离值,表示多边形的轮廓接近实际轮廓的程度,值越小,越精确;
  • closed:轮廓是否闭合。

最重要的参数就是 epsilon 简单记忆为:该值越小,得到的多边形角点越多,轮廓越接近实际轮廓,该参数是一个准确度参数。

该函数返回值为轮廓近似多边形的角点。

绘制轮廓

最后判断,当上文返回的角点为 4 的时候,提取轮廓,代码如下:

# 遍历轮廓
for c in contours:
	# 计算轮廓近似
	peri = cv.arcLength(c, True)
	approx = cv.approxPolyDP(c, 0.02 * peri, True)

	# 当恰好是 4 个角点的时候,获取轮廓。
	if len(approx) == 4:
		screen_cnt = approx
		break

# 结果显示
cv.drawContours(src, [screen_cnt], -1, (0, 0, 255), 2)

更换图片,进行再次轮廓检测,注意修改轮廓近似部分代码即可。

# 遍历轮廓
for c in contours:
  # 计算轮廓近似

  approx = cv.approxPolyDP(c, 30, True)

  if len(approx) == 4:
    screen_cnt = approx
    break

Python OpenCV 图像区域轮廓标记,可用于框选各种小纸条

到此这篇关于Python OpenCV 图像区域轮廓标记(框选各种小纸条)的文章就介绍到这了,更多相关Python OpenCV区域轮廓标记内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • tf.nn.conv2d与tf.layers.conv2d的区别及说明

    tf.nn.conv2d与tf.layers.conv2d的区别及说明

    这篇文章主要介绍了tf.nn.conv2d与tf.layers.conv2d的区别及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • python __add__()的具体使用

    python __add__()的具体使用

    本文主要介绍了python __add__()的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • Python confluent kafka客户端配置kerberos认证流程详解

    Python confluent kafka客户端配置kerberos认证流程详解

    这篇文章主要介绍了Python confluent kafka客户端配置kerberos认证流程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • 利用python在Word文档中创建和执行条件邮件合并

    利用python在Word文档中创建和执行条件邮件合并

    邮件合并域和IF域是Word文档中两种非常实用的域,前者可以用来进行邮件合并,根据数据批量创建定制的Word文档,本文讲介绍如何使用Python在Word文档中创建条件邮件合并域以及执行条件邮件合并,需要的朋友可以参考下
    2024-08-08
  • Python对list列表进行去重的几种方法

    Python对list列表进行去重的几种方法

    python 列表就是我们js中的数组了,我们下文整理几个常用的python 列表去重实现方法,非常的简单好用,通过代码示例讲解的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2024-10-10
  • 使用Python将字符串转换为格式化的日期时间字符串

    使用Python将字符串转换为格式化的日期时间字符串

    这篇文章主要介绍了使用Python将字符串转换为格式化的日期时间字符串,需要的朋友可以参考下
    2019-09-09
  • Python将文件映射到内存使用mmap.mmap()函数方式

    Python将文件映射到内存使用mmap.mmap()函数方式

    这篇文章主要介绍了Python将文件映射到内存使用mmap.mmap()函数方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • Python破解BiliBili滑块验证码的思路详解(完美避开人机识别)

    Python破解BiliBili滑块验证码的思路详解(完美避开人机识别)

    这篇文章主要介绍了Python破解BiliBili滑块验证码的思路,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • django query模块

    django query模块

    这篇文章主要介绍了django query模块,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • Python中的random模块及相关模块详解

    Python中的random模块及相关模块详解

    这篇文章主要介绍了Python中的random模块及相关模块,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06

最新评论