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
폴더안에 영상파일을 test.mp4 로 바꾸시고 넣으신후에 테스트하시면 됩니다.