函数定义:
在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 的数值;使用中一定小心,切记:
例外,此函数还有内存泄露问题;