• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Python OpenCV 图像区域轮廓标记(框选各种小纸条)

    学在前面

    上篇 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 边缘检测,这些都是图像处理的基本函数,使用方法已经在前文进行过相关学习。

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

    轮廓检测

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

    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)
    
    

    遍历轮廓,计算轮廓近似

    先看代码:

    # 遍历轮廓
    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])
    

    函数参数如下:

    最重要的参数就是 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高斯金字塔与拉普拉斯金字塔的实现
    • Python OpenCV 基于图像边缘提取的轮廓发现函数
    • Python opencv操作深入详解
    • Python+Opencv实现数字识别的示例代码
    • python中的opencv和PIL(pillow)转化操作
    • python opencv 找出图像中的最大轮廓并填充(生成mask)
    • python利用opencv实现颜色检测
    • python 使用OpenCV进行简单的人像分割与合成
    • Python基于opencv的简单图像轮廓形状识别(全网最简单最少代码)
    • python基于OpenCV模板匹配识别图片中的数字
    上一篇:python opencv 找出图像中的最大轮廓并填充(生成mask)
    下一篇:opencv函数threshold、adaptiveThreshold、Otsu二值化的实现
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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