项目要求:
将一个 1920 * 1080 的视频压缩为 960 * 540 的视频,帧率不变。将每个 2 * 2 相邻像素点的像素值求平均,变成一个新的像素点(即 2 * 2 的平均池化)。
程序中很多代码都来源于《OpenCv 4 快速入门》
方法一:分别取出三个通道的像素值,计算平均值
代码:
#include <opencv2\opencv.hpp>
#include <iostream>
#include <vector>
#include <string>
using namespace std;
using namespace cv;
int main()
{
//计时器,详细介绍可以参考博客:https://www.cnblogs.com/didiaodidiao/p/9194702.html
clock_t startTime, endTime;
startTime = clock();
string video_path = "test.mp4"; //待处理的视频
string save_path = "resize.avi"; //保存的视频文件
VideoCapture video(video_path); //读取视频
if (!video.isOpened())
{
cout << "请确认视频文件名称是否正确" << endl;
return -1;
}
Mat frame;
video >> frame; //从视频中读入每一帧图片
const double fps = video.get(CAP_PROP_FPS); //帧率
const int frame_count = video.get(CAP_PROP_FRAME_COUNT); //视频帧数
int codec = VideoWriter::fourcc('M', 'J', 'P', 'G'); //输出视频的编码格式
VideoWriter writer;
bool iscolor = (frame.type() == CV_8UC3); //判断是否为彩色图像
writer.open(save_path, codec, fps, Size(1920 / 2, 1080 / 2), iscolor); //创建一个保存视频文件的视频流
if (!writer.isOpened())
{
cout << "打开视频文件失败,请确实是否为合法输入" << endl;
return -1;
}
int count = 0;
while (1)
{
if (!video.read(frame))
{
cout << "视频读取完成" << endl;
break;
}
//分别取出frame三个通道的像素值,计算平均值,再赋给img的三个通道
Mat img = Mat::zeros<