2012-06-14 13 views
9

Sólo sé C idioma, por lo que estoy recibiendo la confusión/no entender la sintaxis de los tipos de datos openCV particularmente en cv::Mat, CvMat*, Mat.convertido cv :: Mat a const CvMat * o * CvMat

Mi pregunta es ¿Cómo puede convierto cv::Mat a const CvMat * o CvMat*, y puede proporcionar cualquiera enlace de documentación para la diferencia entre CvMat *mat y cv::Mat y Mat en opencv2.4.

y ¿Cómo puedo convertir mis datos int para flotar datos en CvMat? Gracias

Respuesta

22

cv::Mat tiene una asignación funciona operator CvMat() tan simple:

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

Este utiliza los mismos datos subyacentes por lo que tiene que tener cuidado de que el cv::Mat no sale del ámbito antes de la CvMat.

Si necesita utilizar el CvMat en una API que tiene un CvMat*, a continuación, pasar la dirección del objeto:

functionTakingCmMatptr(&cvMat); 

En cuanto a la diferencia entre cv::Mat y Mat, que son los mismos. En los ejemplos OpenCV, a menudo se supone (y no creo que esta sea una buena idea) que se use using namespace cv.

+0

@ Gracias juanchopanza, ¿Puede proporcionar el enlace relacionado con las operaciones anteriores? y cómo puedo convertir mis tipos de datos en CvMat. Tengo los datos en mi CvMat es un número entero, ahora tengo que cambiar eso para flotar, ¿cómo puedo hacer eso? – surya

0

Para responder a la segunda pregunta, especialmente de Surya:

THB, la documentación sobre OpenCV no es la mejor. Aquí el enlace al tipo más nuevo: cv :: Mat http://docs.opencv.org/2.4/modules/core/doc/basic_structures.html#mat Los tipos más nuevos son más modernos que c estilo C++.

Aquí dos respuestas más foro OpenCV con un tema similar: http://answers.opencv.org/question/65224/conversion-between-cvmat-and-cvmat/ y http://www.answers.opencv.org/question/13437/difference-between-cvmat-cvmat-cvmat-and-mat/

Sobre todo por el problema de la conversión (como juanchopanza mencionado):

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: Por lo general, probablemente trabaje con CvMat*, pero debe pensar sobre cambiar completamente a los tipos más nuevos. Ejemplo (tomado de mi segundo link):

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

Cambio int flotar:

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

Los dos primeros ejemplos (sin el puntero) están bien como que, como el CvMat se lleva a cabo en el montón entonces . cvCreateMat(...) asigna memoria que tiene que liberar por su cuenta más tarde. Otra razón para usar cv::Mat.

Cuestiones relacionadas