OpenCvSharp로 웹캠 영상을 캡처하고 저장

개요



Visual Studio 2019에서 웹캠 비디오를 캡처하는 방법에 대해 설명
새 버전인 OpenCvSharp4 환경에서 캡처 이미지 저장 정보가 적었기 때문에 공유

환경



windows10
Visual Studio 2019

구현



먼저 Visual Studio 2019 (이하 VS)를 공식 사이트에서 설치
OpenCvSharp 라이브러리는 NuGet에서 설치하기 때문에 이제 방치

프로젝트 만들기



1.VS를 기동해, 새로운 프로젝트의 작성을 선택

2. Windows Forms 응용 프로그램(.NET Framework) 선택

3. 프로젝트명과 저장 장소를 적당히 입력하여 프로젝트를 작성

패키지 설치



1. VS 프로젝트 탭에서 NuGet 패키지 관리 선택

2. 찾아보기 탭의 검색 상자에 opencvsharp4를 입력합니다.

3.OpenCvSharp4.Windows를 설치(이번 사용한 버전은 「4.1.1.20191017」)

4. 설치된 탭에서 OpenCvSharp4.Windows가 설치되어 있는지 확인

아래 준비



1.Form1.cs[디자인] 탭으로 이동하여 화면 왼쪽(표시되어 있지 않은 경우, [표시] 탭 → [도구 상자])에 있는 [도구 상자] → [공통 컨트롤] → [PictureBox]를 Form1 위 D&D
하나 돌아가, 「컴포넌트」→「BackgroundWorker」도 마찬가지로 D&D

2. Form1 창의 속성에서 아래 그림의 이벤트 탭 선택

FormClosing 이벤트를 추가하고 마찬가지로 BackgroundWorker에 "DoWork"및 "ProgressChanged"이벤트를 추가합니다.

3. BackgroundWorker 속성 탭에서 아래 그림과 같이 "WorkerReportsProgress""WorkerSupportsCancellation"의 두 가지를 false에서 true로 변경합니다.


영상을 PictureBox로 출력



코드는 다음

Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using OpenCvSharp;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        int WIDTH = 640;
        int HEIGHT = 480;
        Mat frame;
        VideoCapture capture;
        Bitmap bmp;
        Graphics graphic;
        public Form1()
        {
            InitializeComponent();
            //カメラ画像取得用のVideoCapture作成
            capture = new VideoCapture(0);
            if (!capture.IsOpened())
            {
                MessageBox.Show("camera was not found!");
                this.Close();
            }
            capture.FrameWidth = WIDTH;
            capture.FrameHeight = HEIGHT;

            //取得先のMat作成
            frame = new Mat(HEIGHT, WIDTH, MatType.CV_8UC3);

            //表示用のBitmap作成
            bmp = new Bitmap(frame.Cols, frame.Rows, (int)frame.Step(), System.Drawing.Imaging.PixelFormat.Format24bppRgb, frame.Data);

            //PictureBoxを出力サイズに合わせる
            pictureBox1.Width = frame.Cols;
            pictureBox1.Height = frame.Rows;

            //描画用のGraphics作成
            graphic = pictureBox1.CreateGraphics();

            //画像取得スレッド開始
            backgroundWorker1.RunWorkerAsync();
        }

        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            //描画
            graphic.DrawImage(bmp, 0, 0, frame.Cols, frame.Rows);
        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker bw = (BackgroundWorker)sender;

            while (!backgroundWorker1.CancellationPending)
            {
                //画像取得
                capture.Grab();
                OpenCvSharp.Internal.NativeMethods.videoio_VideoCapture_operatorRightShift_Mat(capture.CvPtr, frame.CvPtr);
                bw.ReportProgress(0);
            }
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            //スレッドの終了を待機
            backgroundWorker1.CancelAsync();
            while (backgroundWorker1.IsBusy)
                Application.DoEvents();
        }
    }
}


실행하면 PictureBox에 웹캠 영상이 출력됩니다.

영상 캡처



1. 캡처 이미지를 저장할 파일 설정
이번에는 C:\cs_source\img\를 작성해, 거기에 저장하기로 한다

2.「툴 박스」→「커먼 컨트롤」→「Button」을 Form1 윈도우의 적당한 장소에 D&D


2. 버튼을 더블 클릭하여 클릭 이벤트 추가

3. 클릭 이벤트에 다음 코드를 추가합니다.

Form1.cs
private void button1_Click(object sender, EventArgs e)
        {
            frame.SaveImage(@"C:\cs_source\img\cap.png");
            using (Mat cap = new Mat(@"C:\cs_source\img\cap.png"))
            {
                //保存されたキャプチャ画像の出力
                Cv2.ImShow("test1", frame);
            }
        }

실행 결과



C:\cs_source\img\에 대한 출력 결과의 스크린샷



참고 URL



카메라 영상을 PictureBox로 출력
htp : // bg. 아오오오 r. jp / 우세 r5 / 아 r ゔ s / 46255389. HTML

좋은 웹페이지 즐겨찾기