(1)加载视频
(2)读取视频信息
(3)解码视频,拿到单帧信息
帧率:视频每秒钟展示多少张图片;帧率高我们看到的图片才是连续的;帧率低我们看到的图片就相当于非连续的;
宽度;高度
接下来是视频保存成图片;用i计数,保存图片个数;
flag,frame=cap.read()
第一个参数flag的值为True或False,代表有没有读到图片
第二个参数是frame,是当前截取一帧的图片。
filename是图片保存名字;
iwrite保存图片;
(4)展示,保存图片
/************************************************************************
* @ Project Creation time:2018/5/22
* @ Function:从文件中获取视频分解成图片
************************************************************************/
#include<opencv2/opencv.hpp>
#include "iostream"
using namespace cv;
using namespace std;
int main()
{
Mat frame;
char outfile[50];
VideoCapture cap("E:\\VS2015Opencv\\vs2015\\project\\video\\01.avi");
if (!cap.isOpened())
{
cout << "打开视频失败!" << endl;
return -1;
}
int totalFrame = cap.get(CV_CAP_PROP_FRAME_COUNT);//<获取视频总帧数
for (int i = 1; i <= totalFrame; i++)
{
cap >> frame;
if (frame.empty())
{
cout << "图片为空!" << endl;
break;
}
sprintf(outfile, "E://VS2015Opencv//vs2015//project//视频处理//pic//%d.png", i);
imwrite(outfile, frame);
imshow("video", frame);
waitKey(15);
}
cap.release();
destroyAllWindows();
return 0;
}
图片合成视频原理
写入视频;
上面使用Python方法;但是原理一样;
#include<opencv2\opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main()
{
VideoWriter video("test.avi", CV_FOURCC('X', 'V', 'I', 'D'), 27.0, Size(1280, 720));
String img_path = "E://VS2015Opencv//vs2015//project//视频处理//pic//";
vector<String> img;
glob(img_path, img, false);
size_t count = img.size();
for (size_t i = 0; i < count; i++)
{
stringstream str;
str << i << ".png";
Mat image = imread(img_path + str.str());
if (!image.empty())
{
resize(image, image, Size(1280, 720));
video << image;
cout << "正在处理第" << i << "帧" << endl;
}
}
cout << "处理完毕!" << endl;
waitKey(15);
}
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <cv.h>
#include <highgui.h>
#define NUM_FRAME 24560 //只处理前300帧,根据需要修改
void Video_to_image(char* filename)
{
printf("------video to image ------\n");
//读入视频文件
CvCapture* pCapture = NULL;
if (!(pCapture = cvCaptureFromFile("pedestrain.avi")))
{
printf("Can not open video file\n");
return;
}
//逐帧读取文件
IplImage* pFrame = NULL;
int i = 0;
char image_name[50];
while (i < NUM_FRAME)
{
pFrame = cvQueryFrame(pCapture);
sprintf(image_name, "%s%.5d%s", "image", ++i, ".jpg");//保存的图片名
cvSaveImage(image_name, pFrame);
pFrame = NULL;
// cvReleaseImage(&pFrame);
}
printf("--------video to image over----------\n");
// cvReleaseImage(&pFrame); //释放时出错?!
cvReleaseCapture(&pCapture);
}
void Image_to_video()
{
int i = 0;
IplImage* img = 0;
char image_name[50];
printf("-------- image to video --------\n");
CvVideoWriter *writer = 0;
int isColor = 1;
int fps = 25;
int frameW = 640;
int frameH = 480;
//创建视频写入器
// writer=cvCreateVideoWriter("out.avi",CV_FOURCC('X','V','I','D'),fps,cvSize(frameW,frameH),isColor);
writer = cvCreateVideoWriter("out.avi", CV_FOURCC('P', 'I', 'M', '1'), fps, cvSize(frameW, frameH), isColor);
printf("video height : %d\nvideo width : %d\nfps : %d\n", frameH, frameW, fps);
//创建视频播放窗口
// cvNamedWindow( "mainWin", CV_WINDOW_AUTOSIZE );
while (i<NUM_FRAME)
{
// sprintf(image_name, "%s%.5d%s", "image", ++i, ".jpg");
sprintf(image_name, "%s%.5d%s", "AAAOUTPUT_", ++i, ".jpg.jpg");
img = cvLoadImage(image_name);
if (!img) //图片不存在则跳过继续处理下一帧
{
// printf("Could not load image file...\n");
// img = 0;
continue;
}
cvShowImage("mainWin", img);
char key = cvWaitKey(20);
cvWriteFrame(writer, img);
//img = NULL;
cvReleaseImage(&img);
}
printf("--------image to video over---------\n");
cvReleaseVideoWriter(&writer);
cvDestroyWindow("mainWin");
return;
}
int main(int argc, char *argv[])
{
// char *filename = argv[1];
char filename[50] = "pedestrain.avi";
// Video_to_image(filename);
Image_to_video();
return 0;
}