1.opencv的中函contourarea函数算法原理是什么?
2.cvSplitopenCV中的一个函数
3.Opencv findcontours函数原理,以及python numpy实现
opencv的contourarea函数算法原理是什么?
在opencv中,使用contourArea()函数和计算ROI非零像素数量来获取相对面积的中函效率对比如何?在仅需要相对面积的情况下,计算contourArea()的源码源代复杂度为O(contour_number_of_vertices),而计数ROI非零像素的中函算法复杂度为O(roi_width*roi_height),因此后者速度更慢。源码源代unity3d手游源码
contourArea()函数使用格林公式(en.wikipedia.org/wiki/G...'s_theorem)来计算面积。中函而计数非零像素在ROI中的源码源代算法复杂度较高。需要注意到,中函由于有限且相对较低的源码源代栅格网格分辨率,这两个算法会给出显著不同的中函结果。对于大型且方形的源码源代轮廓,误差将最小。中函对于小型且或长形的源码源代轮廓,误差可以相当大。中函
cvSplitopenCV中的一个函数
在OpenCV这个由Intel公司支持的开源计算机视觉库中,有一个名为cvSplit的重要函数。这个函数的主要功能是将多通道的数组分割成单独的单通道数组,或者从数组中提取特定的51拉新源码通道信息。
cvSplit函数的原型为:
void cvSplit(const CvArr* src, CvArr* dst0, CvArr* dst1, CvArr* dst2, CvArr* dst3);
使用这个函数时,你需要提供一个源数组(src)和几个目标通道数组(dst0, dst1, dst2, dst3)。如果源数组有N个通道,且前N个输出数组非空,cvSplit会将所有通道从源数组中提取出来。如果前N个通道中只有一个非空,函数将只提取指定的那个通道,其他通道必须设置为NULL。值得注意的韩国网络源码是,如果源数组设置了ROI(Region of Interest,兴趣区域),你可以结合使用cvCopy来从图像中提取单通道数据。
cvSplit提供了一种灵活的方式来管理和操作多通道数据,这对于处理图像处理和计算机视觉任务中的颜色空间转换或通道选择十分实用。
Opencv findcontours函数原理,以及python numpy实现
OpenCV的Findcontours()函数原理来源于一篇名为《Topological Structural Analysis of Digitized Binary Images by Border Following》的论文。该论文详细介绍了算法的实现,并提供了算法的西北旅游主题源码源代码。
在论文中,对于一些关键定义进行了阐述:
1. 轮廓点:在一个4-或8-邻域内,如果存在一个像素为0的点,则该点为轮廓点。
2. 连通区域的环绕:对于两个相邻的连通区域S1和S2,如果S1上任意一个点的四个方向都能到达S2,那么S2环绕S1。
3. 外轮廓和孔轮廓:外轮廓是指像素为1的连通域内被像素为0的连通域环绕的轮廓点,孔轮廓是扫饮片溯源码指像素为0的连通区域被像素为1的连通区域环绕的轮廓点。
4. 父轮廓:定义了层级关系,例如,对于一个像素为1的连通区域S1和一个像素为0的连通区域S2,如果S2环绕S1,则S1的父轮廓为环绕S2的值为1的像素。
轮廓扫描过程中,从左到右、从上到下的顺序扫描,根据扫描到的边界起始点判断轮廓类型。找到起始点后,根据上一个轮廓的编号判断父轮廓。最后,通过border following找到该轮廓的所有点。
在实现过程中,需要定义输入,初始化NBD为1,LNBD为1。在每一行扫描开始时,LNBD重置为1。根据当前扫描到的像素值,不断更新当前点,并绕着该点逆时针旋转寻找下一点,并不断更新像素值。
在实现过程中,遇到了一个问题,即当像素左边和右边同时为0时,需要进行特殊处理。因为轮廓是逆时针寻找,所以可以通过寻找的方位判断该赋值NBD还是-NBD。具体实现可以参考代码。
修正后,结果与论文一致。有兴趣的朋友可以查看代码。
结果图展示了轮廓编号、frame边缘、子轮廓、父轮廓、轮廓开始索引和轮廓类型等信息。