2013-09-29 6 views
0

Я пытаюсь разработать приложение, которое будет обнаруживать верхнюю часть тела и нижнюю часть тела человека через веб-камеру. Я попытался посмотреть на обнаружение лица эмги и загрузить «haarcascade_upperbody.xml» и «haarcascade_lowerbody.xml». Я попытался скомпоновать что-то такое с обнаружением лицаemgucv bodydetection с использованием haarcascade

Но проблема в том, что он не обнаружит мое тело, и оно больше не в режиме реального времени. Он задерживается на 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 найдены на одном изображении, очень низок. И чтобы найти людей, вы должны использовать PeopleDetector в HoGDescriptor. –

ответ

0

Я думаю, что лучший способ найти человеческое тело в вертикальном положении, детектор пешеходов, который поставляется поставляется с OpenCV. Вам не нужна никакая подготовка, поскольку она уже реализована в HogDescriptor.

См. this example для emguCV. Что касается вашего кода с использованием каскада, я никогда не пробовал этот предварительно подготовленный каскад, поэтому я не знаю, для какого типа изображения они были обучены.

+0

, но дело в том, что мне нужно отличить верхнюю часть тела от нижней части тела ... верхняя часть тела имеет другое измерение ... а также нижняя часть тела ... если я буду использовать пешеход, он только обнаруживает все тело как это ... – newbie07

+0

О! Я этого не знал! Затем вы можете попытаться обнаружить все тело с помощью пешеходного детектора, создать ROI, а затем запустить каскад хара на небольшой области. Это будет очень быстро и иметь больше шансов найти его. Но я бы не попытался обнаружить нижнее тело только в том случае, если верхняя часть тела найдена. Попытайтесь найти каждый из них по отдельности, и если вы только что нашли его (например, нижнюю часть тела), вы можете экстраполировать высоту верхней части тела, вычитая высоту всего тела за вычетом нижнего тела. Просто идея! Использовать ваше воображение :) –

0

Это старый, но стоимость времени представляет для меня больше интереса.

Как вы говорите

«но решить обе проблемы»

  1. является то, что он не обнаружит мое тело и
  2. это не в режиме реального времени больше , Он задерживается на 3 секунды?

Начиная с № 2 первого:

Давайте предположим, что на 3 секунды вы имеете в виду это занимает 3 секунды, чтобы применить Хаара каскады. IMHO & опыт, то есть из-за ряда факторов.

Время обработки каскада хара эквивалентно размеру целевого объекта с точки зрения высоты и ширины пикселей, а также используемых параметров.

Кроме того, параметры DetectMultiScale будут влиять на производительность. На моей довольно мускулистый машине, я вижу ширину MP4 кадра 1280х720 принимая 1,5 секунды, чтобы обработать изображение со следующими параметрами:

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

«WebM» 720p А есть возможность обрабатывать одни и те же параметры в 1 секунду. Вы можете настроить свои классификаторы, чтобы сделать это быстрее или медленнее, играя с этими настройками. Я поставил некоторые элементы управления на экране для моих образцов шахт и немного настроил их.

На простых меньших одиночных тестовых jpg-изображениях это довольно быстро, как 200 мс.

HOG FindPedestrian.Find довольно быстро и точно обнаруживает целые тела примерно за 1/10 времени 150 мс, что почти достаточно быстро для примерно 7 кадров в секунду (кадров в секунду) снова, что на моем I7 (не используя GPU).

С точки зрения вашей 1-ой задачи:

1> является то, что он не обнаружит мое тело и?

Хорошо, фрагмент кода, заимствованный из образца EMGU, является обнаружением Глаза внутри лица.

  • Глаза идут внутри лица.
  • Нижние тела не находятся внутри верхних тел.

Если вы использовали Hog найти относительное положение тела, а затем передать это изображение фрагмента к детектору для Хаара нижней & верхних может быть значительно быстрее ответы, а не сканирование всего изображения.

Я думаю, что вам придется играть/настраивать настройки, чтобы найти что-либо.

Также исправить логику нахождения нижней части верхней части.

Смежные вопросы