视频操作

1、将视频每帧拆分为图片保存;
2、批量读取图片(有序无序读取);
3、图片合成视频;

Code

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Emgu.CV;
using Emgu.Util;
using Emgu.CV.CvEnum;
using Emgu.CV.Structure;
using System.IO;
using System.Drawing;

namespace lesson5
{
   
    class Program
    {
   
        static void Main(string[] args)
        {
   
            /*******************视频分解图片***********************/
            //VideoCapture cap = new VideoCapture("C:\\Users\\hello\\Desktop\\ADO_NET简介.mp4");
            //if(!cap.IsOpened)
            //{
   
            // Console.WriteLine("open the video failed..");
            // return;
            //}
            //int i = 0;
            //Mat frame = new Mat();
            //while(true)
            //{
   
            // frame = cap.QueryFrame(); //读一帧
            // if(frame.IsEmpty)
            // {
   
            // Console.WriteLine("frame is empty ...");
            // break;
            // }
            // i++;
            // if(i == 200) //设定保存图片阈值
            // {
   
            // break;
            // }
            // string imgPath = "./pics/" + i.ToString() + ".bmp"; // "./"表示存放于当前目录下
            // CvInvoke.Imshow("video", frame);
            // CvInvoke.Imwrite(imgPath, frame); //imgPath 为变量,则将视频分为图片保存
            // if(CvInvoke.WaitKey(200) == 27)
            // {
   
            // break;
            // }
            //}
            /*********************批量读取有序图片***********************/
            //int i = 1;
            //Mat frame = new Mat();
            //for(int j = 0; j < 200;j++)
            //{
   
            // string imgPath = "C:\\Users\\hello\\Desktop\\EmguCVDemo\\lesson5\\lesson5\\bin\\Debug\\pics\\" + i.ToString() + ".bmp";
            // //string imgPath = "./pics/" + i.ToString() + ".bmp";
            // frame = CvInvoke.Imread(imgPath, ImreadModes.Color);
            // CvInvoke.Imshow("video", frame);
            // CvInvoke.WaitKey(200); 
            //}
            /*********************批量读取无序图片***********************/
            //var : 自动类型推断
            //var files = Directory.GetFiles("C:\\Users\\hello\\Desktop\\Picture", "*.*"); //文件夹下所有类型文件
            //GetFiles()方法一次只能获取一种类型图片,可以对图像类型进行筛选;
            //var files = Directory.GetFiles("C:\\Users\\hello\\Desktop\\Picture", "*.jpg"); //文件夹下 所有jpg文件
            //foreach(var file in files)
            //{
   
            // Console.WriteLine(file);
            //}

            //DirectoryInfo dir = new DirectoryInfo("./pics"); //获取当前文件夹名称
            //FileInfo[] afi = dir.GetFiles("*.*"); //将所有文件存放在afi中
            //string fileName;

            //for(int i = 0;i < afi.Length;i++)
            //{
   
            // fileName = afi[i].Name.ToLower();
            // if(fileName.EndsWith(".jpg") || fileName.EndsWith(".png")||
            // fileName.EndsWith(".bmp") || fileName.EndsWith(".jpeg")) //无序图片按随机顺序读取 
            // {
   
            // Console.WriteLine("./pics/" + fileName);
            // Mat img = CvInvoke.Imread("./pics/"+ fileName);
            // CvInvoke.Imshow("img", img);

            // CvInvoke.WaitKey(0); //手动按键切换图片
            // }
            //}

            /*****************************图片合成视频******************************/
            //视频合成要求图片尺寸大小一致,如果不一致,可以Resize()转化
            VideoWriter writer = new VideoWriter("out.avi",-1,5,new Size(500, 500),false);  //原图大小为1024 * 768

            Mat frame = new Mat();
            for(int i = 1; i < 10;i++)
            {
   
                string imgpath = "./pics/" + i.ToString() + ".bmp";  //字符串格式化
                frame = CvInvoke.Imread(imgpath);

                CvInvoke.Resize(frame, frame, new Size(500, 500));  //Resize图像大小 可将不同大小尺寸的图片合成为视频

                writer.Write(frame);
                CvInvoke.WaitKey(30);
            }

            Console.WriteLine("视频写入结束!");
        }
    }
}