簡體   English   中英

如何在C#中停止相機? 使用grabber.dispose時出錯

[英]How to stop a camera in c#? Error while using grabber.dispose

我正在用C#開發一個項目。 我有一個停止按鈕,它調用grabber.dispose,但是當我單擊它時,應用程序崩潰了,並出現以下錯誤:

對象引用未設置為對象的實例。

FrameGrabber函數應停止程序並將其移至當前幀。

捕獲采集卡:

     private void FDButton_Click(object sender, EventArgs e)
            {
                CameraCapture();
                Application.Idle += new EventHandler(FrameGrabber);
                //initalize Frame grabber event
                FDButton.Enabled = false;
            }

            private void FrameGrabber(object sender, EventArgs e)
            {


                    currentFrame = grabber.QueryFrame().Resize(320, 240, Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC);
                    //convert frame to gray scale
                    gray = currentFrame.Convert<Gray, Byte>();
                    //now detect face by using classifier
                    MCvAvgComp[][] facesDetected = gray.DetectHaarCascade(

                        face,//name of cascade
                        1.2,
                        10,
                        Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING,
                        new Size(20, 20));

                    //now check each frame of imagebox containing video and detect face
                    foreach (MCvAvgComp f in facesDetected[0])
                    {
                        //if face found increment t
                        t = t + 1;
                        //now see result by copying detected face in a frame name as result
                        result = currentFrame.Copy(f.rect).Convert<Gray, byte>().Resize(100, 100, Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC);
                        //we convert current frame to gray scale and resize to 200x100
                        //now draw rectangle on detected image
                        currentFrame.Draw(f.rect, new Bgr(Color.Red), 2);
                    }



                    //view currentframe in imported imagebox
                    DetectionImageBox.Image = currentFrame;



            }

相機拍攝功能:

 public void CameraCapture()
        {
            grabber = new Capture();
            grabber.QueryFrame();
        }

取消按鈕:

        private void FDStopButton_Click(object sender, EventArgs e)
        {
            grabber.Dispose();

        } 

這很可能是由於您已訂閱Idle事件處理程序而發生的。

Application.Idle += new EventHandler(FrameGrabber);

FrameGrabber仍被訂閱,但是通過調用dispose,您已將FrameGrabber設置為空引用,因此,在事件觸發時,您將獲得異常。

您需要取消訂閱事件處理程序,因此不會發生這種情況:

   private void FDStopButton_Click(object sender, EventArgs e)
   {
       Application.Idle -= FrameGrabber;
       grabber.Dispose();
   } 

您可以在此處查看有關取消訂閱的更好描述: https : //docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/events/how-to-subscribe-to-and-and-unsubscribe-from-events

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM