예전버전용 'OpenCvSharp' 캡쳐는 포스팅한적이 있습니다.
(참고 : [C#.NET, OpenCVSharp] 웹캠(Web Cam) 이미지 사용하기 )
'OpenCvSharp4'용 포스팅을 다시 합니다.
누겟에서 다음 패키지를 설치합니다.
- OpenCvSharp4
- OpenCvSharp4.Extensions
사용하려는 운영체제나 플랫폼에 따라 ' OpenCvSharp4.runtime.[대상] ' 패키지를 설치합니다.
예>
윈도우 : OpenCvSharp4.runtime.win
UWP : OpenCvSharp4.runtime.uwp
우분투 : OpenCvSharp4.runtime.ubuntu.18.04-x64
사용하려는 프래임웤에 따라 추가로 확장이 필요 할 수 있습니다.
- WinForm : OpenCvSharp4.Windows
- WPF : OpenCvSharp4.WpfExtensions
캠을 캡처하려면 일단 비디오 캡처(VideoCapture)개체 부터 만들어야 합니다.
비디오 캡처(VideoCapture)개체를 만들 때 인덱스를 전달할 수 있습니다.
이 인덱스는 운영체제가 가지고 있는 캠에 대한 인덱스입니다.(한대만 연결되어 있다면 0)
//지정된 번호의 카메라로 개체 생성
VideoCapture? cam = new VideoCapture(0);
비디오 캡처 개체를 만들 때 사용할 API를 지정할 수 있는데 캠이나 컴퓨터 환경에 따라서 특정 API를 지정해야 할 수 있습니다.
제가 가지고 있는 캠 중 'Logitech BRIO'는 카메라 크기가 '4096*2160'까지 지원하는데
이것을 윈도우에서 사용하려면 '다이렉트쇼(DirectShow)'를 사용해야 합니다.
(기본 API를 사용하면 강제로 1980*1080 크기로 캡처됩니다.)
//다이렉트쇼(DirectShow)를 사용하는 경우
VideoCapture? cam = new VideoCapture(0, VideoCaptureAPIs.DSHOW);
사용할 카메라에 맞게 환경을 설정할 수 있습니다.
//사용할 fps 설정
cam.Fps = 30;
//사용할 프레임 크기 설정
cam.FrameWidth = 1980;
cam.FrameHeight = 1080;
사용할 카메라가 지원하는 범위에서 설정해야 오류 없이 빠르게 설정됩니다.
지원 범위가 벗어나는 경우 어떤 문제가 발생할지 알 수 없습니다.
캡처를 위해서는 임시로 이미지 정보를 저장할 Mat을 생성해야 합니다.
//임시 이미지 개체 생성
Mat matTemp = new Mat();
캠을 읽어 임시 개체에 넣어 줍니다.
//지정된 장비에서 캡처
cam.Read(matTemp);
이렇게 저장된 'Mat' 개체는 원하는 가공을 해서 화면에 출력시킵니다.
윈폼(WinForm)으로 만든 테스트 프로젝트입니다.
다운로드 : github - dang-gun/DotNetSamples/OpenCvSharp4_WebCamCapture
'Mat' 개체를 윈폼의 픽쳐 박스(PictureBox)에 출력하는 코드는 아래와 같습니다.
//화면에 출력
this.pictureOutput.Image = matTemp.ToBitmap();
'OpenCvSharp'의 최고 장점은 가급적 'OpenCv'와 구조를 동일하게 가려고 한다는 점입니다.
그런데.... 버전이 올라가면서 구조가 왜 이렇게 많이 바뀐 거니??