下午在求homography的A矩阵。
程序功能:建立CvMat 赋值然后将mat打印出来。
实现方法:cvCreatMat() 创建矩阵
cvMat()给矩阵赋值
cvGetReal2D()提取矩阵元素,并打印
总结:整个过程不难,但是遇到一个bug始终没有搞明白。
我在 CvMat GetMatA()函数里创建并赋值矩阵mat_a,GetMatA()返回mat_a.
PrintMat(CvMat) 将GetMatA()返回的矩阵作为参数打印矩阵。
结果:矩阵在PrintMat中发生数据丢失。原因可能是GetMatA()函数返回时发生了数据丢失。
因此,以后要规范代码风格,在opencv中,不要将复杂的结构体作为return返回。应该采用
师兄建议的方法:
先定义一个变量,然后所有函数都引用该变量。
如: CvMat mat;
GetMatA(mat);
PrintMat(mat);
附代码
void PrintMat(CvMat* mat)
{
printf("the printmat func \n");
for(int i=0;i<8;i++)
{
for(int j=0;j<9;j++)
{
printf("%f ",cvGetReal2D(mat,i,j));
}
printf("\n");
}
}
void GetMatA()
{
//x
CvPoint left_11 = cvPoint(168,294);
CvPoint left_12 = cvPoint(346,283);
CvPoint left_21 = cvPoint(441,654);
CvPoint left_22 = cvPoint(151,580);
//x'
CvPoint right_11 = cvPoint(175,444);
CvPoint right_12 = cvPoint(333,386);
CvPoint right_21 = cvPoint(316,723);
CvPoint right_22 = cvPoint(82,667);
double mat_a_arry[72] =
{
0,0,0,-left_11.x,-left_11.y,-1,right_11.y*left_11.x,right_11.y*left_11.y,right_11.y,
left_11.x,left_11.y,1,0,0,0,-right_11.x*left_11.x,-right_11.x*left_11.y,-right_11.x,
0,0,0,-left_12.x,-left_12.y,-1,right_12.y*left_12.x,right_12.y*left_12.y,right_12.y,
left_12.x,left_12.y,1,0,0,0,-right_12.x*left_12.x,-right_12.x*left_12.y,-right_12.x,
0,0,0,-left_21.x,-left_21.y,-1,right_21.y*left_21.x,right_21.y*left_21.y,right_21.y,
left_21.x,left_21.y,1,0,0,0,-right_21.x*left_21.x,-right_21.x*left_21.y,-right_21.x,
0,0,0,-left_22.x,-left_22.y,-1,right_22.y*left_22.x,right_22.y*left_22.y,right_22.y,
left_22.x,left_22.y,1,0,0,0,-right_22.x*left_22.x,-right_22.x*left_22.y,-right_22.x,
};
CvMat* mat_a = cvCreateMat(8,9,CV_64FC1);
*mat_a = cvMat(8,9,CV_64FC1,mat_a_arry);
printf("array data \n");
sl::printMat(8,9,mat_a_arry);
PrintMat(mat_a);
}