这期内容当中小编将会给大家带来有关怎么在Python中使用OpenCV标记图像区域轮廓,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
import cv2 as 简历 时间=src cv.imread (“。/demo.jpg") 时间=gray cv.cvtColor (src, cv.COLOR_BGR2GRAY) #,cv.imshow (“src", src) 时间=gray cv.GaussianBlur(灰色,,(5,,5),0) 时间=edges cv.Canny(灰色,,70,,210) cv.imshow (“edged",,边缘)
轮廓检测
下面就是检测图像轮廓具体位置的代码了:
轮廓,,hierarchy =, cv.findContours (edges.copy (),, cv.RETR_LIST,, cv.CHAIN_APPROX_SIMPLE) 打印(f"轮廓数量:{len(轮廓)}“)
在<代码>简历。findContours(边缘,简历。RETR_LIST cv.CHAIN_APPROX_SIMPLE) 代码>中,第二个参数使用的是<代码>简历。RETR_LIST> 代码,该参数值表示检测所有轮廓,不建立等级关系,彼此独立。如果只想获取轮廓边缘信息,不关心是否嵌套在另一个轮廓之内,使用该参数值即可。
第三个参数使用的是<代码>简历。CHAIN_APPROX_SIMPLE> 代码,表示压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息,这也是为了后面便于计算。
观察上图,可以发现最外侧的边缘面积是最大的,所以依据面积进行排序,依据其他值也可以,获取面积最大的轮廓。
contours =,排序(轮廓,key =, cv.contourArea,, reverse =, True) [3]
对轮廓进行简单绘制,获得下图效果。
cv.drawContours (src,轮廓,1 (0,0255),2)
遍历轮廓,计算轮廓近似
先看代码:
#,遍历轮廓 for c 轮廓拷贝: #,计算轮廓近似 时间=peri cv.arcLength (c,真的) approx =, cv.approxPolyDP (0.02 c,,, *,妖精,,真的)
一个新的函数<代码>简历。arcLength> 代码,该函数的原型如下:
retval =, cv2.arcLength(曲线,,关闭)
该函数用于计算轮廓的周长。
下面的<代码>简历。approxPolyDP 代码>函数原型如下:
approxCurve =, cv2.approxPolyDP(曲线,ε,,关闭[,approxCurve])
函数参数如下:
- <李>
代码>:<代码>曲线源图像的某个轮廓;
李> <李><代码>ε> 代码:距离值,表示多边形的轮廓接近实际轮廓的程度,值越小,越精确;
李> <李><代码> 代码>:关闭轮廓是否闭合。
李>最重要的参数就是<代码>ε> 代码简单记忆为:该值越小,得到的多边形角点越多,轮廓越接近实际轮廓,该参数是一个准确度参数。
该函数返回值为轮廓近似多边形的角点。
绘制轮廓
最后判断,当上文返回的角点为4的时候,提取轮廓,代码如下:
#,遍历轮廓 for c 轮廓拷贝: #,计算轮廓近似 时间=peri cv.arcLength (c,真的) 时间=approx cv.approxPolyDP (c, 0.02, *,妖精,,真的) #,当恰好是,,4个角点的时候,获取轮廓。 if len(大约),==,4: screen_cnt =约 打破 #,结果显示 cv.drawContours (src, [screen_cnt],, 1,, (0, 0, 255),, 2)
更换图片,进行再次轮廓检测,注意修改轮廓近似部分代码即可。
#,遍历轮廓 for c 轮廓拷贝: #才能,计算轮廓近似 approx 才能=,cv.approxPolyDP (c, 30日,真的) if 才能len(大约),==,4: ,,,screen_cnt =约 ,,,打破