1.opencv的序列CvSeq中有一个函数可以按照用户设定的标准来拆分序列。
拆分操作需要申请新的内存用于存储结果,参数labels是指向序列的指针的指针,当函数调用结束时,参数labels中是一个整数序列,序列中的元素是跟序列seq中元素一一对应,这些参数的值从0开始递增,是拆分之后元素的类别的标志。is_euqal参数对应我们自己定义的比较函数,userdata为比较函数的参数。对随机生成的点进行模拟聚类,比较两个点之间的欧氏距离,小于特定的阈值时返回1.
源码:
#include "cxcore.h"
#include "highgui.h"
#include <stdio.h>
CvSeq* point_seq = 0;
IplImage* canvas = 0;
CvScalar* colors = 0;
int pos = 5;
int is_equal(const void* _a, const void* _b, void* userdata)
{
CvPoint a = *(const CvPoint*)_a;
CvPoint b = *(const CvPoint*)_b;
double threshold = *(double*)userdata;
return (double)(a.x - b.x)*(a.x - b.x) + (double)(a.y - b.y)*(a.y - b.y) <= threshold;
}
void on_track(int pos)
{
CvSeq* labels = 0; //声明输出标签
double threshold = pos*pos; //定义阈值为pos^2
int i