cvGetRow使用问题详解

本文详细解析了OpenCV中的cvGetRow函数,强调该函数取出的是矩阵的行地址,并非复制行数据。因此,修改通过cvGetRow获取的行会直接影响原矩阵的数据。此外,还提到了该函数可能存在的内存泄漏问题。
误区解释:用cvGetRow取出指定行,其实就是取出指向指定行的地址

   函数定义:            

CvMat* cvGetRow(const CvArr* arr, CvMat* submat, int row)


在OPenCV里边,将矩阵的头部和数据部分分开处理。

所以,此函数submat 返回子矩阵头(即其取出指定行的地址,submat的地址和arr地址相同,已可以理解为应用)

所以使用cvgetrow后取出的子矩阵不能再对其操作,否则将改变原矩阵数值

下边是我的测试:

int main()
{
    double a[]={ 1,2,3,
                          3,4,4,
                          5,6,4};
    double b[]={ 7,8,4,
                         9,10,4,
                         11,12,4};
    CvMat   *Lpoints=&cvMat(3,3,CV_64FC1,a);
    CvMat   *Rpoints=&cvMat(3,3,CV_64FC1,b);
    CvMat* R=cvCreateMat(3,3,CV_64FC1);
    CvMat* T=cvCreateMat(3,1,CV_64FC1);
    CvMat* arow=cvCreateMat(1,3,CV_64FC1);
    cvGetRow(Lpoints,arow,0);
    cout<<Lpoints<<"   "<<arow<<endl;
    cvmSet(arow,0,0,10);
    //for(int i=0;i<10;i++)
    //{
        //SVD_RT(R,T,Lpoints,Rpoints);
    //}
    for (int i=0;i<Lpoints->rows;i++)
    {
        for (int j=0;j<Lpoints->cols;j++)
        {
            cout<<"      "<<cvmGet(Lpoints,i,j);
        }
        cout<<endl;
    }
    for (int i=0;i<arow->rows;i++)
    {
        for (int j=0;j<arow->cols;j++)
        {
            cout<<"      "<<cvmGet(arow,i,j);
        }
        cout<<endl;
    }
    cvReleaseMat(&arow);
    cvReleaseMat(&R);
    cvReleaseMat(&T);
    system("pause");
    return 0;
}

下边是运行结果:
      10      2      3
      3      4      4
      5      6      4


      10      2      3
请按任意键继续. . .

其在取出0行改变第一个数值后,也改变了原始矩阵a 的数值;使用中一定小心,切记:

例外,此函数还有内存泄露问题;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值