2011-01-20 9 views
12

Ciao voglio usare OpenCV per dirmi i valori dei pixel di un'immagine vuota e bianca così l'output sarà simile a questaaccesso Pixel in OpenCV 2.2

10001 
00040 
11110 
00100 

Ecco il mio codice attuale, ma io sono non sai come accedere ai risultati della chiamata CV_GET_CURRENT .. qualche aiuto?

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 

    } 
} 

risposta

23

In opencv 2.2, userei l'interfaccia 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

Lo stesso può essere fatto usando IplImage. ?? Se sì, potresti per favore gettare un po 'di luce su ... – Frankenstein

+0

@Frankenstein La risposta di Andrews mostra un modo per accedere ai pixel con IplImage. – etarion

2

IplImage struct hanno una variabile char* imageData - è solo un buffer di tutti i pixel. Per leggerlo correttamente devi conoscere il tuo formato di immagine. Ad esempio per i primi 10 caratteri dell'immagine RGB888 nell'array imageData rappresenteranno i valori r, g, b del primo pixel nella prima riga. Se conosci il formato dell'immagine, puoi leggere i dati correttamente. Formato immagine può essere ripristinato leggere altri valori di struttura IplImage:

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

Inoltre penso che sia più efficiente di scrivere il ciclo come questo:

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]; 
    } 
} 

Questo codice è immagine RGB888 per

+0

Il link è rotto –

2

IplImage è il vecchio formato per le immagini. Dovresti usare il nuovo formato, CvMat, che può memorizzare matrici arbitrarie. Un'immagine è solo una matrice, dopo tutto.

È quindi possibile accedere ai pixel utilizzando la funzione cvGet2D, che restituisce un CvScalar.

+0

Grazie Ho appena visto che nei documenti 2.1 per Mat, cambierò a quello ,,, – macarthy

+0

realtà Carnieri, c'è qualche possibilità che mi può mostrare come il suo fare utilizzando Mat, sembra molto cambiato dalle versioni 1. * – macarthy

+0

versione cvMat in http://stackoverflow.com/questions/1824787/opencv-multi-channel-elemnt-access –

Problemi correlati