OpenCV提供了查找图像轮廓的函数cv2.findContours(),该函数能够查找图像内的轮廓信息,而函数cv2.drawContours()能够将轮廓绘制出来。
图像轮廓是图像中非常重要的一个特征信息,通过对图像轮廓的 *** 作,我们能够获取目标图像的大小、位置、方向等信息。
函数cv2.findContours()的语法格式为:
式中的返回值为:
式中的参数为:
在OpenCV中,可以使用函数cv2.drawContours()绘制图像轮廓。该函数的语法格式是:
【例12.1】绘制一幅图像内的所有轮廓。
如果要绘制图像内的所有轮廓,需要将函数cv2.drawContours()的参数contourIdx的值设置为“-1”。
【例12.2】逐个显示一幅图像内拦祥毁的边缘信息。
【例12.3】使用轮廓绘制功能,提取前景对象。
将函数cv2.drawContours()的参数thickness的值设置为“-1”,可以绘制前景对象的实心轮廓。将该实心轮廓与原始图像进行“按位与” *** 简备作,即可将前景对象从原宴敬始图像中提取出来。
本例中将函数cv2.drawContours()的参数thickness设置为“-1”,得到了前景对象的实心轮廓mask。接下来,通过语句“cv2.bitwise_and(o, mask)”,将原始图像o与实心轮廓mask进行“按位与”运算,就得到了原始图像的前景对象。
clude<stdio.h>int main()
{
int len=0
int len2=0
FILE* stream
FILE* stream1
FILE* stream2
char buf[50]
char buf1[50]
char buf2[50]
char text[1024]
printf("input anfile path to open:")
scanf("铅滚%s",buf)
stream=fopen(buf,"r+")
fseek(stream,0,SEEK_END)
len=ftell(stream)
printf("the file %s length is %d!\n",buf,len)
len2 = len/2
printf("intput 2 file name: \n")
scanf("%s%s",buf1,buf2)
fseek(stream,0,SEEK_SET)
stream1=fopen(buf1,"w+")
stream2=fopen(buf2,"w+")
fread(text,len2,1,stream)
fwrite(text,len2,1,stream1)
fread(text,len-len2,1,stream)
fwrite(text,len-len2,1,stream2)
fclose(stream)
fclose(stream1)
fclose(stream2)
return 0
}
文件合并
#include<stdio.h>
int main()
{
int len=0
int len2=0
FILE* stream
FILE* stream1
char buf[50]
char buf1[50]
char text[1024]
printf("input anfile path to open:")
scanf("%s",buf)
stream=fopen(buf,"乱激唤r+")
fseek(stream,0,SEEK_END)
printf("哗凯intput another file name: \n")
scanf("%s",buf1)
stream1=fopen(buf1,"r+")
fseek(stream1,0,SEEK_END)
len=ftell(stream1)
fseek(stream1,0,SEEK_SET)
fread(text,len,1,stream1)
fwrite(text,len,1,stream)
fclose(stream)
fclose(stream1)
remove(buf1)//remove the another file
return 0
}
需要在程序目录下有文件存在
边缘检测虽然能够检测出边缘,但是边缘不是连续的,检测到的边缘不是一个整体。 图像轮廓是指将边缘连接起来形成一个整体
cv2.RETR_LIST:对检测到的轮廓不建立等级关系
cv2.RETR_EXTERNAL:只卖盯检测外轮廓
cv2.RETE_CCOMP:检测所有轮廓并组织成两级层次结构,上面一层为外边界,下面一层为内控的边界
(注:当含有多个层次结构时,其也只会得到两层的层次结构,而TREE会得到多层)
cv2.RETR_TREE:建立一个等级树结构的轮廓
如何表达轮廓
cv2.CHAIN_APPROX_SIMPLE :压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点元素
cv2.CHAIN_APPROX_NONE:存储所有轮没仔廓点
返回值image:绘制了轮廓的图像
参数:
image:待绘制轮廓的图像,会在image上直接绘制,后续如果image原始图像有用,需要先复制备份
contours:需要绘制的轮廓
contourIdx:一个整数或者0,表示对应的索引号;-1表示绘制全部轮廓
thickness:-1,表示绘制实心轮廓
绘制一副图像中的所有轮廓
逐个显示一幅图像中的边缘信息
使用轮廓绘制功能,提取前景图像
比较两个轮廓最简单的方法是比较二者的轮廓矩。 轮廓矩代表了一个轮廓,一幅图像,一组点集的全部特征 ,矩信息包含了对应对象的不同类型的几何特征,例如大小,位置,角度,形状等。如果两个轮廓的矩一致,那么这两个轮廓就是一致的。
矩特征被广泛应用在 模式识别 和 图像识别 方面
空间矩(m00表示轮廓的面积)
中心矩(比较不同位置上两个对象的一致性)
归一化中心矩(不仅具有平移不变性,还具有缩放不变性)
array:可以是点集,灰度图像,二值图像
binaryImage: 该参数为True时 ,arry内所有的非零值被处理为1, 也就是二值化 , 仅在array为图像时有效
oriented:
True,返回值包含正负号,用来表示轮廓是顺时针还是逆时针
False,表示返回的retval是一个绝对值
closed:
True,轮廓封闭
False,轮廓不封闭
Hu矩是归一化中心矩的线性组合。 Hu矩在图像旋转,平移,缩放等 *** 作后,仍能保持矩的不变性 ,所以经常拿Hu矩作为识别图像的特征
其中,hu是表示返回的Hu矩值,m是由参数cv2.moments()计算得到的矩特征值
由于Hu矩的值本身就非常的小,因此这里没有发现两个对象的Hu矩差值的特殊意义
通过Hu矩来判断两个对象的一致性
其中 retval返回左上角顶点的x,y以及宽和高(x,y,w,h)
采用cv2.boundingRect()和cv2.rectangle()绘制矩形包围框
此处返回的[最小外接矩形中心,(宽,高),旋转角度],必须经过下面函数
此处的points值再经过np.int0()取整,可以应用于cv2.drawContours()
retval:最小外包三角枯配汪形的面积
triangle:最小外包三角形的三个顶点集
注意:三个顶点集的坐标必须转化为整数
返回值:逼近多边形的点集
参数:轮廓,原始轮廓边界点与逼近多边形边界之间的最大距离,True:封闭;False不封闭
DP算法:该算法首先从轮廓中找到距离最远的两个点,并且将两点相连。接下来在轮廓上找到一个距离当前直线最远的点,并且将该点与原有直线连成一个封闭多边形,上述过程不断迭代,将新的找到的距离当前多边形最远的点加入到结果中。当轮廓上所有的点到当前多边形的距离都小于函数cv2.approxPolyDP()的参数epsilon的值时,就停止迭代
构造不同精度的逼近多边形
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)