Python Opencv轮廓常用操作代码实例解析
1.颜色空间转换
使用cv2.cvtColor(input_image,flag),flag为转换类型
常用的转换类型有:
- BGR和灰度图的转换使用cv2.COLOR_BGR2GRAY
- BGR和HSV的转换使用cv2.COLOR_BGR2HSV
img_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
2.二值化
- ret,dst=cv2.threshold(src,thresh,maxval,type)
- src:表示的是图片源(灰度图)
- thresh:表示的是阈值(起始值)
- maxval:表示的是最大值
- type:表示的是这里划分的时候使用的是什么类型的算法,常用值为0(cv2.THRESH_BINARY)
返回值
ret:指定的thresh
dst:目标图像
ret,dst=cv2.threshold(img_gray,200,255,cv2.THRESH_BINARY)
3.查找并绘制轮廓
3.1cv2.findContours(image,mode,method[,offset])
概述:
寻找一个二值图像的轮廓。注意黑色表示背景,白色表示物体,即在黑色背景里寻找白色物体的轮廓
参数:
- image:8位单通道图像。非零像素值视为1,所以图像视作二值图像
- mode:轮廓检索的方式
- cv2.RETR_EXTERNAL:只检索外部轮廓
- cv2.RETR_LIST:检测所有轮廓且不建立层次结构
- cv2.RETR_CCOMP:检测所有轮廓,建立两级层次结构。上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。
- cv2.RETR_TREE:检测所有轮廓,建立完整的层次结构
- method:轮廓近似的方法
- cv2.CHAIN_APPROX_NONE:存储所有的轮廓点
- cv2.CHAIN_APPROX_SIMPLE:压缩水平,垂直和对角线段,只留下端点。例如矩形轮廓可以用4个点编码
- cv2.CHAIN_APPROX_TC89_L1,cv2.CHAIN_APPROX_TC89_KCOS:使用Teh-Chinichain近似算法
- offset:(可选参数)轮廓点的偏移量,格式为tuple,如(-10,10)表示轮廓点沿X负方向偏移10个像素点,沿Y正方向偏移10个像素点
返回值:
- contours:轮廓点。列表格式,每一个元素为一个3维数组(其形状为(n,1,2),其中n表示轮廓点个数,2表示像素点坐标),表示一个轮廓
- hierarchy:轮廓间的层次关系,为三维数组,形状为(1,n,4),其中n表示轮廓总个数,4指的是用4个数表示各轮廓间的相互关系。第一个数表示同级轮廓的下一个轮廓编号,第二个数表示同级轮廓的上一个轮廓的编号,第三个数表示该轮廓下一级轮廓的编号,第四个数表示该轮廓的上一级轮廓的编号
补充:若想得到轮廓点的集合的列表,可使用
cnt=np.squeeze(contours[0])
3.2cv2.drawContours(image,contours,contourIdx,color[,thickness[,lineType[,hierarchy[,maxLevel[,offset]]]])
参数:
- image:需要绘制轮廓的目标图像,注意会改变原图
- contours:轮廓点,上述函数cv2.findContours()的第一个返回值
- contourIdx:轮廓的索引,表示绘制第几个轮廓,-1表示绘制所有的轮廓
- color:绘制轮廓的颜色
- thickness:(可选参数)轮廓线的宽度,-1表示填充
- lineType:(可选参数)轮廓线型,包括cv2.LINE_4,cv2.LINE_8(默认),cv2.LINE_AA,分别表示4邻域线,8领域线,抗锯齿线(可以更好地显示曲线)
- hierarchy:(可选参数)层级结构,上述函数cv2.findContours()的第二个返回值,配合maxLevel参数使用
- maxLevel:(可选参数)等于0表示只绘制指定的轮廓,等于1表示绘制指定轮廓及其下一级子轮廓,等于2表示绘制指定轮廓及其所有子轮廓
- offset:(可选参数)轮廓点的偏移量
importcv2
img=cv2.imread('D:/2.jpg',1)img_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,dst=cv2.threshold(img_gray,200,255,cv2.THRESH_BINARY)contours,hierarchy=cv2.findContours(dst,cv2.RETR_LIST,cv2.CHAIN_APPROX_NONE)
cv2.drawContours(img,contours,-1,(0,255,0),3)cv2.imshow('img',img)
cv2.waitKey(0)
4.点与轮廓位置关系
此功能可查找图像中的点与轮廓之间的最短距离。当点在轮廓外时返回负值,当点在内部时返回正值,如果点在轮廓上则返回零
dist=cv2.pointPolygonTest(cnt,(100,100),True)
检查(100,100)与轮廓(cnt)的距离
在函数中,第二个参数需要tuple类型;第三个参数是measureDist。如果为True,则查找距离.如果为False,则查找该点是在内部还是外部或在轮廓上(它分别返回+1,-1,0)
如果不需要到距离,请确保第三个参数为False,因为这是一个耗时的过程。因此,将其设为False可提供2-3倍的加速
5.直线拟合fitline函数
output=cv2.fitLine(InputArraypoints,distType,param,reps,aeps)
参数:
- InputArrayPoints:待拟合的直线的集合,必须是矩阵形式(如numpy.array)
- distType:距离类型。fitline为距离最小化函数,拟合直线时,要使输入点到拟合直线的距离和最小化。这里的距离的类型有以下几种:
- cv2.DIST_USER:Userdefineddistance
- cv2.DIST_L1:distance=|x1-x2|+|y1-y2|
- cv2.DIST_L2:欧式距离,此时与最小二乘法相同
- cv2.DIST_C:distance=max(|x1-x2|,|y1-y2|)
- cv2.DIST_L12:L1-L2metric:distance=2(sqrt(1+x*x/2)-1))
- cv2.DIST_FAIR
- cv2.DIST_WELSCH
- cv2.DIST_HUBER
- param:距离参数,跟所选的距离类型有关,值可以设置为0
- reps,aeps:第5/6个参数用于表示拟合直线所需要的径向和角度精度,通常情况下两个值均被设定为1e-2
返回值:
output:对于二维直线,输出output为4维,前两维代表拟合出的直线的方向,后两位代表直线上的一点。(即通常说的点斜式直线)
loc=np.array(loc)
output=cv2.fitLine(loc,cv2.DIST_L2,0,0.01,0.01)
k=output[1]/output[0]
b=output[3]-k*output[2]#k[key]报错?
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。