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 的数值;使用中一定小心,切记:

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


你可能感兴趣的:(cvGetRow使用问题详解)