(1)加载视频

(2)读取视频信息

(3)解码视频,拿到单帧信息

帧率:视频每秒钟展示多少张图片;帧率高我们看到的图片才是连续的;帧率低我们看到的图片就相当于非连续的;

宽度;高度

接下来是视频保存成图片;用i计数,保存图片个数;

第一个参数flag的值为True或False,代表有没有读到图片

第二个参数是frame,是当前截取一帧的图片。

filename是图片保存名字;

iwrite保存图片;

(4)展示,保存图片

  1. /************************************************************************
  2. * @ Project Creation time:2018/5/22
  3. * @ Function:从文件中获取视频分解成图片
  4. ************************************************************************/
  5. #include<opencv2/opencv.hpp>
  6. #include "iostream"
  7. using namespace cv;
  8. using namespace std;
  9.  
  10.  
  11. int main()
  12. {
  13. Mat frame;
  14. char outfile[50];
  15. VideoCapture cap("E:\\VS2015Opencv\\vs2015\\project\\video\\01.avi");
  16. if (!cap.isOpened())
  17. {
  18. cout << "打开视频失败!" << endl;
  19. return -1;
  20. }
  21.  
  22. int totalFrame = cap.get(CV_CAP_PROP_FRAME_COUNT);//<获取视频总帧数
  23. for (int i = 1; i <= totalFrame; i++)
  24. {
  25. cap >> frame;
  26. if (frame.empty())
  27. {
  28. cout << "图片为空!" << endl;
  29. break;
  30. }
  31. sprintf(outfile, "E://VS2015Opencv//vs2015//project//视频处理//pic//%d.png", i);
  32. imwrite(outfile, frame);
  33. imshow("video", frame);
  34. waitKey(15);
  35. }
  36. cap.release();
  37. destroyAllWindows();
  38. return 0;
  39. }

  

 图片合成视频原理

写入视频;

上面使用Python方法;但是原理一样;

 

  1. #include<opencv2\opencv.hpp>
  2. #include<iostream>
  3.  
  4. using namespace std;
  5. using namespace cv;
  6.  
  7. int main()
  8. {
  9.  
  10. VideoWriter video("test.avi", CV_FOURCC(\'X\', \'V\', \'I\', \'D\'), 27.0, Size(1280, 720));
  11.  
  12. String img_path = "E://VS2015Opencv//vs2015//project//视频处理//pic//";
  13. vector<String> img;
  14.  
  15. glob(img_path, img, false);
  16.  
  17. size_t count = img.size();
  18. for (size_t i = 0; i < count; i++)
  19. {
  20. stringstream str;
  21. str << i << ".png";
  22. Mat image = imread(img_path + str.str());
  23. if (!image.empty())
  24. {
  25. resize(image, image, Size(1280, 720));
  26. video << image;
  27. cout << "正在处理第" << i << "帧" << endl;
  28. }
  29. }
  30. cout << "处理完毕!" << endl;
  31. waitKey(15);
  32. }

  

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

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <math.h>
  4. #include <cv.h>
  5. #include <highgui.h>
  6. #define NUM_FRAME 24560 //只处理前300帧,根据需要修改
  7.  
  8. void Video_to_image(char* filename)
  9. {
  10. printf("------video to image ------\n");
  11. //读入视频文件
  12. CvCapture* pCapture = NULL;
  13. if (!(pCapture = cvCaptureFromFile("pedestrain.avi")))
  14. {
  15. printf("Can not open video file\n");
  16. return;
  17. }
  18.  
  19. //逐帧读取文件
  20. IplImage* pFrame = NULL;
  21. int i = 0;
  22. char image_name[50];
  23. while (i < NUM_FRAME)
  24. {
  25. pFrame = cvQueryFrame(pCapture);
  26. sprintf(image_name, "%s%.5d%s", "image", ++i, ".jpg");//保存的图片名
  27. cvSaveImage(image_name, pFrame);
  28. pFrame = NULL;
  29. // cvReleaseImage(&pFrame);
  30. }
  31. printf("--------video to image over----------\n");
  32.  
  33. // cvReleaseImage(&pFrame); //释放时出错?!
  34. cvReleaseCapture(&pCapture);
  35. }
  36.  
  37. void Image_to_video()
  38. {
  39. int i = 0;
  40. IplImage* img = 0;
  41. char image_name[50];
  42. printf("-------- image to video --------\n");
  43.  
  44. CvVideoWriter *writer = 0;
  45. int isColor = 1;
  46. int fps = 25;
  47. int frameW = 640;
  48. int frameH = 480;
  49.  
  50. //创建视频写入器
  51. // writer=cvCreateVideoWriter("out.avi",CV_FOURCC(\'X\',\'V\',\'I\',\'D\'),fps,cvSize(frameW,frameH),isColor);
  52. writer = cvCreateVideoWriter("out.avi", CV_FOURCC(\'P\', \'I\', \'M\', \'1\'), fps, cvSize(frameW, frameH), isColor);
  53. printf("video height : %d\nvideo width : %d\nfps : %d\n", frameH, frameW, fps);
  54.  
  55. //创建视频播放窗口
  56. // cvNamedWindow( "mainWin", CV_WINDOW_AUTOSIZE );
  57. while (i<NUM_FRAME)
  58. {
  59. // sprintf(image_name, "%s%.5d%s", "image", ++i, ".jpg");
  60. sprintf(image_name, "%s%.5d%s", "AAAOUTPUT_", ++i, ".jpg.jpg");
  61. img = cvLoadImage(image_name);
  62. if (!img) //图片不存在则跳过继续处理下一帧
  63. {
  64. // printf("Could not load image file...\n");
  65. // img = 0;
  66. continue;
  67. }
  68. cvShowImage("mainWin", img);
  69. char key = cvWaitKey(20);
  70. cvWriteFrame(writer, img);
  71. //img = NULL;
  72. cvReleaseImage(&img);
  73.  
  74. }
  75. printf("--------image to video over---------\n");
  76. cvReleaseVideoWriter(&writer);
  77. cvDestroyWindow("mainWin");
  78. return;
  79. }
  80.  
  81. int main(int argc, char *argv[])
  82. {
  83. // char *filename = argv[1];
  84. char filename[50] = "pedestrain.avi";
  85.  
  86. // Video_to_image(filename);
  87. Image_to_video();
  88. return 0;
  89. }

  

版权声明:本文为fcfc940503原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/fcfc940503/p/11338082.html