C#/C# OpenCV/

C# OpenCV 2-4.캡처 & 녹화

2019. 10. 25.

ImWrite & VideoWriter

ImWrite 소스를 캡쳐 하여 저장.

VideoWriter 소스를 레코드 하여 저장.

 

Example Code

using System;
using System.Windows.Forms;
using OpenCvSharp;

namespace videosource
{
    public partial class Form1 : Form
    {
        VideoCapture test = new VideoCapture("test.mp4");
        Mat frame = new Mat();
        VideoWriter recodetest;
        Timer timer;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            timer = new Timer();
            timer.Tick += new EventHandler(timer_tick);
        }

        private void Button1_Click(object sender, EventArgs e)
        {
            while (true)
            {
                test.Read(frame);
                if (!frame.Empty())
                {
                    Cv2.Resize(frame, frame, new Size(frame.Width * 1 / 2, frame.Height * 1 / 2));
                    Cv2.ImShow("test", frame);
                    Cv2.WaitKey(33);
                }
                else
                    break;
            }

            frame.Release();
            Cv2.DestroyWindow("test");
        }

        private void Button2_Click(object sender, EventArgs e)
        {
            Cv2.ImWrite("./Capture.png", frame);

        }

        private void Button3_Click(object sender, EventArgs e)
        {
            string save = DateTime.Now.ToString("yyyy-MM-dd-hh시mm분ss초");
            Cv2.ImWrite("./" + save + ".png", frame);
        }

        private void timer_tick(object sender, EventArgs e)
        {
            try
            {
                recodetest.Write(frame);
            }
            catch
            {
                timer.Enabled = false;
            }
        }

        private void Button4_Click(object sender, EventArgs e)
        {
            recodetest = new VideoWriter("./recode.avi", FourCC.XVID, 15, frame.Size());
            timer.Enabled = true;
        }

        private void Button5_Click(object sender, EventArgs e)
        {
            timer.Enabled = false;
        }

        private void Button6_Click(object sender, EventArgs e)
        {
            string save = DateTime.Now.ToString("yyyy-MM-dd-hh시mm분ss초");
            recodetest = new VideoWriter("./" + save + ".avi", FourCC.XVID, 24, frame.Size());
            timer.Enabled = true;
        }

        private void Button7_Click(object sender, EventArgs e)
        {
            timer.Enabled = false;
        }
    }
}

 

Explain Code

		VideoCapture test = new VideoCapture("test.mp4");
        Mat frame = new Mat();
        VideoWriter recodetest;
        Timer timer;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            timer = new Timer();
            timer.Tick += new EventHandler(timer_tick);
        }
        

VideoCapture 영상 불러오기

Mat frame 초기화

VideoWriter 초기화

Timer 초기화

 

		private void Button1_Click(object sender, EventArgs e)
        {
            while (true)
            {
                test.Read(frame);
                if (!frame.Empty())
                {
                    Cv2.Resize(frame, frame, new Size(frame.Width * 1 / 2, frame.Height * 1 / 2));
                    Cv2.ImShow("test", frame);
                    Cv2.WaitKey(33);
                }
                else
                    break;
            }

            frame.Release();
            Cv2.DestroyWindow("test");
        }

지난 강의 참조 -> 2019/10/24 - [프로그래밍/C# OpenCV] - C# OpenCV 2-3.영상 불러오기

 

		private void Button2_Click(object sender, EventArgs e)
        {
            Cv2.ImWrite("./Capture.png", frame);

        }

        private void Button3_Click(object sender, EventArgs e)
        {
            string save = DateTime.Now.ToString("yyyy-MM-dd-hh시mm분ss초");
            Cv2.ImWrite("./" + save + ".png", frame);
        }
        

Button2_Click 단일캡쳐.

명시된 파일명으로 덮어씌우며 캡쳐 저장

 

Button3_Click 다중캡쳐.

현재 시간을 파일명으로 하여 매번 새로이 캡쳐 저장.

 
		private void timer_tick(object sender, EventArgs e)
        {
            try
            {
                recodetest.Write(frame);
            }
            catch
            {
                timer.Enabled = false;
            }
        }
        

timer_tick 처음 초기화한 타이머의 tick마다 실행.

 

		private void Button4_Click(object sender, EventArgs e)
        {
            recodetest = new VideoWriter("./recode.avi", FourCC.XVID, 15, frame.Size());
            timer.Enabled = true;
        }

        private void Button5_Click(object sender, EventArgs e)
        {
            timer.Enabled = false;
        }
        

타이머를 이용 타이머가 실행중일때 Recoding

 

Button4_Click 단일레코드.

명시된 파일명으로 덮어씌우면 레코드 저장.

VideoWriter("파일경로&파일명", 파일포맷, 프레임레이트, 프레임사이즈)

 

Button5_Click 레코드 종료.

 

		private void Button6_Click(object sender, EventArgs e)
        {
            string save = DateTime.Now.ToString("yyyy-MM-dd-hh시mm분ss초");
            recodetest = new VideoWriter("./" + save + ".avi", FourCC.XVID, 24, frame.Size());
            timer.Enabled = true;
        }

        private void Button7_Click(object sender, EventArgs e)
        {
            timer.Enabled = false;
        }
        

타이머를 이용 타이머가 실행중일때 Recoding

Button6_Click 다중레코드.

현재 시간을 파일명으로 하여 매번 새로이 레코드 저장.

VideoWriter("파일경로&파일명", 파일포맷, 프레임레이트, 프레임사이즈)

 

Button7_Click 레코드 종료.

 

예제 파일

https://drive.google.com/open?id=13VScH5jAkUVYqjn_OVqZPgNnjv2gfFYU

 

Release.zip

 

drive.google.com

폴더안에 영상파일을 test.mp4 로 바꾸시고 넣으신후에 테스트하시면 됩니다.