gpt4 book ai didi

c++ - 检测两幅图像之间的差异

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

我正在编写以下代码

#include <iostream>
#include <opencv2/core/core.hpp>
#include <string>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/video/background_segm.hpp>

using namespace std;
using namespace cv;

int main()
{
Mat current,currentGrey,next,abs;
VideoCapture cam1,cam2;

std:: vector<vector<Point>>contours;
vector<vector<Point>>contoursPoly(contours.size());

cam1.open(0);
cam2.open(0);

namedWindow("Normal");
namedWindow("Difference");

if(!cam1.isOpened())
{
cout << "Cam not found" << endl;
return -1;
}



while(true)
{
//Take the input
cam1 >> current;
currentGrey = current;
cam2 >> next;

//Convert to grey
cvtColor(currentGrey,currentGrey,CV_RGB2GRAY);
cvtColor(next,next,CV_RGB2GRAY);



//Reduce Noise
cv::GaussianBlur(currentGrey,currentGrey,Size(0,0),4);
cv::GaussianBlur(next,next,Size(0,0),4);

imshow("Normal",currentGrey);

//Get the absolute difference
absdiff(currentGrey,next,abs);
imshow("Difference",abs);


for(int i=0;i<abs.rows;i++)
{
for(int j=0;j<abs.cols;j++)
{
if(abs.at<int>(j,i)>0)
{
cout << "Change Detected" << endl;

j = abs.cols+1;
i = abs.rows+1;
}

}
}


if(waitKey(30)>=0)
{
break;
}
}

}

在这里,我要做的是在检测到图像之间存在差异时打印一条消息。下面是技巧

for(int i=0;i<abs.rows;i++)
{
for(int j=0;j<abs.cols;j++)
{
if(abs.at<int>(j,i)>0)
{
cout << "Change Detected" << endl;

j = abs.cols+1;
i = abs.rows+1;
}

}
}

不幸的是,它不会在检测到差异时打印消息,而是始终打印消息。为什么是这样?

最佳答案

你应该计算两帧之间的均方误差。

MSE = sum((frame1-frame2)^2 ) / no. of pixels

an OpenCV tutorial中有计算的例子.

基于您可能拥有的代码

double getMSE(const Mat& I1, const Mat& I2)
{
Mat s1;
absdiff(I1, I2, s1); // |I1 - I2|
s1.convertTo(s1, CV_32F); // cannot make a square on 8 bits
s1 = s1.mul(s1); // |I1 - I2|^2

Scalar s = sum(s1); // sum elements per channel

double sse = s.val[0] + s.val[1] + s.val[2]; // sum channels

if( sse <= 1e-10) // for small values return zero
return 0;
else
{
double mse =sse /(double)(I1.channels() * I1.total());
return mse;
// Instead of returning MSE, the tutorial code returned PSNR (below).
//double psnr = 10.0*log10((255*255)/mse);
//return psnr;
}
}

您可以像这样在您的代码中使用它:

   if(getMSE(currentGrey,next) > some_threshold)
cout << "Change Detected" << endl;

由您决定 MSE 的大小,低于该大小您认为图像是相同的。您还应该使用 GaussianBlur() 进行预过滤以减少噪音,就像您已经做的那样。 @fatih_k 建议的 blur 方法不是高斯滤波器;它是一个盒式过滤器,虽然速度更快但可能会引入伪影。

关于c++ - 检测两幅图像之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17232059/

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