1

我正在尝试获取两张图片之间的差异数量。当我比较 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;
}

谢谢帮助

4

1 回答 1

3

我还是不明白,你为什么不在 RGB 情况下使用你的增量,但如果你想分别考虑颜色通道,这里是两种情况的解决方案。单色情况设置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 使用连续分配。

于 2012-08-19T17:02:45.820 回答