2012-06-14 13 views
9

So solo C lingua, così sto ottenendo confusione/non capire la sintassi dei tipi di dati openCV particolare in cv::Mat, CvMat*, Mat.convertito cv :: Mat a const CvMat * o * CvMat

La mia domanda è come può converto cv::Mat-const CvMat * o CvMat*, e uno può fornire la documentazione per collegamento differenza tra CvMat *mat e cv::Mat e Mat in opencv2.4.

e Come posso convertire i miei dati int in dati mobili in CvMat? Grazie

risposta

22

cv::Mat ha un operator CvMat() in modo semplice assegnazione funziona:

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

Questo utilizza gli stessi dati, quindi bisogna stare attenti che il cv::Mat non va fuori portata prima della CvMat.

Se è necessario utilizzare il CvMat in un'API che richiede un CvMat*, poi passare l'indirizzo dell'oggetto:

functionTakingCmMatptr(&cvMat); 

quanto riguarda la differenza tra cv::Mat e Mat, sono gli stessi. Negli esempi OpenCV, si presuppone spesso (e non penso sia una buona idea) che venga utilizzato using namespace cv.

+0

@ Grazie juanchopanza, puoi fornire il collegamento relativo alle operazioni di cui sopra. e come posso convertire i miei tipi di dati in CvMat. Ho i dati nel mio CvMat è intero, ora devo cambiarlo per farlo galleggiare, come posso farlo? – surya

0

Per rispondere seconda domanda in particolare di Surya:

THB, la documentazione sul OpenCV non è il migliore. Qui il link al nuovo tipo: cv :: Mat http://docs.opencv.org/2.4/modules/core/doc/basic_structures.html#mat I nuovi tipi sono più moderni di C++ come lo stile c.

Qui due risposte più OpenCV forum con un argomento simile: http://answers.opencv.org/question/65224/conversion-between-cvmat-and-cvmat/ e http://www.answers.opencv.org/question/13437/difference-between-cvmat-cvmat-cvmat-and-mat/

Soprattutto per il problema di conversione (come juanchopanza menzionato):

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

o con

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

Nota: solitamente lavorerai con CvMat* - ma dovresti pensare riguardo al passaggio ai nuovi tipi completamente. Esempio (preso dal mio secondo link):

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

Modifica int galleggiare:

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); 

I primi due esempi (sul puntatore) sono bene così come CvMat è tenuto sul mucchio allora . cvCreateMat(...) alloca la memoria che devi liberare da solo in seguito. Un altro motivo per utilizzare cv::Mat.

Problemi correlati