IT정보공유/C#

C# EMGUCV를 이용한 RTSP Stream 영상재생 샘플코드

알지오™ 2019. 10. 16.

요즘 계속 EMGUCV 관련 포스트를 하고 있네요. 실무에서 개발 진행 중인 부분이다 보니 아무래도 테스트를 많이 하고 있어서 그런것 같습니다. 영상처리 라이브러리인 OpenCV를 C#에서 사용하기 쉽도록 Wrapper Class를 제공해 주는  EMGUCV v4 최신버전을 이용한 샘플코드입니다.

 

UserControl로 만들어진 샘플 코드이며 급하게 급조된 테스트 코드이기 때문에 예외처리같은것은 별로 신경안썼습니다. 적당히 감안하시고 참고하시고요.

 

 

EmguCV에서 영상을 가져오는 방법 2가지

VideoCapture의 이벤트 핸들러 ImageGrabbed 이용 하는 방법

타이머나 쓰레드를 이용해서 원하는 타이밍에 QueryFrame()함수를 이용하는 방법

 

이 소스코드는 VideoCapture의 이벤트 핸들러인 ImageGrabbed 이용해 RTSP 영상을 표출합니다.

 

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Emgu.CV;
using System.Diagnostics;
using System.Threading;
using Emgu.CV.Structure;

namespace EmguCVTest
{
    public partial class ucEmguRtspPlayer : UserControl
    {
        string _rtspAddr;
        Thread _thrRTSP;
        bool _thrRunning = true;
        int _NoFrameCount = 0;

        VideoCapture _RTSPCapture;


        public ucEmguRtspPlayer()
        {
            InitializeComponent();
        }

        public void ConnectRTSP(string rtspaddr)
        {
            _rtspAddr = rtspaddr;
            _thrRTSP = new Thread(new ThreadStart(Run));
            _thrRTSP.Start();

        }

        public void Run()
        {
            Debug.WriteLine(_rtspAddr + " : Open");
            _RTSPCapture = new VideoCapture(_rtspAddr);

            //_RTSPCapture.SetCaptureProperty(Emgu.CV.CvEnum.CapProp.Fps, 10);
            //_RTSPCapture.SetCaptureProperty(Emgu.CV.CvEnum.CapProp.FrameCount, 10);

            Debug.WriteLine(_rtspAddr + " : Opened");
            _RTSPCapture.ImageGrabbed += _RTSPCapture_ImageGrabbed;
            _RTSPCapture.Start();
            
        }

        private void _RTSPCapture_ImageGrabbed(object sender, EventArgs e)
        {
            using (Mat frame = new Mat())
            {
                _RTSPCapture.Retrieve(frame, 0);

                if(!frame.IsEmpty)
                    imageBox1.Image = frame.ToImage<Bgr, Byte>();
            }
        }

        public void DisconnectRTSP()
        {
            _thrRunning = false;
            //if(_thrRTSP != null)
            //{
            //    _thrRTSP.Abort();
            //}
        }
        
        private void timer1_Tick(object sender, EventArgs e)
        {
            if(_RTSPCapture != null)
            {
                Mat frame = _RTSPCapture.QueryFrame();
                if (!frame.IsEmpty)
                    imageBox1.Image = frame.ToImage<Bgr, Byte>();
            }
        }
    }
}

 

캡쳐된 영상이미지를 화면에 표출하는 컨트롤은 imageBox1 입니다.

Emgu.CV.UI.ImageBox 객체이며 이 컨트롤도 EmguCV에서 제공이 되며, Emgu.CV.UI.dll을 참조하여 도구상자에 추가하시면 됩니다.

 

도움이 되셨길 바랍니다.

 

* 소스 코드 추가했습니다.

timer1_Tick 이벤트에서 QueryFrame()함수 호출 하는 부분입니다.

이벤트 방식이 아닌 타이머 방식으로 렌더링 할 수 있습니다.

 

VLC에서 만든 RTSP 라이브러리 LibVLC도 있네요. 안정적입니다.

 

 

댓글

💲 추천 글