سلام.توصیه نمی کنم برای اینکار از توابع دم دستی همچون cv::compare استفاده کنید.البته بر حسب اینکه جون فرمودید قصد دارید فریم های متوالی را بررسی کنید.
حتی از طریق هیستوگرام هم میشه مقایسه انجام داد ولی مقایسه ممکن چنان دقیق و مطلوب نباشه.
یکی از روش هایی که به طور خاص در این موارد استفاده میشه روش psnr است که دقت خیلی خوبی نسبت به روش های قبلی دارد.
یکی از روش های خیلی دقیق تر در این زمنه multi scal strcutrual similarity که پیاده سازی آن وجود داره.
Scalar getMSSIM( const Mat& i1, const Mat& i2)
{
const double C1 = 6.5025, C2 = 58.5225;
/***************************** INITS **********************************/
int d = CV_32F;
Mat I1, I2;
i1.convertTo(I1, d); // cannot calculate on one byte large values
i2.convertTo(I2, d);
Mat I2_2 = I2.mul(I2); // I2^2
Mat I1_2 = I1.mul(I1); // I1^2
Mat I1_I2 = I1.mul(I2); // I1 * I2
/***********************PRELIMINARY COMPUTING ******************************/
Mat mu1, mu2; //
GaussianBlur(I1, mu1, Size(11, 11), 1.5);
GaussianBlur(I2, mu2, Size(11, 11), 1.5);
Mat mu1_2 = mu1.mul(mu1);
Mat mu2_2 = mu2.mul(mu2);
Mat mu1_mu2 = mu1.mul(mu2);
Mat sigma1_2, sigma2_2, sigma12;
GaussianBlur(I1_2, sigma1_2, Size(11, 11), 1.5);
sigma1_2 -= mu1_2;
GaussianBlur(I2_2, sigma2_2, Size(11, 11), 1.5);
sigma2_2 -= mu2_2;
GaussianBlur(I1_I2, sigma12, Size(11, 11), 1.5);
sigma12 -= mu1_mu2;
///////////////////////////////// FORMULA ////////////////////////////////
Mat t1, t2, t3;
t1 = 2 * mu1_mu2 + C1;
t2 = 2 * sigma12 + C2;
t3 = t1.mul(t2); // t3 = ((2*mu1_mu2 + C1).*(2*sigma12 + C2))
t1 = mu1_2 + mu2_2 + C1;
t2 = sigma1_2 + sigma2_2 + C2;
t1 = t1.mul(t2); // t1 =((mu1_2 + mu2_2 + C1).*(sigma1_2 + sigma2_2 + C2))
Mat ssim_map;
divide(t3, t1, ssim_map); // ssim_map = t3./t1;
Scalar mssim = mean( ssim_map ); // mssim = average of ssim map
return mssim;
}
فازغ از روش های ذکر شده در بالا روش های پیچیده تری هم وجود دارند که بر پایه استخراج ویژگی هستند که میزان اختلاف را دقیق تر محاسبه می کنند ولی بار محاسباتی بیشتری نسبت به دو روش فوق دارند.