2011-01-20 4 views
12

Salut Je veux utiliser OpenCV pour me dire les valeurs de pixel d'une image vierge et blanc de sorte que la sortie se présente comme suitaccès Pixel OpenCV 2.2

10001 
00040 
11110 
00100 

Voici mon code actuel mais je suis pas sûr comment accéder aux résultats de l'appel CV_GET_CURRENT .. toute aide?

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 

    } 
} 

Répondre

23

En opencv 2.2, j'utiliserais l'interface 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

Peut-on faire de même avec IplImage? Si oui, pourriez-vous s'il vous plaît jeter un peu de lumière sur .. – Frankenstein

+0

@Frankenstein Andrews réponse montre un moyen d'accès aux pixels avec IplImage. – etarion

2

struct IplImage ont une variable char* imageData - il est juste un tampon de tous les pixels. Pour le lire correctement, vous devez connaître votre format d'image. Par exemple pour l'image RGB888 3, les premiers caractères du tableau imageData représenteront les valeurs r, g, b du premier pixel de la première rangée. Si vous connaissez le format de l'image, vous pouvez lire les données correctement. Format d'image peut être restaurée lire une autre valeur de la structure IplImage:

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

Je pense aussi qu'il est plus efficace d'écrire la boucle comme ceci:

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

Ce code est pour l'image RGB888

+0

Le lien est rompu –

2

IplImage est l'ancien format pour les images. Vous devriez utiliser le nouveau format, CvMat, qui peut stocker des matrices arbitraires. Une image est juste une matrice, après tout.

Vous pouvez ensuite accéder aux pixels à l'aide de la fonction cvGet2D, qui renvoie un CvScalar.

+0

Merci, je viens de voir que dans les documents 2.1 pour Mat, je vais changer à cette ,,, – macarthy

+0

En fait Carnieri, est-il une chance que vous pouvez me montrer comment son fait à l'aide Mat, semble beaucoup a changé depuis les versions 1. * – macarthy

+0

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