Accès aux pixels dans OpenCV 2.2

Salut je veux utiliser opencv pour me dire les valeurs des pixels d'une image blanche et vierge donc la sortie ressemblerait à ceci

10001
00040
11110   
00100

Voici mon code actuel, mais je ne sais pas 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

  }
}
12
demandé sur karlphillip 2011-01-20 03:18:00

3 réponses

dans 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;
    }
}
23
répondu etarion 2011-01-20 09:23:04
La structure

D'IplImage a une variable char* imageData - c'est juste un tampon de tous les pixels. Pour le lire correctement, vous devez connaître votre format de l'image. Par exemple,pour l'image RGB888,3 premières barres dans le tableau imageData représenteront les valeurs r, g, b du premier pixel à la première rangée. Si vous connaissez le format d'image - vous pouvez lire les données correctement. Le format de l'Image peut être restauré en lisant d'autres valeurs de la structure de L'image:

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 RGB888 image

2
répondu Andrew 2011-01-20 00:59:42

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

vous pouvez alors accéder aux pixels en utilisant la fonction cvget2 , qui renvoie une CvScalar.

2
répondu carnieri 2011-01-20 01:01:27