OpenCV中文网站例程——直线拟合cvFitline
来源:互联网 发布:怎么共享网络连wifi 编辑:程序博客网 时间:2024/05/19 14:37
转自:http://buaagc.blog.163.com/blog/static/72788394201211314450348/
OpenCV中 CvSeq 对象由以下语句生成
//创建 CvSeq的容器对象
CvMemStorage* storage = cvCreateMemStorage(0);
// 创建 CvSeq对象
// 第一个参数 生成后的序列的标志( 不甚解)
// 第二个参数 队列(Sequence)头的Size
// 第三个参数 节点的Size
// 第四个参数 存储CvSeq的容器对象
CvSeq* point_seq = cvCreateSeq( CV_32FC2, sizeof(CvSeq),sizeof(CvPoint2D32f), storage );
用完后,以下列形式释放内存
cvClearSeq(point_seq);
cvReleaseMemStorage(&storage);
向CvSeq中添加数据时:
cvSeqPush(point_seq, &cvPoint2D32f(x坐标,y坐标));
FitLine函数的用法:
// 二维空间点拟合时 是 float[4]
// 三位空间点拟合时 是 float[6]
float *line = new float[4];
// 第一个参数: 存储点序列
// 第二个参数: 拟合算法,其中 CV_DIST_L2 就是平常的最小二乘法
// 第三,第四,第五参数推荐值是0, 0.01, 0.01,
// 第六参数: line中存储返回值
// 二维空间时: line[0--3] 分别为 (vx, vy,x0, y0)
// 其中 vx, vy 是正规化之后的斜率向量。 x0,y0 是直线经过的点。
// 三维空间时:line[0--5] 分别是 (vx, vy,vz, x0, y0, z0) 。意义同上
cvFitLine(point_seq,CV_DIST_L2,0,0.01,0.01,line);
拟合程序::
#include <cv.h>
#include <stdio.h>
#include <math.h>
float myLinearity(CvSeq *);
int main(void)
{
int i;
double fx[] = {0.0, 0.301, 0.477, 0.602,0.699, 0.778, 0.845, 0.903, 0.954, 1.0};
double fy[] = {3.874, 3.202, 2.781, 2.49,2.274, 2.156, 1.934, 1.74, 1.653, 1.662};
float *line = new float[4];
float linearity=0.0f;
//Sequence的容器
CvMemStorage* storage = cvCreateMemStorage(0);
//三维空间的话,把CV_32FC2改为CV_32FC3、 把CvPoint2D32f 改为CvPoint3D32f
CvSeq* point_seq = cvCreateSeq( CV_32FC2,sizeof(CvSeq), sizeof(CvPoint2D32f), storage );
for (i=0; i<10; i++){
//向Sequence中追加元素
cvSeqPush(point_seq,&cvPoint2D32f(fx[i],fy[i]));
}
linearity = myLinearity(point_seq);
cvFitLine(point_seq,CV_DIST_L2,0,0.01,0.01,line);
fprintf(stdout,"v=(%f,%f),vy/vx=%f,(x,y)=(%f,%f),Linearity=%f/n",line[0],line[1],line[1]/line[0],line[2],line[3],linearity);
cvClearSeq(point_seq);
cvReleaseMemStorage(&storage);
delete line;
return 0;
}
//计算直线拟合度
float myLinearity(CvSeq *seq)
{
int i;
CvPoint2D32f *p;
float *x = new float[seq->total];
float *y = new float[seq->total];
float x_bar=0.0, y_bar=0.0;
float u11=0.0, u20=0.0, u02=0.0;
float linearity=0.0;
for (i=0; i < seq->total; i++){
p=(CvPoint2D32f*)cvGetSeqElem(seq,i);
x[i]=p->x;
y[i]=p->y;
}
//x_bar, y_bar
for (i=0; i < seq->total; i++){
x_bar+=x[i];
y_bar+=y[i];
}
x_bar/=seq->total;
y_bar/=seq->total;
for (i=0; i < seq->total; i++){
u11+=((x[i]-x_bar)*(y[i]-y_bar));
u20+=pow(x[i]-x_bar,2.0f);
u02+=pow(y[i]-y_bar,2.0f);
}
u11/=seq->total;
u20/=seq->total;
u02/=seq->total;
//计算直线度
linearity =sqrt(4*pow(u11,2.0f)+pow(u20-u02,2.0f))/(u20+u02);
delete x;
delete y;
return linearity;
}
- OpenCV中文网站例程——直线拟合cvFitline
- opencv中的直线拟合函数 cvFitLine
- opencv中的直线拟合函数 cvFitLine
- OpenCV—直线拟合fitLine
- cvFitLine直线拟合函数的应用
- OpenCV中文网站例程——Canny边缘检测
- OpenCV中文网站例程——轮廓检测2
- OpenCV中文网站例程——图像旋转和缩放
- OpenCV中文网站例程——Hough线段检测
- OpenCV中文网站例程——鼠标绘图,图像修复
- OpenCV中文网站例程——离散傅里叶变换DFT
- OpenCV中文网站例程——贝塞尔曲线绘制
- OpenCV中文网站例程——目标跟踪
- OpenCV中文网站例程——摄像头标定
- OpenCV中文网站例程——图像颜色分布直方图
- OpenCV中文网站例程——仿射变换
- OpenCV中文网站例程——单目标模板匹配
- OpenCV中文网站例程——多目标模板匹配
- MAC下极速简单分割合并文件技巧
- 解决SecureCRT连接总自动断开的问题
- history.back()返回页面失效问题解决方法
- Redis 1
- 安装Rational Rose启动报错:无法启动此程序,因为计算机中丢失 suite objects.dll。
- OpenCV中文网站例程——直线拟合cvFitline
- 关于android-support-v4.jar包的错误
- C语言中字符数组赋值方法
- 撒旦的点点滴滴的顶顶顶的
- 树--杂记()
- Java 利用第三方平台实现发送短信功能
- 内部类 final变量的生命周期
- hdu1556
- json乱码