• 视频分解图片原理;图片合成视频原理


    (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);
    }
    

      

    参考:学习OpenCV笔记(二)——图片与视频相互转换

    #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;
    }
    

      

  • 相关阅读:
    How to Get Started With AIOps
    第六部分 实现细节
    第一部分 概览
    第五部分 软件架构
    vs2010 sqlite guid 问题
    cordova(phonegap)+qjm 一统天下
    jQuery调用WebServices总是出错问题解决
    phonegap中http链接自动调用本地浏览器解决办法
    MSSQL省市数据库
    博客的第一篇
  • 原文地址:https://www.cnblogs.com/fcfc940503/p/11338082.html
Copyright © 2020-2023  润新知