2012-06-14 48 views
9

我只知道Ç語言,所以我越來越困惑/不理解openCV數據類型的語法,特別是在cv::Mat, CvMat*, Mat.轉換CV ::墊爲const * CvMat中CvMat中或*

我的問題是如何能我轉換cv::Matconst CvMat *或CvMat*,並且可以在任何一個在opencv2.4提供文檔鏈接,CvMat *matcv::MatMat之間的差異。

以及如何將我的int數據轉換爲CvMat中的浮點數據? 謝謝

回答

22

cv::Matoperator CvMat()這麼簡單分配工作:

cv::Mat mat = ....; 
CvMat cvMat = mat; 

中採用相同的基礎數據,所以你必須要小心的是,cv::Mat不出去的範圍CvMat之前。

如果需要,需要一個CvMat*的API中使用CvMat,然後傳遞對象的地址:

functionTakingCmMatptr(&cvMat); 

至於cv::MatMat之間的區別,它們是相同的。在OpenCV的例子中,經常假設(並且我不認爲這是個好主意),使用using namespace cv

+0

@謝謝juanchopanza,能否提供與上述操作相關的鏈接。以及如何在CvMat中轉換我的數據類型。我的數據在我的CvMat中是整數,現在我必須將其改爲float,我該怎麼做? – surya

0

要回答特別蘇里亞的第二個問題:

泰銖,上OpenCV的文件是不是最好的。 這裏是最新類型的鏈接:cv :: Mat http://docs.opencv.org/2.4/modules/core/doc/basic_structures.html#mat新類型比c風格更現代的C++。

這裏有兩個以上的OpenCV論壇回答了類似的話題:http://answers.opencv.org/question/65224/conversion-between-cvmat-and-cvmat/http://www.answers.opencv.org/question/13437/difference-between-cvmat-cvmat-cvmat-and-mat/

特別是對於轉化問題(如juanchopanza提到):

cv::Mat mat = cv::Mat(10, 10, CV_32FC1); //CV_32FC1 equals float 
             //(reads 32bit floating-point 1 channel) 
CvMat cvMat = mat; 

using namespace cv; //this should be in the beginning where you include 
Mat mat = Mat(10, 10, CV_32FC1); 
CvMat cvMat = mat; 

注意:通常你可能會使用CvMat* - 但你應該考慮關於完全切換到較新的類型。實施例(從我的第二連桿截取):

CvMat* A = cvCreateMat(10, 10, CV_32F); //guess this works fine with no channels too 

改變INT浮動:

CvMat* A = cvCreateMat(10, 10, CV_16SC1); 
//Feed A with data 
CvMat* B = cvCreateMat(10, 10, CV_32FC1); 
for(int i=0; i<10; ++i) 
    for(int i=0; i<10; ++i) 
     CV_MAT_ELEM(*A, float, i, j) = (float) cvmGet(B, i, j); 
//Don't forget this unless you want to produce a memory leak. 
cvReleaseMat(&A); 
cvReleaseMat(&B); 

前兩個例子(不指針)是細等,作爲與CvMat被保持在堆上然後。 cvCreateMat(...)分配內存,您必須稍後自行釋放內存。使用cv::Mat的另一個原因。