c++ - OpenCV RGB 比较

标签 c++ opencv compare rgb pixel

我正在尝试获取两张图片之间的差异数。 当我比较 2 个灰度图像时,pixDiff <> 0 但当涉及到 RGB 时,pixDiff 始终为 0。

我使用了 openCV 的比较和自定义循环。

Mat frame, oldFrame;
cap >> oldFrame;

if(analyseMod == MONOCHROME)
    cvtColor(oldFrame, oldFrame, CV_BGR2GRAY);

nbChannels = oldFrame.channels();

while(1)
{
    pixDiff = 0;
    cap >> frame;

    //Test diff
    Mat diff;
    compare(oldFrame, frame, diff, CMP_NE);
    imshow("video 0", diff);
    imshow("video 1", frame);

    if(analyseMod == MONOCHROME)
    {
        cvtColor(frame, frame, CV_BGR2GRAY);

        for(int i=0; i<frame.rows; i++)
            for(int j=0; j<frame.cols; j++)
                if(frame.at<uchar>(i,j) < oldFrame.at<uchar>(i,j) - similarPixelTolerance || frame.at<uchar>(i,j) > oldFrame.at<uchar>(i,j) + similarPixelTolerance)
                    pixDiff++;
    }
    else if(analyseMod == RGB)
    {
        uint8_t *f = (uint8_t *)frame.data;
        uint8_t *o = (uint8_t *)oldFrame.data;

        for(int i=0; i<frame.rows; i++)
        {
            for(int j=0; j<frame.cols; j++)
            {
                if(f[nbChannels*i*frame.cols + j + RED] < o[nbChannels*i*oldFrame.cols + j + RED])
                    pixDiff++;
            }
        }
    }          

    frame.copyTo(oldFrame);

    cout << pixDiff;
    if(waitKey(30) >= 0) break;
}

谢谢帮助

最佳答案

我还是不明白,你为什么不在 RGB 情况下使用你的增量,但如果你想单独考虑颜色 channel ,这里是两种情况的解决方案。将单色情况下的 CN 设置为 1,RGB 情况下设置为 3。

const int CN = 3; // 3 for RGB, 1 for monochrome

uint8_t *f = frame.ptr<uint8_t>();
uint8_t *o = oldFrame.ptr<uint8_t>();

for(int i = 0; i < frame.rows; ++i)
{
  for(int j = 0; j < frame.cols; ++j)
  {
    for (int c = 0; c < CN; ++c)
    {
      if (abs(*f - *o) > similarPixelTolerance) ++pxDiff;
      ++f, ++o;
    }
  }
}

以这种方式访问​​像素比为每个像素调用 at 更有效。唯一可能的问题是如果您的图像中有一些填充,但默认情况下 OpenCV 使用连续分配。

关于c++ - OpenCV RGB 比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12027391/

相关文章:

c++ - 事件(线程)可以持续多长时间

c++ - 寻找最远的像素(Opencv)

xcode - 无法将 cv.h 添加到项目中

ios - 在 Objective-C iOS 中合并对象数组以获得相同的值

audio - 通过比较测量噪声水平/声音质量

c++ - 无法使用 UDP 通过二进制文件发送 pdf

c++ - 预增量运算符的行为

c++ - 元多运算符重载

c++ - 对具有不同值的图像的每个 channel 进行归一化的快速有效方法

c - 小整数 vector 的高效比较