2012-06-20 19 views

Respuesta

13

imread devuelve Mat, no CvMat. Son las dos interfaces diferentes (Mat/imread para C++ e Ipl ... y Cv .. para la interfaz C).

La interfaz C++ es más agradable, segura y fácil de usar. Automáticamente maneja la memoria por usted y le permite escribir menos código para la misma tarea. Los chicos OpenCV abogan por el uso de C++, a menos que algunos requisitos del proyecto muy específicas que obligan a C.

Ejemplo (C++)

cv::Mat image = imread("path/to/myimage.jpg") 
if(image.empty()) 
    return; 

cv::imshow("Image", image); 

cv::Mat bw = image > 128; // threshold image 
cv::Mat crop = image(cv::Rect(0, 0, 100, 100)); // a 100px x 100px crop 
crop= 0; // set image to 0 

cv::waitKey(); 
// end code here 

Tenga en cuenta que si no se indica lo contrario, hacen referencia a todas las asignaciones de matriz de los mismos datos . En el ejemplo anterior, los puntos crop matriz para image, y se establece a cero establecerán que parte específica de la image a 0.

Para crear una nueva copia de los datos, usar Mat :: copyTo, o Mat :: clon();

Y la interfaz de C

IplImage* pImg = CvLoadImage("path/to/myimage.jpg"); 
if(pImg == NULL) 
    return; 

// ... big bloat to do the same operations with IplImage  

CvShowImage("Image", pImg); 
cvWaitKey(); 
CvReleaseImage(&pImg); // Do not forget to release memory. 
// end code here 
0

IplImage y Mat son tanto inter-convertibles.

Le sugiero que utilice Mat e imread(), ya que es muy fácil obtener datos de Mat.

Mat :: data devuelve un puntero a los datos de matriz reales que en 1D y los valores son de fácil acceso. http://opencv.itseez.com/modules/core/doc/old_basic_structures.html?highlight=mat#union%20data

Si desea agregar conceptos de Aprendizaje automático en OpenCV para varios algoritmos de seguimiento (por ejemplo, OpenTLD), puede acceder fácilmente a los datos usando Mat.data para obtener un puntero a la matriz real.

Muchas de las utilidades de OpenCV (por ejemplo, CalcOpticalFlowPyrLK, etc.) requieren Mat. Sugeriría que uses Mat. IplImage es algo viejo ahora.

0

Esto depende de cuán cómodo se siente con pointers.In IplImage puede acceder a datos como

data[i*widthstep+j*nchannels +k] 

donde i, j, k son unos números enteros que se enfoque bastante fácil. En la matriz normal de 3 dimensiones no es tan fácil acceder a los datos. Para acceder a datos de la matriz normal es que a [i] [j]

*(*(a + i) + j) is the value of jth element of ith row in matrix a 
0

De OpenCV_2 libro de cocina:

Esta estructura fue heredado de la biblioteca IPL (que es el Intel Image Library Processing) ahora integrado con la biblioteca IPP (la biblioteca de Intel® Integrated Performance Primitive de Intel ).Si usa el código y las bibliotecas que se crearon con la antigua interfaz C, puede que necesite manipular esas estructuras IplImage. Afortunadamente, hay una forma conveniente de convertir una imagen Ipl en un objeto cv :: Mat.

IplImage * iplImage = cvLoadImage ("c: \ img.jpg"); cv :: Mat image4 (iplImage, false);

La función cvLoadImage es la función de interfaz C para cargar imágenes. El segundo parámetro en el constructor del objeto cv :: Mat indica que los datos no se copiarán (configúrelo en true si desea una nueva copia, mientras que false es el valor predeterminado, por lo que podría haberse omitido), esto es, tanto IplImage como image4 compartirán los mismos datos de imagen. Debe tener cuidado aquí para no crear punteros colgantes. Por esta razón, es más seguro encapsular el puntero IplImage en la clase de puntero de recuento de referencias proporcionada por OpenCV 2:

cv :: Ptr iplImage = cvLoadImage ("c: \ img.jpg");

De lo contrario, si es necesario desasignar la memoria apuntada por su estructura IplImage, que necesidad de hacerlo de forma explícita: cvReleaseImage (& iplImage); Recuerde, debe evitar el uso de esta estructura de datos desaprobados. En cambio, siempre use cv :: Mat.

Cuestiones relacionadas