【问题标题】:opencv::Mat, get pixel value from the raw data?opencv::Mat,从原始数据中获取像素值?
【发布时间】:2018-01-31 14:25:09
【问题描述】:

我有一张图片,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* 数据,这相当于什么?

【问题讨论】:

  • 取决于pImg 的像素类型。什么是像素类型?
  • 我实际上需要做两个 Mats,一个 uchar 和一个 int。

标签: c++ opencv mat


【解决方案1】:

这很简单,但你需要记住一件事,这个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)
   }

【讨论】:

  • 我认为这相当于:(对于 CV_8UC1)data[x * step + y * channels]
【解决方案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];
    }
}

【讨论】:

  • 谢谢。我仍然有问题。以下将崩溃:int* tri = new int[width * height];for (int i = 0; i &lt; height; ++i) { for (int j = 0; j &lt; width; ++j) { tri[i * step + j * channels] = 0; } }我做错了什么?
  • 更具体地说,我正在运行这个:int* tData = new int[trimap.cols * trimap.rows];for (auto i = 0; i &lt; trimap.rows * trimap.cols; i += trimap.elemSize()) { //for CV_8UC1 auto pixel = *(trimap.data + i); tData[i] = pixel; } 然后访问数据:tData [i * step + j * channel 将崩溃
  • 啊,在存储步骤和通道之前,我需要将其转换为灰色。运行良好。再次感谢。
  • @anti.. ucharstep 值不适用于int。如果tri 只是一个简单的数组,那么它的step 将等于width。换句话说,在访问元素之前,必须将步长除以数据类型的大小。
猜你喜欢
  • 2011-12-15
  • 2019-05-04
  • 2014-03-29
  • 2014-09-03
  • 2012-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-09
相关资源
最近更新 更多