轮廓检测方法的API
binary,contours,hierarchy=cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
![](https://i-blog.csdnimg.cn/blog_migrate/927bac8a89054ab22b7b5756fdc2bfb9.png)
返回值:
binary:img的灰度图
contours:轮廓信息,一个list文件
hierarchy:层数信息
详细介绍可参考cv2.findContours()一颗磐石的博客
res=cv2.drawContours(draw_img,contours,-1,(0,0,255),2)
参数1是指明在哪幅图像上绘制轮廓;image为三通道才能显示轮廓
参数2是轮廓本身,在Python中是一个list;
参数3指定绘制轮廓list中的哪条轮廓,如果是-1,则绘制其中的所有轮廓,可以指定外层or内层轮廓(多尝试不同的参数)。
参数4为绘制的颜色,
参数5是,绘制线条宽度,如果是-1(cv2.FILLED),则为填充模式。
注意本API会改变原图并保存,使用前记得备份(cv2.copy())
import cv2
import matplotlib.pyplot as plt
import numpy as np
def cv_show(name,image):
cv2.imshow(name,image)
cv2.waitKey()
cv2.destroyAllWindows()
#读取轮廓
img=cv2.imread('D:/BaiduNetdiskDownload/opencv/contours.jpg')
img_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#先转化为二值图
ret,thresh = cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY)#转化为二值图 0 , 255
#灰度图、轮廓信息、层数信息
binary,contours,hierarchy=cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
#绘制轮廓
#传入绘制图像,轮廓,轮廓索引(可以多整几个值试试),颜色,线条宽度
#注意此语句会改变原图,所以请copy一份
draw_img=img.copy()
res=cv2.drawContours(draw_img,contours,-1,(0,0,255),2)
cv_show('lunkuo',res)
cnt=contours[0]
![](https://i-blog.csdnimg.cn/blog_migrate/87b21be3637651dfd9de938a15ffccfa.png)
x,y,w,h=cv2.boundingRect (img)
这个函数可以获得一个图像的最小矩形边框一些信息,
参数img:一个二值图像
返回值四个参数:左上角坐标下x,y,矩形的宽w,高h。
#边界矩阵
x,y,w,h=cv2.boundingRect(cnt)
img = cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
area=cv2.contourArea(cnt)
x,y,w,h=cv2.boundingRect(cnt)
rect_area=w*h
extent=float(area)/rect_area
print("轮廓面积与边界矩形比",extent)
cv_show('1',img)
![](https://i-blog.csdnimg.cn/blog_migrate/3c560863f503d43ac0a332ee2d58d9d4.png)
approx=cv2.approxPolyDP(cnt,epsilon,True)
参数1:图像
参数2:阈值
参数3:是否闭合
![](https://i-blog.csdnimg.cn/blog_migrate/6bcf0554bb9c8fa38671c7eb5b5017d0.png)
#轮廓近似
img=cv2.imread('D:/BaiduNetdiskDownload/opencv/contour2.png')
img_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,thresh=cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY)
binary,contours,hierarchy=cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
cnt=contours[0]
draw_img=img.copy()
res=cv2.drawContours(draw_img,[cnt],-1,(0,0,255),2)
print(type(cnt))
cv_show('11',res)
epsilon=0.01*cv2.arcLength(cnt,True)
approx=cv2.approxPolyDP(cnt,epsilon,True)
draw_img=img.copy()
res=cv2.drawContours(draw_img,[approx],-1,(0,0,255),2)
cv_show('111',res)
![](https://i-blog.csdnimg.cn/blog_migrate/dd29d6c8dc61beda224a061e9f2a9e45.png)
![](https://i-blog.csdnimg.cn/blog_migrate/36392d6b541bb88cc02d61a6aef36579.png)
一些简单的API
"""
#轮廓特征
cnt=contours[0]
#面积
S=cv2.contourArea(cnt)
print(S)
#周长(True指周长)
L=cv2.arcLength(cnt,True)
print(L)
"""