【问题标题】:Pixel access in OpenCV 2.2OpenCV 2.2 中的像素访问
【发布时间】:2011-06-12 03:38:08
【问题描述】:

你好我想用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

  }
}

【问题讨论】:

    标签: image-processing opencv computer-vision pixel


    【解决方案1】:

    在 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 Andrews 的回答展示了一种使用 IplImage 进行像素访问的方法。
    【解决方案2】:

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

    然后您可以使用函数cvGet2D 访问像素,该函数返回一个 CvScalar。

    【讨论】:

    • 谢谢,我刚刚在 Mat 的 2.1 文档中看到,我会改成这样,,,
    • 实际上是 carnieri,你有没有机会告诉我它是如何使用 Mat 完成的,自 1.* 版本以来似乎发生了很大变化
    • 那里的答案太复杂了。 mat.at&lt;unsigned char&gt;(row, col)
    【解决方案3】:

    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 图像

    【讨论】:

    • 链接失效
    猜你喜欢
    • 2011-11-24
    • 2018-02-09
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多