code:
// vv.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include
#include
#include
#include "cvaux.h" //必须引此头文件
#include "cxcore.h"
using namespace std;
int main( int argc, char** argv )
{
int i = 0;
float b[6] = {0,};
float a[36] = {0,};
for( i = 0; i < 6; i++)
b[i] = i + 1; //b[i]存放那六个系数
CvMat *Mb = cvCreateMat(6, 1, CV_32FC1); //创建 6行1列 矩阵Mb
cvSetData(Mb,b,CV_AUTOSTEP); //给矩阵复制
for( i=0;i<6;i++) //打印输出该矩阵
{
if(i % 3 == 0) printf("\n");
printf("%f\t",Mb->data.fl[i]);
}
printf("\n");
for( i = 0; i < 36; i++)
a[i] = i + 1;
CvMat *Ma = cvCreateMat(6, 6, CV_32FC1); //左边的坐标矩阵
cvSetData(Ma,a,CV_AUTOSTEP);
for( i=0;i<36;i++)
{
if(i%5==0) printf("\n");
printf("%f\t",Ma->data.fl[i]);
}
printf("\n");
CvMat* Mx = cvCreateMat(6, 1,CV_32FC1); //要求解的矩阵
cvSolve(Ma, Mb, Mx, CV_LU ); // solve (Ax=b) for x
for( i=0;i<6;i++)
{
if(i%3==0) printf("\n");
printf("%f\t",Mx->data.fl[i]);
}
cvReleaseMat(&Ma);
cvReleaseMat(&Mb);
cvReleaseMat(&Mx);
getchar();
return 0;
}
ps:
CV_32FC1 是32位数据,CV_64FC1的是64位数据。
前者类型的数据必须以指向32位数据类型的指针存取,否则会报错,而后者类型的数据必须以指向64位数据类型的指针存取,否则会报错。
也就是说,你如果用cv_32fc1,那么后面对该矩阵的输入输出的数据指针类型都应该是float,这在32位编译器上是32位浮点数,也就是单精度。
你如果用cv_64fc1,那么后面对该矩阵的输入输出的数据指针类型都应该是double,这在32位编译器上是64位浮点数,也就是双精度。
================-------------------------------------------------------=========================
CvMat的定义:
typedef struct CvMat
{
int type;
int step;
/* for internal use only */
int* refcount;
int hdr_refcount;
union
{
uchar* ptr;
short* s;
int* i;
float* fl;
double* db;
} data;
#ifdef __cplusplus
union
{
int rows;
int height;
};
union
{
int cols;
int width;
};
#else
int rows;
int cols;
#endif
}
CvMat;
=========
还要提一下, opencv 中 cvSolve 的几个默认参数。【求解线性系统或者最小二乘法问题】
int cvSolve( const CvArr* src1, const CvArr* src2, CvArr* dst, int method=CV_LU );
函数 cvSolve 解决线性系统或者最小二乘法问题 (后者用 SVD 方法可以解决)
如果使用 CV_LU 方法。 如果 src1 是非奇异的,该函数则返回 1 ,否则返回 0 ,在后一种情况下 dst 是无效的。
开始一直使用CV_LU,以为是解线性方程而已···结果算出来全是零。