opencv官方文档中的介绍:
功能:根据指定的排序规则排序序列中的成员,规则在一个自定义函数中。
cvSeqSort()函数原型:
void cvSeqSort(CvSeq* seq,CvCmpFunc cmp_func, void* userdata)
参数:
seq —— 要排序的序列指针
cmp_func —— 自定义排序规则函数,返回值为-1,0,1中一个,只有返回值为1时,cvSeqsort()才会执行一次位置交换。
userdata —— 用户自定义变量,若cmp_func()函数需要传入额外的参数,将额外参数的指针赋给userdata,cvSeqSort()稍后会将其传入cmp_func(),否则为NULL。
排序规则函数:
cmp_func()函数原型:
static int cmp_func( const void* _a, const void* _b, void* userdata )
参数:
_a,_b —— 序列 seq 的成员,_a 与 _b 相邻且_a 排在 _b 之前。
userdata —— 用户自定义变量,由cvSeqSort()传入。
以下是一个例子,实现的功能是:随机生成一系列二维点,然后根据x坐标值从小到大排列。
#include "opencv2/opencv.hpp"
#include "iostream"
using namespace std;
using namespace cv;
static int cmp_func( const void* _a, const void* _b, void* userdata )
{
CvPoint* a = (CvPoint*)_a;
CvPoint* b = (CvPoint*)_b;
//按x坐标从小到大排列,a的x坐标比b大,则交换位置
if( a->x > b->x ) return 1;
if( a->x < b->x ) return -1;
return 0;
}
void main()
{
CvMemStorage* storage = cvCreateMemStorage(0);
CvSeq* seq = cvCreateSeq( CV_32SC2, sizeof(CvSeq), sizeof(CvPoint), storage );
int i;
for( i = 0; i < 10; i++ )
{
CvPoint pt;
pt.x = rand();
pt.y = rand();
cvSeqPush( seq, &pt );
}
cvSeqSort( seq, cmp_func, 0 /* userdata is not used here */ );
/* print out the sorted sequence */
for( i = 0; i < seq->total; i++ )
{
CvPoint* pt = (CvPoint*)cvGetSeqElem( seq, i );
cout<<pt->x<<" "<<pt->y<<endl;
}
cvReleaseMemStorage( &storage );
system("pause");
}
Opencv官方文档中cvSeqSort()例子的解释请参看:
http://blog.163.com/jinlong_zhou_cool/blog/static/22511507320139154550734/
转载请注明作者和出处:http://blog.youkuaiyun.com/holamirai,未经允许请勿用于商业用途