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

作者:梦想橡皮擦 时间:2023-12-18 05:42:08 

学在前面

上篇 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 图像区域轮廓标记(框选各种小纸条)

来源:https://blog.csdn.net/hihell/article/details/114532181

标签:OpenCV,区域轮廓
0
投稿

猜你喜欢

  • JavaScript中document.forms[0]与getElementByName区别

    2024-04-17 09:55:58
  • js 实现数值的千分位及保存小数方法(推荐)

    2023-08-17 01:13:11
  • 在ASP中使用SQL语句之8:随机数的用法

    2007-08-11 13:15:00
  • Python基于SMTP协议实现发送邮件功能详解

    2022-07-17 00:31:00
  • .Net行为型设计模式之访问者模式(Visitor)

    2024-05-13 09:18:14
  • 使用pycharm运行flask应用程序的详细教程

    2022-12-15 05:15:55
  • Python数学建模库StatsModels统计回归简介初识

    2021-05-05 04:57:02
  • Mysql 数据库双机热备的配置方法

    2010-06-09 19:13:00
  • 使用Selenium破解新浪微博的四宫格验证码

    2021-06-16 11:22:28
  • MySQL时间字段究竟使用INT还是DateTime

    2010-03-09 14:46:00
  • Python编程实现的简单Web服务器示例

    2023-01-14 02:00:40
  • jquery+ajax+C#实现无刷新操作数据库数据的简单实例

    2024-01-15 03:26:34
  • Anaconda下Python中GDAL模块的下载与安装过程

    2022-08-30 04:49:54
  • pytorch锁死在dataloader(训练时卡死)

    2023-06-28 02:36:34
  • Python实现Web服务器FastAPI的步骤详解

    2022-12-20 21:34:51
  • 基于Python Pygame实现的画饼图游戏

    2023-10-25 18:30:23
  • Java Spring动态生成Mysql存储过程详解

    2024-01-25 10:16:32
  • 讲解Access数据库中数据表的自动重新联接

    2008-11-28 16:29:00
  • 详解MySQL数据库安全配置

    2010-01-26 15:19:00
  • TensorFlow-gpu和opencv安装详细教程

    2023-02-16 00:55:55
  • asp之家 网络编程 m.aspxhome.com