OpenCV RGB比较

时间:2012-08-19 14:44:49

标签: 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;
}

寻求帮助

1 个答案:

答案 0 :(得分:3)

我仍然没有得到它,你为什么不在RGB情况下使用delta,但如果你想分别考虑颜色通道,这里是两种情况的解决方案。对于单色情况,将CN设置为1,对于RGB情况,将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; } } } 设置为3。

at

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