Пиксельный доступ в OpenCV 2.2 - PullRequest
12 голосов
/ 20 января 2011

Привет! Я хочу использовать opencv, чтобы сообщить мне значения пикселей пустого и белого изображения, чтобы вывод выглядел такполучить доступ к результатам CV_GET_CURRENT вызова .. любая помощь?

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

  }
}

Ответы [ 3 ]

23 голосов
/ 20 января 2011

В opencv 2.2 я бы использовал интерфейс 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;
    }
}
2 голосов
/ 20 января 2011

IplImage - старый формат изображений.Вы должны использовать новый формат CvMat, который может хранить произвольные матрицы.В конце концов, изображение - это просто матрица.

Затем вы можете получить доступ к пикселям, используя функцию cvGet2D , которая возвращает CvScalar.

2 голосов
/ 20 января 2011

В структуре IplImage есть переменная char* imageData - это просто буфер всех пикселей.Чтобы прочитать его правильно, вы должны знать свой формат изображения.Например, для изображения 3 RGB888 первые символы в массиве imageData будут представлять значения r, g, b первого пикселя в первой строке.Если вы знаете формат изображения - вы можете прочитать данные правильно.Формат изображения может быть восстановлен, читая другие значения структуры IplImage:

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

Также я думаю, что более эффективно написать цикл следующим образом:код для изображения RGB888

...