视频分解图片原理;图片合成视频原理
(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;
- }