Window/WPF2010. 6. 20. 20:50

OpenCv를 사용하여 캠 화면을 띄우는 방법에 대한 포스팅입니다.

 

들로네 님의 큰 도움이 있었습니다. ^^

들로네님 블로그 : http://blog.naver.com/tramper2

들로네님 운영 카페 : http://cafe.naver.com/opencvsharp.cafe

 

C#을 이용한 OpenCv와 DirectShow에 관한 유용한 정보가 많으니 들려보시면 많은 도움이 되실 겁니다.

 

캠의 목록 선택에 따라 화면을 보여주는 예제로

Timer를 이용하여 카메라의 각 프레임을 WriteableBitmap으로 변환하여 Image에 보여주는 방식입니다.

캠의 목록을 얻어오는 부분은 DirectShow를 사용하였습니다.

 

소스는 다음과 같습니다.

    public partial class Window1 : Window

    {

        private CvCapture capture;

        private DispatcherTimer timer;

        private WriteableBitmap writeBitmap;

        private IplImage src;

 

        public Window1()

        {

            InitializeComponent();           

        }

 

        protected override void OnInitialized(EventArgs e)

        {

            base.OnInitialized(e);

 

            // 캠 목록 얻어오기

            foreach (DirectShowLib.DsDevice ds in

                DirectShowLib.DsDevice.GetDevicesOfCat

                  (DirectShowLib.FilterCategory.VideoInputDevice))

            {

                camList.Items.Add(ds.Name);

            }

 

            SetTimer();

        }

 

        protected override void OnClosing(System.ComponentModel.CancelEventArgs e)

        {

            base.OnClosing(e);

 

            if (capture != null)

            {

                capture.Dispose();

            }

 

            if (timer != null)

            {

                timer.Stop();

            }

        }

 

        private void initCamera(int camIndex)

        {

            try

            {

                // 해당 카메라 가져오기

                capture = CvCapture.FromCamera(CaptureDevice.DShow, camIndex);

 

                // 이미지에 비트맵 연결

                writeBitmap = new WriteableBitmap(capture.FrameWidth,

                                          capture.FrameHeight, 96, 96, PixelFormats.Bgr24, null);

                camDisplay.Source = writeBitmap;

            }

            catch(Exception e)

            {

                if (timer != null)

                {

                    timer.Stop();

                }

 

                if (capture != null)

                {

                    capture.Dispose();

                    capture = null;

                }

                MessageBox.Show(e.ToString());

            }

        }

 

        private void SetTimer()

        {

            timer = new DispatcherTimer();

            timer.Interval = new TimeSpan(0, 0, 0, 0, 33);

            timer.Tick += new EventHandler(TimerClock_Tick);

        }

 

        void TimerClock_Tick(object sender, EventArgs e)

        {

            // 카메라의 프레임을 비트맵으로 변환

            using (src = capture.QueryFrame())

            {

                WriteableBitmapConverter.ToWriteableBitmap(src, writeBitmap);

            }

        }

 

        private void btnStart_Click(object sender, RoutedEventArgs e)

        {

            if (capture != null && !timer.IsEnabled)

            {

                timer.IsEnabled = true;

                timer.Start();

            }

        }

 

        private void btnStop_Click(object sender, RoutedEventArgs e)

        {

            if (capture != null)

            {

                timer.IsEnabled = false;

                timer.Stop();

            }

        }

 

        private void camList_SelectionChanged(object sender,   

              System.Windows.Controls.SelectionChangedEventArgs e)

        {

            initCamera(camList.SelectedIndex);

        }

    }

 

[ 결과 화면 ]

노트북이라 화질이 정말 안 좋군요. -_- ;;

 

필요한 사항들은 다음과 같습니다. (저는 모두 1.1 버전을 사용하였습니다. )

 

- OpenCV : http://sourceforge.net/projects/opencvlibrary/files/ 

- OpenCvShrap : http://cafe.naver.com/opencvsharp/481

 

캡쳐보드를 사용하는 경우 화면이 멈추는 현상이 발생할 수 있습니다.

    그럴 땐 캡쳐보드의 Deinterlace 속성을 변경시키거나 다른 옵션들을 보셔야 합니다.

'Window > WPF' 카테고리의 다른 글

[ WPF ] BackgroundWorker  (2) 2010.07.11
[ WPF ] 윈도우 이벤트  (4) 2010.07.11
[ WPF ] 이미지 그림판  (2) 2010.05.08
[ WPF ] UI 쓰레드 변경하기  (0) 2010.05.04
[ WPF ] WPF in Flash  (0) 2010.04.29
Posted by 열ㅇl