2014-02-24 3 views
0

나는 카메라에서 캡처 한 이미지를 처리하기 위해 스레딩을 구현 한 프로젝트에서 작업하고 있습니다.라이브 스트리밍의 느려지는 카메라 작동 스레딩

일정 시간 간격 후에 타이머에 의해 호출되는 ProcessFrame()에 대한 아래 코드를 찾으십시오.

private void ProcessImage(string ImagePath) 
    {    
     #region Check for threadSafeFunction 
     if (this.InvokeRequired) 
     { 
      Console.WriteLine("Inside InvokeRequired"); 
      this.Invoke(new MethodInvoker(delegate() { ProcessImage(ImagePath); })); 
     } 
     else 
     { 
1. Detect faces in Image 
    2. Draw Face markers on Image 
    3. Some database based on result of Face Detection 
    4. Delete image File    
     } 

    } 

느려지이었다 ProcessFrame() 기능 실꿰기 작업 가하여 : 여기

private void ProcessFrame() 
{    
      try 
      { 
       Image<Bgr, Byte> ImageFrame; 
       // Get Image from the camera 
       ImageFrame = capture.QueryFrame(); 

       // check if imageFrame is null or not 
       if (ImageFrame == null) 
       { 
    // if null then re- initialize the camera 
        try 
        { 
         capture.Dispose(); 
         capture = new Capture(URL);     
         ImageFrame = capture.QueryFrame();     
        } 
        catch (Exception ex) 
        { 

        } 
       } 
       // resize image to show on Picture control 
       ImageFrame = ImageFrame.Resize(img.Width, img.Height, Emgu.CV.CvEnum.INTER.CV_INTER_LINEAR); 
    // show image on picture control 
       img.Image = ImageFrame; 
       try 
       { 
    #region Making directory and image in this code 
        string VerifyImageFolderId = VerifyImageFolder + "\\" + "Camera_" + (1) + "\\"; 

        if (!Directory.Exists(VerifyImageFolderId)) 
         Directory.CreateDirectory(VerifyImageFolderId); 

        string VerifyImageFileName = VerifyImageFolderId + "\\" + nSavedImagesCounter + ".jpg"; 
        img.Image.Save(VerifyImageFileName); // Save Image 
        nSavedImagesCounter++; 
        #endregion 

        #region Starting thread For processing Image 
        Thread processImage = new Thread(new ThreadStart(() => ProcessImage(VerifyImageFileName))); 
         processImage.Start();      
        #endregion 

       } 
       catch (Exception ex) 
       { 
        Log(ex.Message); 
        MessageBox.Show(ex.Message); 
       } 
       finally 
       { 
        GC.Collect(); 
       } 
       //#endregion 
      } 
      catch (NullReferenceException e) 
      { 
       Console.Write("Exception:\n" + DateTime.Now.ToString("hhmmss")); 
      } 

     } 

는 다음과 같이 일부 파일 처리 동작을 수행 할 수있는 두 번째 함수 ProcessImage(string ImagePath)이다. 및 라이브 스트리밍을 표시 할 수 없습니다.

아무도 도와 드릴 수 있습니까?

미리 감사드립니다.

답변

1

은 내가 한 번이 코드 이미지를

 BlockingCollection<string> imageQueue=new BlockingCollection<string>(); 
     new Thread(() => 
     { 
      foreach (string imagePath in imageQueue.GetConsumingEnumerable()) 
      { 
       ProcessImage(imagePath); 
      } 
     }).Start(); 

을 실행을 처리하기 위해 큐를 사용하고 난 첫 번째 코드를 추가 마십시오 위치를 말해 주시겠습니까이

private void ProcessFrame() 
{ 


     ..... 

       #region Starting thread For processing Image 
       imageQueue.Add(VerifyImageFileName); 
       #endregion 

      ... 

    } 
+0

처럼 ProcessFrame를 변경 제안? –

+0

이 코드는 일단 폼로드에 넣을 수 있으면 실행해야합니다. 또는 초기화 메소드가 있다면 거기에 넣을 수 있습니다. – Milad

+0

답변 해 주셔서 감사합니다. 그러나 답변의 첫 번째 부분을 설명 할 수 있습니까? 왜 초기화해야합니까? 한 번? –

관련 문제