Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pixel access in OpenCV 2.2

Hi I want to use opencv to tell me the pixel values of a blank and white image so the output would look like this

10001
00040
11110   
00100

Here is my current code but I'm not sure how to access the results of the CV_GET_CURRENT call.. any help ?

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

  }
}
like image 453
macarthy Avatar asked Jan 20 '11 00:01

macarthy


2 Answers

In opencv 2.2, I'd use the C++ interface.

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;
    }
}
like image 108
etarion Avatar answered Oct 12 '22 13:10

etarion


IplImage struct have a variable char* imageData - it's just a buffer of all pixels. To read it properly you have to know your image format. For example for RGB888 image 3 first chars in imageData array will represent the r,g,b values of the first pixel at the first row. If you know the image format - you can read the data properly. Image format can be restored reading another values of IplImage structure:

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

Also i think it's more efficient to write the loop like this:

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

This code is for RGB888 image

like image 31
Andrew Avatar answered Oct 12 '22 11:10

Andrew