一、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)。