opencv 中,使用cvSolve函数,求解线性方程组,或者最小二乘法问题
2013-05-05 17:47
393 查看
求解线性系统或者最小二乘法问题
int cvSolve( const CvArr* src1, const CvArr* src2, CvArr* dst, int method=CV_LU );
src1
输入矩阵
src2
线性系统的右部
dst
输出解答
method
解决方法(矩阵求逆) :
CV_LU - 最佳主元选取的高斯消除法
CV_SVD - 奇异值分解法 (SVD)
CV_SVD_SYM - 对正定对称矩阵的 SVD 方法
函数 cvSolve 解决线性系统或者最小二乘法问题 (后者用 SVD 方法可以解决):
dst = argmin |src1*X -src2|
如果使用 CV_LU 方法。 如果 src1 是非奇异的,该函数则返回 1 ,否则返回 0 ,在后一种情况下 dst 是无效的。
如:
u=(A*x+B*y+C)/(G*x+H*y+1);
v=(D*x+E*y+F)/(G*x+H*y+1);
见下关系:
* / x0 y0 1 0 0 0 -x0*u0 -y0*u0 \ /c00\ /u0\
* | x1 y1 1 0 0 0 -x1*u1 -y1*u1 | |c01| |u1|
* | x2 y2 1 0 0 0 -x2*u2 -y2*u2 | |c02| |u2|
* | x3 y3 1 0 0 0 -x3*u3 -y3*u3 |.|c10|=|u3|,
* | 0 0 0 x0 y0 1 -x0*v0 -y0*v0 | |c11| |v0|
* | 0 0 0 x1 y1 1 -x1*v1 -y1*v1 | |c12| |v1|
* | 0 0 0 x2 y2 1 -x2*v2 -y2*v2 | |c20| |v2|
* \ 0 0 0 x3 y3 1 -x3*v3 -y3*v3 / \c21/ \v3/
int numPoints=10;
double **a=new double *[2*numPoints];
for(int i = 0; i <2*numPoints;i++)
a[i] = new double[8];
double *b =new double[2*numPoints];
CvMat A = cvMat (2*numPoints,8, CV_64F, a);
CvMat B = cvMat (2*numPoints,1, CV_64F, b);
CvMat *X = cvCreateMat (8, 1, CV_64F);
for( int i = 0; i <numPoints; ++i )
{
a[i][0] = a[i+numPoints][3] =points1[i].x;
a[i][1] = a[i+numPoints][4] =points1[i].y;
a[i][2] = a[i+numPoints][5] = 1;
a[i][3] = a[i][4] = a[i][5] =0;
a[i+numPoints][0] = a[i+numPoints][1] = a[i+numPoints][2] = 0;
a[i][6] = -points1[i].x*points2[i].x;
a[i][7] = -points1[i].y*points2[i].x;
a[i+numPoints][6] = -points1[i].x*points2[i].y;
a[i+numPoints][7] = -points1[i].y*points2[i].y;
b[i] =points2[i].x;
b[i+numPoints] =points2[i].y;
}
cvSolve(&A,&B,X,CV_SVD);
for(int i=0;i<8;i++)
cvmSet(H_Mat2,i/3,i%3,cvmGet(X,i,0));
cvmSet(H_Mat2,2,2,1.0);
for(int i = 0; i<2*numPoints;i++)
{
delete [8]a[i];
a[i]=NULL;
}
delete [2*numPoints]a;
delete [2*numPoints]b;
a=NULL;
b=NULL;
int cvSolve( const CvArr* src1, const CvArr* src2, CvArr* dst, int method=CV_LU );
src1
输入矩阵
src2
线性系统的右部
dst
输出解答
method
解决方法(矩阵求逆) :
CV_LU - 最佳主元选取的高斯消除法
CV_SVD - 奇异值分解法 (SVD)
CV_SVD_SYM - 对正定对称矩阵的 SVD 方法
函数 cvSolve 解决线性系统或者最小二乘法问题 (后者用 SVD 方法可以解决):
dst = argmin |src1*X -src2|
如果使用 CV_LU 方法。 如果 src1 是非奇异的,该函数则返回 1 ,否则返回 0 ,在后一种情况下 dst 是无效的。
如:
u=(A*x+B*y+C)/(G*x+H*y+1);
v=(D*x+E*y+F)/(G*x+H*y+1);
见下关系:
* / x0 y0 1 0 0 0 -x0*u0 -y0*u0 \ /c00\ /u0\
* | x1 y1 1 0 0 0 -x1*u1 -y1*u1 | |c01| |u1|
* | x2 y2 1 0 0 0 -x2*u2 -y2*u2 | |c02| |u2|
* | x3 y3 1 0 0 0 -x3*u3 -y3*u3 |.|c10|=|u3|,
* | 0 0 0 x0 y0 1 -x0*v0 -y0*v0 | |c11| |v0|
* | 0 0 0 x1 y1 1 -x1*v1 -y1*v1 | |c12| |v1|
* | 0 0 0 x2 y2 1 -x2*v2 -y2*v2 | |c20| |v2|
* \ 0 0 0 x3 y3 1 -x3*v3 -y3*v3 / \c21/ \v3/
int numPoints=10;
double **a=new double *[2*numPoints];
for(int i = 0; i <2*numPoints;i++)
a[i] = new double[8];
double *b =new double[2*numPoints];
CvMat A = cvMat (2*numPoints,8, CV_64F, a);
CvMat B = cvMat (2*numPoints,1, CV_64F, b);
CvMat *X = cvCreateMat (8, 1, CV_64F);
for( int i = 0; i <numPoints; ++i )
{
a[i][0] = a[i+numPoints][3] =points1[i].x;
a[i][1] = a[i+numPoints][4] =points1[i].y;
a[i][2] = a[i+numPoints][5] = 1;
a[i][3] = a[i][4] = a[i][5] =0;
a[i+numPoints][0] = a[i+numPoints][1] = a[i+numPoints][2] = 0;
a[i][6] = -points1[i].x*points2[i].x;
a[i][7] = -points1[i].y*points2[i].x;
a[i+numPoints][6] = -points1[i].x*points2[i].y;
a[i+numPoints][7] = -points1[i].y*points2[i].y;
b[i] =points2[i].x;
b[i+numPoints] =points2[i].y;
}
cvSolve(&A,&B,X,CV_SVD);
for(int i=0;i<8;i++)
cvmSet(H_Mat2,i/3,i%3,cvmGet(X,i,0));
cvmSet(H_Mat2,2,2,1.0);
for(int i = 0; i<2*numPoints;i++)
{
delete [8]a[i];
a[i]=NULL;
}
delete [2*numPoints]a;
delete [2*numPoints]b;
a=NULL;
b=NULL;
相关文章推荐
- OpenCV的中求解线性问题或者最小二乘问题的方法cv::solve
- 使用梯度下降与牛顿法求解最小平方和问题
- 在新建FileInputStream时使用当前相对路径或者绝对路径作为参数的问题
- 解决使用了float后IE6下li高度比Firefox或者IE8高的问题
- 初学者使用OpenCV常见问题
- 求解最小数字:暴力破解 外加 对字符串的使用
- 使用高版本OpenCV时应该注意的问题
- VS2003升级到2005后使用AjaxControlToolkit的一诡异问题(已找到解决办法,求解原因)
- AtCoder Beginner Contest 085 C Otoshidama(计算机整数乘法问题+方程求解)
- 12.解决CCScale9Sprite或者CCControlButton无法使用的问题。
- java配置文件或者eclipse中url等使用造成程序报错问题
- 解决 ”不允许在查询中显式构造实体类型“问题及使用其他方法实现返回 List<Model对象>或者IQueryable<Model对象>对象
- win7 64位下自行编译OpenCV2.4.10+CUDA toolkit 5.5的整个过程以及需要注意的问题(opencv+cuda并行计算元素的使用)
- 使用C#求解N皇后问题。
- 使用vue打包时vendor文件过大或者是app.js文件很大的问题
- 使用OpenCV训练Haar like+Adaboost分类器的常见问题
- 关于解决在使用opencv时出现*.exe 已触发了一个断点的问题
- eclipse 使用问题,按F3或者ctrl+click事件时,“current text selection cannot be opened in an editor”
- 使用动态内存求解任意矩阵的乘法
- 使用opencv_python进行视频分析遇到的bgsegm问题