视频输入
与之前的博客内容不同,本节处理的是视频流而非图像集。视频流来源可以是摄像头的实时图像反馈、已拍摄存储的视频。OpenCV可以读取这两种类型的视频流并采用RSNP和SSIM检查图像的相似度,使用函数为 cv::VideoCapture 。
本节的测试视频下载地址:
https://github.com/opencv/opencv/blob/master/samples/data/Megamind.avi
https://github.com/opencv/opencv/blob/master/samples/data/Megamind_bugy.avi
参考链接:https://docs.opencv.org/master/d5/dc4/tutorial_video_input_psnr_ssim.html
相似度测量
视频的转换操作是难以察觉的,因此通过帧与帧间的差异来测量相似度。
常用的方法是峰值信噪比PSNR(Peak signal-to-noise ratio),记I1、I2是输入的两幅图像,i,j是二维图像的大小,c是通道数量。
SSIM方法在代码中可以推出,由于使用了多次高斯平滑,其开销较大。运行结果相同时,SSIM用时会比PSNR多得多。PSNR可以为每一帧执行相似度测量,而SSIM仅被用于测量PSNR低于输入值的帧。
代码示例
#include <iostream>
#include <string>
#include <iomanip> // 控制浮动类型的打印精度
#include <sstream> // 字符串和数值的转换
#include <opencv2/core.hpp> // CV::Mat,Scalar
#include <opencv2/imgproc.hpp> // 高斯平滑
#include <opencv2/videoio.hpp> // 视频
#include <opencv2/highgui.hpp>
using namespace std;
using namespace cv;
double getPSNR(const Mat& I1, const Mat& I2);
Scalar getMSSIM(const Mat& I1, const Mat& I2);
int main(int argc,char *argv[])
{
const