2013-09-29 84 views
0

我試圖開發一個應用程序,可以通過網絡攝像頭檢測到人的上半身和下半身。我試着看emgu的臉部檢測並下載了「haarcascade_upperbody.xml」和「haarcascade_lowerbody.xml」。我試圖編碼與面部檢測相同的東西emgucv身體檢測使用hacascascade

但問題是,它不會檢測到我的身體,它不再是實時的。它延遲3秒?

這是我的代碼。我希望有人能幫助我:

private void ProcessFrame(object sender, EventArgs arg) 
    { 
     Image<Bgr, Byte> ImageFrame = capture.QueryFrame(); 
     FittingBox.Image = ImageFrame; 

     long detectionTime; 

     List<Rectangle> upper = new List<Rectangle>(); 
     List<Rectangle> lower = new List<Rectangle>(); 
     Detect(ImageFrame,"haarcascade_upperbody.xml","haarcascade_lowerbody.xml",upper,lower,out detectionTime); 
     foreach (Rectangle up in upper) 
      ImageFrame.Draw(up, new Bgr(Color.Red), 2); 
     foreach (Rectangle low in lower) 
      ImageFrame.Draw(low, new Bgr(Color.Blue), 2); 
    } 



public static void Detect(Image<Bgr, Byte> image, String upperFileName, String lowerFileName, List<Rectangle> upperbody, List<Rectangle> lowerbody, out long detectionTime) 
    { 
     Stopwatch watch; 

     if (GpuInvoke.HasCuda) 
     { 
      using (GpuCascadeClassifier upper = new GpuCascadeClassifier(upperFileName)) 
      using (GpuCascadeClassifier lower = new GpuCascadeClassifier(lowerFileName)) 
      { 
       watch = Stopwatch.StartNew(); 
       using (GpuImage<Bgr, Byte> gpuImage = new GpuImage<Bgr, byte>(image)) 
       using (GpuImage<Gray, Byte> gpuGray = gpuImage.Convert<Gray, Byte>()) 
       { 
        Rectangle[] upperRegion = upper.DetectMultiScale(gpuGray, 1.1, 10, Size.Empty); 
        upperbody.AddRange(upperRegion); 
        foreach (Rectangle f in upperRegion) 
        { 
         using (GpuImage<Gray, Byte> upperImg = gpuGray.GetSubRect(f)) 
         { 
          using (GpuImage<Gray, Byte> clone = upperImg.Clone()) 
          { 
           Rectangle[] lowerRegion = lower.DetectMultiScale(clone, 1.1, 10, Size.Empty); 

           foreach (Rectangle e in lowerRegion) 
           { 
            Rectangle lowerRect = e; 
            lowerRect.Offset(f.X, f.Y); 
            lowerbody.Add(lowerRect); 
           } 
          } 
         } 
        } 
       } 
       watch.Stop(); 
      } 
     } 
     else 
     { 
      using (CascadeClassifier upper = new CascadeClassifier(upperFileName)) 
      using (CascadeClassifier lower = new CascadeClassifier(lowerFileName)) 
      { 
       watch = Stopwatch.StartNew(); 
       using (Image<Gray, Byte> gray = image.Convert<Gray, Byte>()) 
       { 
        gray._EqualizeHist(); 
        Rectangle[] upperDeteced = upper.DetectMultiScale(
         gray, 
         1.1, 
         10, 
         new Size(50, 50), 
         Size.Empty); 

        foreach (Rectangle f in upperDeteced) 
        { 
         gray.ROI = f; 

         Rectangle[] lowerDetected = lower.DetectMultiScale(
          gray, 
          1.1, 
          10, 
          new Size(50, 50), 
          Size.Empty); 
         gray.ROI = Rectangle.Empty; 

         foreach (Rectangle e in lowerDetected) 
         { 
          Rectangle lowerRect = e; 
          lowerRect.Offset(f.X, f.Y); 
          lowerbody.Add(lowerRect); 
         } 
        } 
       } 
       watch.Stop(); 
      } 
     } 
     detectionTime = watch.ElapsedMilliseconds; 
    } 
+0

你能明確表達出什麼問題嗎?至於「實時」,還不夠清楚。你的照片的分辨率是多少?每秒多少幀?它是否檢測到其他上身? –

+0

問題是系統無法檢測到任何...我想繪製一個矩形上捕獲的上半身,但它不繪製...我所有的代碼都在上面陳述... – newbie07

+0

你試過一個非常簡單這樣做之前測試?就像試圖檢測上身?因爲現在,你似乎試圖找到上半身,然後,如果你找到它,試着找到下半身。在一個圖像中發現這2個的機率非常低。要找人,你應該使用HoGDescriptor中的PeopleDetector。 –

回答

0

我認爲最好的方式找到一個人體處於直立位置自帶隨OpenCV的行人檢測。您不需要任何培訓,因爲它已經在HogDescriptor中實施。

對於emguCV,參見this example。至於你的代碼使用級聯,我從來沒有嘗試過這些預先訓練的級聯,所以我不知道他們已經訓練了哪種圖像。

+0

但事情是我需要區分上半身與下半身......上半身有不同的尺寸......下半身也是如此......如果我將使用步行者,它只能檢測到整個身體爲是... – newbie07

+0

哦!我不知道!然後,您可以嘗試使用行人探測器檢測整個身體,創建ROI,然後在小區域運行哈爾級聯。這將非常快速,並有更大的機會找到它。但是,只有在發現上身後,我纔會嘗試探測下半身。嘗試分別找到它們中的每一個,並且如果您剛剛找到一個(例如下半身),則可以通過減去整個身體的高度減去下半身來推斷上半身的高度。只是一個想法!動用你的想象力 :) –

0

這是舊的,但時間成本更令我感興趣。

至於你說

「但解決了這兩個問題,」

  1. 是,它不會檢測我的身體和
  2. 它在實時的沒有任何更多。它延遲3秒?

與#2第一個開始:

讓我們3秒你的意思是它採取3秒適用哈爾級聯承擔。恕我直言&的經驗,這是由於一些因素。

處理哈爾級聯的時間等於目標對象的大小,以像素數量的高度和寬度以及使用的參數爲準。

此外,DetectMultiScale參數將影響性能。在我的相當結實的機器,我看到服用1.5秒具有下列設置來處理的圖像的1280×720 MP4幀寬度:

scaleFactor = 1.07 
    minNeighbors = 2 
    minSize = 8,8 
    maxSize = 200,200 

A「WEBM」 720p的是能夠在1秒內處理相同的設置。您可以通過使用這些設置來調整分類以使其更快或更慢。我在屏幕上放置了一些控件,用於開發我的礦樣,並對它們進行了一些調整。

在簡單的較小的單一測試jpg圖像上,它相當快,像200毫秒。

HOG FindPedestrian.Find在大約1/10時間內發現整個身體150毫秒,這對於我的I7(不是使用GPU)而言,速度足夠快,達到每秒7幀(每秒幀數) )。

在你的第一問題的條款:

1>是,它不會檢測到我的身體和?

好吧,您從EMGU樣本中借用的代碼片段是一個檢測面部內的眼睛。

  • 眼睛在臉上。
  • 上半身沒有發現下身。

如果您使用的生豬找到身體的相對位置,然後通過該圖像片段的探測器哈爾下&上它可能是顯著更快的響應速度,而不是掃描整個圖像。

我認爲你將不得不播放/調整設置找到任何東西。

還修複查找較低內部的邏輯。