OpenCV学习之路(二十一) 视频的输入和输出

官方文档

 

简单代码示例:

#include<opencv2/opencv.hpp>
#include<iostream>

using namespace cv;
using namespace std;

double getPSNR(const Mat& video1, const Mat& video2);

int main()
{
	// 读取视频
	VideoCapture videoCapture1("001.asf");
	VideoCapture videoCapture2("002.asf");

	// 判断视频能否打开
	if (!videoCapture1.isOpened())
	{
		cout << "视频1打开失败" << endl;
		return -1;
	}
	if (!videoCapture2.isOpened())
	{
		cout << "视频2打开失败" << endl;
		return -1;
	}

	//判断两个视频帧尺寸是否一样
	Size videoSize1 = Size(videoCapture1.get(CAP_PROP_FRAME_WIDTH), videoCapture1.get(CAP_PROP_FRAME_HEIGHT));
	Size videoSize2 = Size(videoCapture2.get(CAP_PROP_FRAME_WIDTH), videoCapture2.get(CAP_PROP_FRAME_HEIGHT));
	if (videoSize1 != videoSize2)
	{
		cout << "两个视频帧尺寸不一样" << endl;
		return -1;
	}

	//输出视频的帧宽度、帧高度、帧数
	cout << "帧宽度:" << videoSize1.width << "帧高度:" << videoSize1.height << "帧数:" << videoCapture1.get(CAP_PROP_FRAME_COUNT) << endl;

	const char* videoStr1 = "视频1";
	const char* videoStr2 = "视频2";
	namedWindow(videoStr1, WINDOW_AUTOSIZE);
	namedWindow(videoStr2, WINDOW_AUTOSIZE);
	moveWindow(videoStr1, 400, 0);
	moveWindow(videoStr2, videoSize1.width, 0);

	double psnrValue;
	Mat videoFrame1, videoFrame2;
	int frameNum = 0;
	while (1)
	{
		videoCapture1 >> videoFrame1;
		videoCapture2 >> videoFrame2;

		if (videoFrame1.empty() || videoFrame2.empty())
		{
			cout << "视频已读完" << endl;
			break;
		}

		imshow(videoStr1, videoFrame1);
		imshow(videoStr2, videoFrame2);
		// 务必加上延迟
		waitKey(30);

		frameNum++;

		psnrValue = getPSNR(videoFrame1, videoFrame2);
		cout << setiosflags(ios::fixed) << setprecision(3);
		cout << "两个视频帧的相似度:" << psnrValue << "dB" << endl;

	}

	waitKey(0);
	return 0;

}

double getPSNR(const Mat& video1, const Mat& video2)
{
	Mat similar;
	absdiff(video1, video2, similar);
	similar.convertTo(similar, CV_32F);
	similar = similar.mul(similar);

	Scalar s = sum(similar);
	double see = s.val[0] + s.val[1] + s.val[2];

	if (see < 1e-10)
	{
		cout << "相似度过低" << endl;
		return 0;
	}
	else
	{
		double mse = see / (double)(video1.channels() * video1.total());
		double psnr = 10.0 * log10((255 * 255) / mse);
		return psnr;
	}
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值