cvSeqSort函数详细说明

转自:http://blog.163.com/jinlong_zhou_cool/blog/static/22511507320139154550734/
1、向seq容器添加一系列的CvPoint对象
2、定义cmp_func
3、调用cvSeqSort,该函数会在内部迭代seq,并每次从seq中取两个CvPoint对象出来作为a、b传入cmp_func,并且根据cmp_func的返回结果来调整这两个对象在seq中的相对位置,返回值是1,就调整序列元素位置。

[cpp] view plaincopy

  1. static int near_num_cmp(void* _a,void* _b,void* userdata )  
  2. {  
  3.     pt_near* a =(pt_near*)_a;  
  4.     pt_near* b =(pt_near*)_b;  
  5.     return a->field_num>b->field_num ? -1 : a->field_num<b->field_num ? 1:0;  
  6. }  

cvSeqSort(pt_seq_a,(CvCmpFunc)near_num_cmp, 0);

//最终达到点的领域点数从大到小的排列

要达到小到大的顺序,只需将return a->field_num>b->field_num ? -1 : a->field_num<b->field_num ? 1:0;的>和<互换下

void cvSeqSort( CvSeq* seq, CvCmpFunc func, void* userdata=NULL );

seq

待排序的序列

func

比较函数,按照元素间的大小关系返回负数,零,正数(见:上面的声明和下面的例子) --相关函数为 C 运行时库中的 qsort, 后者(qsort)不使用参数userdata.

userdata

传递给比较函数的用户参数;有些情况下,可避免全局变量的使用

函数 cvSeqSort 使用特定的标准对序列进行排序。下面是一个使用该函数的实例

 

#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
#include "stdio.h"
#pragma comment(lib,"cv.lib")
#pragma comment(lib,"cxcore.lib")
#pragma comment(lib,"highgui.lib")

CvSeq* pointSort(CvSeq* seq);

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 );
}
for( i = 0; i < seq->total; i++ )
{
    CvPoint* pt = (CvPoint*)cvGetSeqElem( seq, i );
    printf("( %d %d )\n",pt->x,pt->y );
}
printf("\n");
pointSort(seq);

/* print out the sorted sequence */
for( i = 0; i < seq->total; i++ )
{
    CvPoint* pt = (CvPoint*)cvGetSeqElem( seq, i );
    printf("( %d %d )\n",pt->x,pt->y );
}

cvReleaseMemStorage( &storage );
}
//cmp_func()函数的定义必须独立于其他函数定义
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 x_diff ? x_diff : 0;
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)
CvSeq* pointSort(CvSeq* seq)
{

cvSeqSort( seq, cmp_func, 0 /* userdata is not used here */ );
return seq;
}

cvSeqSort函数详细说明 - jinlong_zhou_cool - 蓝梦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值