gpt4 book ai didi

c++ - OpenCV RGB 比较

转载 作者:太空宇宙 更新时间:2023-11-03 22:15:37 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com