【bug】opencv 矩阵操作

        下午在求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);
 
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值