我有2个AVFrame指针
float compareFrame(AVFrame* firstFrame, AVFrame* secondFrame)
{
int i,j;
const size_t image_size = height * width;
size_t diffbytes = 0;
for (i=0; i < height; i++)
{
for (j=0; j < width; j++) {
size_t coord = firstFrame->linesize[0]*i + j;
diffbytes += !!(firstFrame->data[0][coord] ^ secondFrame->data[0][coord]);
}
}
const float percent_diff = (diffbytes / (float)image_size)*100.0;
return percent_diff;
}
但是当比较两个相同的AVFrames时似乎不正确。如何确定两个AVFrame是否具有完全相同的数据?
最佳答案
我认为您对“正确工作”的定义定义不明确。基本上,问题是:您在比较什么?您认为有什么不同?
首先是您的函数:它仅比较8位平面的Y数据,即仅适用于8位平面数据格式。 AVFrame
的格式是什么? (检查AVFrame->format
!)如果不是AV_PIX_FMT_YUV420P
,AV_PIX_FMT_YUV422P
或AV_PIX_FMT_YUV444P
之类的东西,则此功能无效。
其次,算法:如果所有像素的值都变暗,则此函数的差值将为100%,但图像看起来仍然大致相同。那么,此方案所需的值是100.0%吗?为什么不对图像相似性使用更普遍接受的度量标准,例如MSE或相关表达式PSNR?还有其他指标,例如SSIM。
如果您不喜欢其中的任何一个,并且想要使用代码,请问您说的是“无法正常工作”时,请定义您的意思吗?您使用了什么输入,实际和预期输出是什么?