2011-01-20 13 views
12

Hola Quiero utilizar OpenCV decirme los valores de los píxeles de una imagen en blanco y negro lo que la salida se vería asíacceso píxel en OpenCV 2.2

10001 
00040 
11110 
00100 

Aquí está mi código actual, pero estoy no estoy seguro de cómo acceder a los resultados de la llamada CV_GET_CURRENT .. alguna ayuda?

IplImage readpix(IplImage* m_image) { 


    cout << "Image width : " << m_image->width << "\n"; 
    cout << "Image height : " << m_image->height << "\n"; 
    cout << "-----------------------------------------\n"; 


    CvPixelPosition8u position; 

    CV_INIT_PIXEL_POS(position, (unsigned char*)(m_image->imageData), m_image->widthStep, cvSize(m_image->width, m_image->height), 0, 0, m_image->origin); 

    for(int y = 0; y < m_image->height; ++y) // FOR EACH ROW 
    { 
    for(int x = 0; x < m_image->width; ++x) // FOR EACH COL 
     { 
     CV_MOVE_TO(position, x, y, 1); 
     unsigned char colour = *CV_GET_CURRENT(position, 1); 

// I want print 1 for a black pixel or 0 for a white pixel 
// so i want goes here 


     } 

    cout << " \n"; //END OF ROW 

    } 
} 

Respuesta

23

En opencv 2.2, utilizaría la interfaz C++.

cv::Mat in = /* your image goes here, 
       assuming single-channel image with 8bits per pixel */ 
for(int row = 0; row < in.rows; ++row) { 
    unsigned char* inp = in.ptr<unsigned char>(row); 
    for (int col = 0; col < in.cols; ++col) { 
     if (*inp++ == 0) { 
      std::cout << '1'; 
     } else { 
      std::cout << '0'; 
     } 
     std::cout << std::endl; 
    } 
} 
+0

¿Se puede hacer lo mismo usando IplImage. ?? Si es así, ¿podría por favor arrojar algo de luz sobre .. – Frankenstein

+0

@Frankenstein Andrews responde que muestra una forma de acceder a píxeles con IplImage. – etarion

2

IplImage estructura tienen una variable char* imageData - es sólo un buffer de todos los píxeles. Para leerlo correctamente, debes conocer tu formato de imagen. Por ejemplo, para la imagen 3 de RGB888, los primeros caracteres en la matriz imageData representarán los valores r, g, b del primer píxel en la primera fila. Si conoce el formato de imagen, puede leer los datos correctamente. Formato de imagen se puede restaurar la lectura de otros valores de la estructura IplImage:

http://opencv.willowgarage.com/documentation/basic_structures.html

También creo que es más eficiente para escribir el bucle de la siguiente manera:

uchar r,g,b; 

for (int y = 0; y < cvFrame->height; y++) 
{ 
    uchar *ptr = (uchar*) (cvFrame_->imageData + y*cvFrame_->widthStep); 
    for (int x = 0; x < cvFrame_->width; x++) 
    {  
     r = ptr[3*x]; 
     g = ptr[3*x + 1]; 
     b = ptr[3*x + 2]; 
    } 
} 

Este código es la imagen RGB888 para

+0

El vínculo se rompe –

2

IplImage es el formato anterior para imágenes. Debe usar el nuevo formato, CvMat, que puede almacenar matrices arbitrarias. Una imagen es solo una matriz, después de todo.

A continuación, puede acceder a los píxeles utilizando la función cvGet2D, que devuelve un CvScalar.

+0

Gracias Acabo de ver que en los documentos de 2.1 Mat, voy a cambiar a la realidad ,,, – macarthy

+0

Carnieri, ¿hay alguna posibilidad de que me puede mostrar cómo se hace usando Mat, parece que ha cambiado mucho desde las versiones 1. * – macarthy

+0

versión cvMat en http://stackoverflow.com/questions/1824787/opencv-multi-channel-elemnt-access –

Cuestiones relacionadas