Opencv进阶篇---轮廓检测

发布时间:2026/7/28 17:26:59
Opencv进阶篇---轮廓检测 图像轮廓边缘检测只要梯度发生变化零散的点都算作边缘轮廓检测一个链接的整体cv.findContours(image,mode,method)mode:轮廓检测模式cv.RETR_EXTERNAL只检测最外面的轮廓cv.RETR_LIST检测其所有轮廓并将其保存到一条链表中cv.RETR_CCOMP检测所有的轮廓并将它们组织为两层顶层是各部分的外部边界第二层时空洞的边界cv.RETR_TREE检测左右的轮廓并构建嵌套轮廓的整个层次-----常用method:轮廓逼近常用两种方法cv.CHAIN_APPROX_NONE以Freeman链码的方式输出轮廓所有其他方式输出多边形定点序列cv.CHAIN_APPROX_SIMPLE压缩水平的、垂直的和斜的部分即函数只保留他们的重点部分逼近方法示意步骤检测并绘制1、为了更高的准确率使用二值图像2、轮廓绘制srccv.imread(E:\OpenCVTests\Samples\sample\contours.png) graycv.cvtColor(src,cv.COLOR_BGR2GRAY) ret,threshcv.threshold(gray,127,255,cv.THRESH_BINARY) contours,hierarchycv.findContours(thresh,cv.RETR_TREE,cv.CHAIN_APPROX_NONE) drawSrcsrc.copy()#注意需要copy否则原图会发生改变 rescv.drawContours(drawSrc,contours,-1,(0,0,255),1)#倒数第三个参数默认为-1表示绘制全部轮廓指定为其他值则在图像中进行选择单个并且有内外圈之分 # 最后一个参数为颜色宽度 cv.imshow(COntours,res)简单的轮廓检测较为复杂的轮廓检测轮廓特征可以根据自身需要去构建其他一些衍生特征cntcontours[0]#当对轮廓进行特征计算时需要取对应轮廓设置取值 arecv.contourArea(cnt)#面积 lengthcv.arcLength(cnt,True)#周长True表示闭合 print(Area%s%are) print(Length%s%length)轮廓逼近轮廓逼近原理epsilon0.001*cv.arcLength(cnt,True)#该阈值很重要决定了轮廓逼近的精度可以根据检测结果适当调整 approxcv.approxPolyDP(cnt,epsilon,True)#轮廓逼近运算第二个值则为比较的阈值可以自己设定一般为周长的百分比 drawSrc1src.copy() dstcv.drawContours(drawSrc1,[approx],-1,(255,0,0),3) cv.imshow(ApproxControus,dst)外接矩形、外接圆x,y,w,hcv.boundingRect(cnt)#外接矩形API dst2cv.rectangle(src,(x,y),(xw,yh),(0,255,0),2)#矩形的绘制起点、以及长宽的指定 cv.imshow(boundingRect,dst2) (x,y),radiuscv.minEnclosingCircle(cnt)#外接圆API center(int(x),int(y)) radiusint(radius) dst3cv.circle(src,center,radius,(0,255,0),2) cv.imshow(boundigCirclet,dst3)