opencv :: Mat,从原始数据中获取像素值?

时间:2018-01-31 14:25:09

标签: c++ opencv mat

我有一张图片,cv::Mat。我从这里得到原始数据:

uchar* data = (uchar *)pImg.data;

我需要将此数据传递给函数,然后循环遍历图像的每个像素。我会做的:

for (int i = 0; i < image.rows; ++i)
    {
        for (int j = 0; j < image.cols; ++j)
        {
            //pixel = cv::Point(i,j);
        }
    }

使用uchar*数据?

等同于此

2 个答案:

答案 0 :(得分:2)

这很简单,但你需要记住一件事,这个image.elemSize()表示每个像素有多少字节(这个函数取自OpenCV mat)。因此,对于不同的图像格式,此循环看起来会略有不同。循环中有一个例子

   for (auto i = 0; i < image.rows * image.cols; i+=image.elemSize())
   {
      //for CV_8UC1  
      //auto pixel = *(image.data + i)

      //for RGB as CV_8UC3 
      auto r = *(image.data + i)
      auto g = *(image.data + i + 1)
      auto b = *(image.data + i + 2)
   }

答案 1 :(得分:2)

如果已知以下参数,则可以从原始数据访问正确的像素值:

  • 像素的X坐标(列号)
  • 像素的Y坐标(行号)
  • 图像深度(单个像素的实际数据类型,即ucharushortfloat等)
  • 图像的通道数
  • 以字节为单位的图像步骤

鉴于以上信息,可以按如下方式访问像素(对于CV_8UC3类型):

uchar* data = (uchar *)pImg.data;
for (int i = 0; i < image.rows; ++i)
{
    for (int j = 0; j < image.cols; ++j)
    {
        uchar b = data[i * pImg.step + pImg.channels() * j + 0];
        uchar g = data[i * pImg.step + pImg.channels() * j + 1];
        uchar r = data[i * pImg.step + pImg.channels() * j + 2];
    }
}