Opencv查找、绘制轮廓、圆形矩形轮廓和近似轮廓
查找、绘制轮廓、圆形矩形轮廓和近似轮廓
目录
- 查找、绘制轮廓、圆形矩形轮廓和近似轮廓
- 1 轮廓查找和绘制
- 1.1 轮廓查找
- 1.1.1 函数和参数
- 1.1.2 返回值
- 1.2 轮廓绘制
- 1.2.1 函数和参数
- 1.3 步骤
- 1.4 实际测试绘制轮廓
- 2 绘制近似轮廓
- 2.1 函数和参数
- 2.2 查找特定轮廓
- 2.3 近似轮廓测试
- 3 绘制圆形矩形轮廓
- 3.1 圆形函数和参数
- 3.2 矩形函数和参数
- 3.3 实际测试
1 轮廓查找和绘制
1.1 轮廓查找
1.1.1 函数和参数
cv2.findContours(图片,检索方式,轮廓近似方法)
- 图片最好为二值图,即非黑即白,非0即255
- 检索方式
- cv2.RETR_TREE,只检测外轮廓
- cv2.RETR_LIST,检测轮廓,不建立等级关系,所有轮廓在同一等级
- cv2.RETR_CCOMP,检测轮廓,建立两个等级关系,一个对象的外轮廓是第一级组织结构,内部空洞轮廓为第二级组织机构,空洞中的任何对象的轮廓又是第一级组织机构
- cv2.RETR_TREE,返回所有轮廓,建立一个完整的组织机构轮廓
- 轮廓近似方法
- cv2.CHAIN_APPROX_NONE,存储所有轮廓点
- cv2.CHAIN_APPROX_SIMPLE,压缩模式,只保留该方向的终点坐标
1.1.2 返回值
_,contours,hier = cv2.findContours(con_binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
- contours,包括查找的所有轮廓的list对象,其中每一个独立的轮廓信息以边界点坐标(x,y)存在numpy数组中
- hierarchy,轮廓层次结构,[当前轮廓同层下一轮廓,当前轮廓同层上衣轮廓,当前轮廓子轮廓,当前轮廓父轮廓]
1.2 轮廓绘制
1.2.1 函数和参数
con_con = cv2.drawContours(img片,contours=contours,contourIdx=-1,color=(255,0,0),thickness=3)
- img绘制轮廓的图片
- contours=contours轮廓,
- contourIdx=-1轮廓索引值,-1表示全部
- color=(255,0,0)绘制线条颜色,
- thickness=3线条大小
返回值为根据设置绘制轮廓的图像
1.3 步骤
- 图片
- 灰度图
- 二值图
- 根据二值图查找轮廓返回轮廓
- 根据返回轮廓在图像上绘制轮廓,返回图像
1.4 实际测试绘制轮廓
原图:
代码展示:
import cv2
con = cv2.imread('con.png')
con_0 = cv2.imread('con.png',0)
r,con_binary = cv2.threshold(con_0,125,255,cv2.THRESH_BINARY)
_,contours,hier = cv2.findContours(con_binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
con_copy = con.copy()
con_con_1 = cv2.drawContours(con_copy,contours=contours,contourIdx=-1,color=(255,0,0),thickness=3)
con_copy = con.copy()
con_con1 = cv2.drawContours(con_copy,contours=contours,contourIdx=1,color=(255,0,0),thickness=3)
cv2.imshow('con',con )
cv2.waitKey(0)
cv2.imshow('con_binary',con_binary)
cv2.waitKey(0)
cv2.imshow('con_con1',con_con1)
cv2.waitKey(0)
cv2.imshow('con_con_1',con_con_1)
cv2.waitKey(0)
运行结果:
2 绘制近似轮廓
2.1 函数和参数
- arc_0005=0.005*cv2.arcLength(contours[1],True),计算轮廓长度
- 0.005表示近似的程度,值越小,近似的点越多,值越大近似的点越少,线条越多少
- contours[1]为要近似的目标轮廓,True,表示曲线是闭合
- arc_0005为返回值,为近似后的轮廓周长数值,
- apporx_0005 = cv2.approxPolyDP(max_area_con,arc_0005,True),返回值为逼近的轮廓,需要加[]使用
- cv2.drawContours(con_copy,[apporx_0005],contourIdx=-1,color=(0,0,255),thickness=3)
- con_copy,绘制轮廓的图像,
- [apporx_0005],返回的轮廓
- contourIdx=-1,表示索引全部
- color=(255,0,0)绘制线条颜色
- thickness=3线条大小
2.2 查找特定轮廓
这里找的是最大的轮廓
原图:
代码展示:
import cv2
con = cv2.imread('wang.png')
con_0 = cv2.imread('wang.png',0)
r,con_binary = cv2.threshold(con_0,125,255,cv2.THRESH_BINARY)
_,contours,hier = cv2.findContours(con_binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
con_area = [(i,cv2.contourArea(i)) for i in contours]
## 排序
con_area_sorted = sorted(con_area,key=lambda x:x[1],reverse=True)
max_area_con = con_area_sorted[1][0]
arc_0005 = 0.005*cv2.arcLength(max_area_con,True)
apporx_0005 = cv2.approxPolyDP(max_area_con,arc_0005,True)
con_copy = con.copy()
con_0005 = cv2.drawContours(con_copy,[apporx_0005],contourIdx=-1,color=(255,0,0),thickness=3)
cv2.imshow('con',con)
cv2.waitKey(0)
cv2.imshow('con_0005',con_0005)
cv2.waitKey(0)
运行结果:
2.3 近似轮廓测试
原图:
代码展示:
import cv2
con = cv2.imread('kl.jpg')
con_0 = cv2.imread('kl.jpg',0)
r,con_binary = cv2.threshold(con_0,125,255,cv2.THRESH_BINARY)
_,contours,hier = cv2.findContours(con_binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
arc_0005= 0.005*cv2.arcLength(contours[1],True)
arc_001 = 0.01*cv2.arcLength(contours[1],True)
arc_005 = 0.05*cv2.arcLength(contours[1],True)
apporx_0005 = cv2.approxPolyDP(contours[1],arc_0005,True)
apporx_001 = cv2.approxPolyDP(contours[1],arc_001,True)
apporx_005 = cv2.approxPolyDP(contours[1],arc_005,True)
con_copy = con.copy()
con_0005 = cv2.drawContours(con_copy,[apporx_0005],contourIdx=-1,color=(0,0,255),thickness=3)
con_copy = con.copy()
con_001 = cv2.drawContours(con_copy,[apporx_001],contourIdx=-1,color=(0,0,255),thickness=3)
con_copy = con.copy()
con_005 = cv2.drawContours(con_copy,[apporx_005],contourIdx=-1,color=(0,0,255),thickness=3)
cv2.imshow('con',con)
cv2.waitKey(0)
cv2.imshow('con_0005 ',con_0005)
cv2.waitKey(0)
# #
cv2.imshow('con_001',con_001)
cv2.waitKey(0)
cv2.imshow('con_005 ',con_005)
cv2.waitKey(0)
运行结果:
3 绘制圆形矩形轮廓
3.1 圆形函数和参数
- (x,y),m = cv2.minEnclosingCircle(contours[7])
- (x,y)坐标,m,圆形轮廓半径
- contours[7],轮廓
- circle = cv2.circle(con_copy,(int(x),int(y)),int(m),(255,0,0),2)
- con_copy,绘制图像
- (int(x),int(y)),int(m),坐标和半径,要求是整数
- (255,0,0)颜色,2线条大小
- circle,返回的绘制好的图像
3.2 矩形函数和参数
- x,y,w,h = cv2.boundingRect(contours[7])
- x,y,w,h (x,y)起始坐标,矩形轮廓宽高
- rectangle = cv2.rectangle(con_copy,(x,y),(x+w,y+h),(255,0,0),2)
- (x,y)起始坐标,(x+w,y+h)矩形结束坐标
3.3 实际测试
原图:
代码展示:
import cv2
con = cv2.imread('con.png')
con_0 = cv2.imread('con.png',0)
r,con_binary = cv2.threshold(con_0,125,255,cv2.THRESH_BINARY)
_,contours,hier = cv2.findContours(con_binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
(x,y),m = cv2.minEnclosingCircle(contours[7])
con_copy = con.copy()
circle = cv2.circle(con_copy,(int(x),int(y)),int(m),(255,0,0),2)
x,y,w,h = cv2.boundingRect(contours[7])
con_copy = con.copy()
rectangle = cv2.rectangle(con_copy,(x,y),(x+w,y+h),(255,0,0),2)
cv2.imshow('circle',circle)
cv2.waitKey(0)
cv2.imshow('rectangle',rectangle)
cv2.waitKey(0)
运行结果: