OpenCV 2.2中的像素访问

12

大家好,我想使用OpenCV来获取黑白图像的像素值,使输出结果如下:

10001
00040
11110   
00100

这是我当前的代码,但我不确定如何访问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

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

同样的操作可以使用IplImage完成吗?如果可以,您能否请详细说明一下。 - Frankenstein
@Frankenstein Andrews的回答展示了一种使用IplImage进行像素访问的方法。 - etarion

2

IplImage结构体有一个变量char* imageData,它只是所有像素的缓冲区。要正确读取它,您必须知道图像格式。例如,对于RGB888图像,imageData数组中的前3个字符将表示第一行第一个像素的r、g、b值。如果您知道图像格式,则可以正确读取数据。可以通过阅读IplImage结构的其他值来恢复图像格式:

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

此外,我认为写循环的效率更高应该像这样:

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

这段代码适用于RGB888格式的图像。


链接已经失效。 - Shmil The Cat

2

IplImage是旧的图像格式。你应该使用新的格式CvMat,它可以存储任意矩阵。毕竟,一张图片只是一个矩阵。

然后你可以使用函数cvGet2D来访问像素,它会返回一个CvScalar。


谢谢,我刚看到 Mat 的 2.1 文档,我会改用那个版本。 - macarthy
其实,carnieri,你能否向我展示如何使用Mat完成这个任务呢?似乎自1.*版本以来有很多变化。 - macarthy
请参考以下链接中的cvMat版本,该链接与OpenCV多通道元素访问有关:https://dev59.com/V3I-5IYBdhLWcg3wf4dD - Martin Beckett
2
那里的答案太过复杂了。mat.at<unsigned char>(row, col) - etarion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接