一、OpenCV 中CvMat* 与CvMat 定义一定要留意,不然在cvInvert(CvMat*,CvMat*),cvReshape(),cvMatMul()等函数的调用中,编译通过,但运行时出错.
例如:CvMat aa;
CvMat* bb;
则: cvInvert(&aa,bb),
若写成: cvInvert(&aa, &bb),运行时出错。
二、cvMatMul(CvMat*,CvMat*,CvMat*)中的三个parameters 都应该是CV_64F类型,如果有CV_32F则计算报错。
三、怎样把 vector<CvPoint3D32f> _Points(pNum);关联的Mat 的三个点数据用一个函数取出来赋给一个新的3*1的Mat?
例如:vector<CvPoint3D64f> _Points(455124);
CvMat points=cvMat(1,455124,CV_64F,&_Points[0]);
CvMat temPoints;
cvReshape(&points,&temPoints,1,3);
然而得到的新的 temPoints却变成了3*151708, 而不是想要的3*455124。
解决办法 1、在第二行code中改成:CvMat points=cvMat(3,455124,CV_64F,&_Points[0]);
或 2、 改成:CvMat points=cvMat(1,455124,CV_64FC3,&_Points[0]);
因为用外部数据 建立矩阵时, 是从外部数据开始位置往下走,根据内存,取够所定义的 元素个数(如1*455124) 为止,多余的数据不会管它,所以要想取得 vector : _Points(455124);的所有元素 就得 有(3*455124)个64F 内存元素(方法1)。
或者 建立cvMat时 就建立3 channel (方法2)。