opencv中 2D 或 3D 点集的直线拟合
代码参考:
http://hi.baidu.com/yuzaihuan/item/283d12f260513b43922af269
自己学习~
code:
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
#include <math.h>
int _tmain(int argc, _TCHAR* argv[])
{
IplImage* img = cvCreateImage( cvSize( 500, 500 ), 8, 3 );
CvRNG rng = cvRNG(-1); //cvRNG()跟一般的C语言srand()使用方法一样,要先给它一个种子,
//但srand()用到的是unsigned int的32位种子范围,而cvRNG()用的是64位长整数种子。
//初始化CvRNG资料结构,假如seed给0,它将会自动转成-1 cvRNG(64位种子)
cvNamedWindow( "fitline", 1 );
for(;;)
{
char key;
int i;
int count = cvRandInt(&rng)%100 + 1; //产生1-100 之间的数
int outliers = count/5; // 奇异点的个数。0--20 之间的数
printf("count = %d", count);
float a = cvRandReal(&rng)*200; // 0~ 199 之间的浮点数 [cvRandReal 浮点型随机数并更新 RNG ,范围在 0..1 之间,不包括 。
float b = cvRandReal(&rng)*40; //返回0 ~ 39之间的数
float angle = cvRandReal(&rng)*CV_PI;
printf("count = %f", angle);
float cos_a = cos(angle), sin_a = sin(angle);
printf("cos_a = %f", cos_a);
CvPoint pt1, pt2; //直线的两个端点
CvPoint* points = (CvPoint*)malloc( count * sizeof(points[0])); //存放随机产生的点点,数目为count
CvMat pointMat = cvMat( 1, count, CV