openCV简要-10 轮廓检测

1.寻找图像中的轮廓
cv2.findContours(img,mode,method)

mode为轮廓检索模式:
RETR_EXTERNAL:只检索最外面的轮廓
RETR_LIST:检索所有轮廓,并把所有轮廓保存在一个链表中
RETR_CCOMP:检索所有轮廓,组织为两层;第一层是外部边界,第二层是空洞边界
RETR_TREE:检索所有轮廓并重构轮廓层次。

method为轮廓逼近方法:
CHAIN_APPROX_NONE:用实线段表示轮廓
CHAIN_APPROX_SIMPLE:只保留轮廓的顶点

import cv2
import numpy as np

img=cv2.imread('test.jpg')
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#转换为二值图像准确度更高
ret,thresh=cv2.threshold(gray,127,255,cv2.THRESH_BINARY)

binary,contours,hierarchy=cv2.findContours(thresh,cv2.RETR_TREE,CHAIN_APPROX_NONE)

2.绘制轮廓

draw_img=img.copy()#避免覆盖原图像
res=cv2.drawContours(draw_img,contours,-1,(0,0,255),2)
#在img中画出所有轮廓contours;-1为画出所有轮廓,若为其他值则只画出指定序号的轮廓;(BGR)表示线条颜色,2为线条宽度

3.轮廓特征

#取出轮廓集合中的某个轮廓
con=contours[0]
#面积
cv2.contourArea(con)
#周长
cv2.arcLength(con,True)#True表示轮廓是封闭的

4.轮廓近似
期望得到近似于轮廓的一个规则图形(以直代曲)

epsilon=0.1cv2.arcLength(con,True)#确定阈值,阈值一般按周长的百分比进行设置
#当弧上的某个点C到直线AB的距离小于这个阈值,则认为直线AB可以代替弧ACB,否则近似为直线AC,CB然后继续迭代处理。
approx=cv2.approxPolyDP(con,epsilon,True)#将轮廓con按epsilon近似
res=cv2.drawContours(draw_img,[approx],-1,(0,0,255),2)#按近似轮廓画出

5.规则轮廓

#外接矩形
x,y,w,h=cv2.boundingRect(con)#将轮廓直接以外接矩形代替
img=cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
#画矩形,在图像img中画出以(x,y)为左上角,(x+w,y+h)为右下角的矩形,2为线条宽度
area=cv2.countArea(con)
x,y,w,h=cv2.boundingRect(con)
rect_area=w*h#矩形面积
ans=float(area)/rect_area
print('轮廓面积/矩形面积',ans)

#外界圆
(x,y),radius=cv2.minEnclosingCircle(con)
center=(int(x),int(y))
radius=int(radius)
img=cv2.circle(img,center,radius,(0,255,0),2)

猜你喜欢

转载自blog.csdn.net/qq_43579980/article/details/113549417