c++的opencv获取视频mse与psnr
时间: 2023-12-06 12:05:21 浏览: 90
在使用 OpenCV 计算视频的 MSE 和 PSNR 之前,需要确保你已经成功读入了视频并对其进行了处理。下面是计算 MSE 和 PSNR 的代码示例:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main() {
// 读入视频
VideoCapture cap("video.mp4");
if (!cap.isOpened()) {
cout << "Failed to open video file!" << endl;
return -1;
}
int frame_count = cap.get(CAP_PROP_FRAME_COUNT); // 获取视频总帧数
int fps = cap.get(CAP_PROP_FPS); // 获取视频帧率
Mat frame1, frame2;
double mse_sum = 0; // MSE 的累加和
double psnr_sum = 0; // PSNR 的累加和
for (int i = 0; i < frame_count - 1; i++) {
cap >> frame1;
cap >> frame2;
Mat diff;
absdiff(frame1, frame2, diff); // 计算两帧之间的差异
diff.convertTo(diff, CV_32F);
double mse = sum(diff.mul(diff))[0] / diff.total(); // 计算 MSE
double psnr = 10.0 * log10(255 * 255 / mse); // 计算 PSNR
mse_sum += mse;
psnr_sum += psnr;
}
double avg_mse = mse_sum / (frame_count - 1); // 计算平均 MSE
double avg_psnr = psnr_sum / (frame_count - 1); // 计算平均 PSNR
cout << "Average MSE: " << avg_mse << endl;
cout << "Average PSNR: " << avg_psnr << endl;
return 0;
}
```
上面的代码中,我们首先读入了视频并获取了视频总帧数和帧率。然后,我们使用 `absdiff()` 函数计算两帧之间的差异,并将其转换为 `CV_32F` 类型。接着,我们计算 MSE 和 PSNR,并将它们的值累加到 `mse_sum` 和 `psnr_sum` 变量中。最后,我们计算平均 MSE 和 PSNR 并输出它们的值。
值得注意的是,这段代码只计算了视频中相邻帧之间的 MSE 和 PSNR,如果你想计算视频中所有帧之间的 MSE 和 PSNR,可以将 `for` 循环中的条件改为 `i < frame_count`,但这会大大增加计算量。另外,如果你想计算某一段视频的 MSE 和 PSNR,可以在循环中加上相应的条件。
阅读全文