2012-03-09 13 views
5

Estoy implementando un algoritmo de procesamiento de imágenes en C++ usando openCV, en el cual el primer paso requiere que la imagen se convierta en una matriz. Sé que cuando una imagen se carga en openCV, ya está almacenada como una matriz. La imagen que estoy usando tiene un tamaño de 80 x 60, así que supongo que la matriz en la que está almacenada es de un tamaño de 80 x 60. Sin embargo, me gustaría poder ver primero esta matriz y luego poder remodelarla en una matriz con el mismo no. de píxeles, pero como una columna larga en su lugar. es decir, la matriz de 80 x 60 se convertiría ahora en una matriz de 4800 x 1. Intenté investigar libros de texto y en línea, pero fue en vano. Este es mi código hasta ahora. En cualquier caso, no está funcionando porque no puedo, no puedo convertir de 'IplImage *' a 'CvMat *, pero ¿cómo se supone que debo asignar mis valores de píxel a la matriz después de crearla? Por favor, agradecería mucho si alguien pudiera ayudarme con este código.Cómo obtener una matriz de píxeles y remodelar la matriz en openCV

#include "cv.h" 
#include "highgui.h" 
#include "iostream" 

using namespace std; 
int main(int argc, char* argv) { 
IplImage* img0 = NULL; 
CvMat* img0_mat = NULL ; 
img0 = cvLoadImage("C:\\new\\walk mii.jpg"); 
if (!img0){ 
    return -1;} 
img0_mat = cvCreateMat(80, 60, 1); 
img0_mat = img0; 
cout <<" matrix " << img0 << endl; 

cvWaitKey(0); 
return 0; 
} 
+0

Solo como información: opencv no almacena imágenes en matrices en el sentido de 'int [] []'. Internamente usa solo una dimensión, como 'char []'. – vsz

Respuesta

1

Se podría llamar Mat::reshape(int cn, int rows=0):

El método hace una nueva cabecera para la matriz * estos elementos. La nueva matriz puede tener diferente tamaño y/o diferente número de canales. Cualquier combinación es posible, siempre y cuando:

1) No se incluyen elementos adicionales en la nueva matriz y no se excluyen elementos. En consecuencia, el producto

2) rows * cols * channels() deben permanecer iguales después de la transformación.

No se copian datos, es decir, esta es O (1) operación. En consecuencia, si cambia el número de filas, o la operación cambia los índices de filas de los elementos de alguna otra manera, la matriz debe ser continua. Ver Mat :: isContinuous().

... parece que está utilizando una versión anterior de la biblioteca, así que quiere cvReshape. Algo como esto debería funcionar:

#include "cv.h" 
#include "highgui.h" 
#include "iostream" 
using namespace std; 

int main(int argc, char* argv) 
{ 
    IplImage* img0 = NULL; 
    CvMat* img0_mat = NULL ; 
    img0 = cvLoadImage("C:\\new\\walk mii.jpg"); 
    img0_mat = cvCreateMat(80, 60, 1); 

    CvMat row_header, *row; 
    row = cvReshape(img0_mat, &row_header, 0, 1); 

    cout << " matrix " << row->tostring() << endl; 

    cvWaitKey(0); 
    return 0; 
} 
+0

Esto también podría ser de interés: http://stackoverflow.com/questions/7125452/how-am-i-supposed-to-use-cvreshape –

+0

Muchas gracias por su ayuda, Sr. Cage. Tu código funcionó. Sin embargo, el resultado fue la matriz 0032FC38. Espero no estar haciendo una pregunta tonta, pero ya estoy frustrado, así que podría ser así. ¿No se suponía que el número de filas sería 4800? Además, ¿cómo puedo obtener los valores de píxel de mi imagen img0 en la matriz img0_mat que se creó? –

+0

0032FC38 sería la dirección del puntero de la fila en lugar de los contenidos. Si lees la documentación de cvReshape, te dice que no asigna más almacenamiento; solo da una nueva forma de acceder a los datos. –

Cuestiones relacionadas