怎么在Python中使用OpenCV标记图像区域轮廓-创新互联
这期内容当中小编将会给大家带来有关怎么在Python中使用OpenCV标记图像区域轮廓,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
创新互联长期为上千余家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为双阳企业提供专业的网站设计、成都网站设计,双阳网站改版等技术服务。拥有十多年丰富建站经验和众多成功案例,为您定制开发。图片基本处理
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)
轮廓检测
下面就是检测图像轮廓具体位置的代码了:
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])
函数参数如下:
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标记图像区域轮廓-创新互联
文章分享:http://myzitong.com/article/cecoip.html