(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<opencv2opencv.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 ------ "); //读入视频文件 CvCapture* pCapture = NULL; if (!(pCapture = cvCaptureFromFile("pedestrain.avi"))) { printf("Can not open video file "); 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---------- "); // cvReleaseImage(&pFrame); //释放时出错?! cvReleaseCapture(&pCapture); } void Image_to_video() { int i = 0; IplImage* img = 0; char image_name[50]; printf("-------- image to video -------- "); 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 video width : %d fps : %d ", 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... "); // img = 0; continue; } cvShowImage("mainWin", img); char key = cvWaitKey(20); cvWriteFrame(writer, img); //img = NULL; cvReleaseImage(&img); } printf("--------image to video over--------- "); 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; }