用cvFindcontour可以直接得到图像的多个轮廓,但最近使用时发现cvSeq序列可能存在某个结点为零的情况,即轮廓点数为零,这对我们是没有用的,所以产生了将轮廓按面积大小排序的想法,面积大的排在序列前面,优先使用,面积为零的轮廓舍去,下面是代码实现:
static int cmp_func( const void* _a, const void* _b, void* userdata )
{
CvPoint* a = (CvPoint*)_a;
CvPoint* b = (CvPoint*)_b;
int y_diff = a->y - b->y;
int x_diff = a->x - b->x;
return y_diff ? y_diff :x_diff;//优先比交y坐标,a的y坐标大则调整a,b位置;否则比较x坐标,a的x坐标大,也调整a,b位置。
} //即交换a,b位置 swap(a,b) if (a->y >b->y)|(a->x >b->x)
cvSeqSort(cont,cmp_func, 0);