나는 웹캠을 통해 사람의 상체와 하체를 감지하는 응용 프로그램을 개발하려고합니다. 나는 emgu의 얼굴 탐지를보고 "haarcascade_upperbody.xml"과 "haarcascade_lowerbody.xml"을 다운로드하려고했습니다. 주어진 얼굴 인식과 동일한 코드를 시도했습니다.haarascascade를 사용하는 emgucv bodydetection
그러나 문제는 내 몸을 감지하지 못하고 실시간으로 더 이상 보이지 않는 것입니다. 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;
}
문제를 명확하게 공식화 할 수 있습니까? "실시간"은 충분히 명확하지 않습니다. 사진의 해상도는 어떻게됩니까? 초당 프레임 수는 얼마입니까? 다른 상체를 감지합니까? –
문제는 시스템에서 아무 것도 감지 할 수 없다 ... 캡쳐 된 상체에 직사각형을 그려야하지만 그리지는 않는다 ... 내 모든 코드는 위에 명시되어있다 ... – newbie07
매우 간단한 방법을 시도 했습니까? 이 일을하기 전에 테스트? 상체를 탐지하려고하는 것만 큼? 왜냐하면 지금 당장 상체를 찾으려고하고, 발견하면 하체를 찾으십시오. 이 2 개가 하나의 이미지에서 발견 될 확률은 매우 낮습니다. 사람들을 찾으려면 HoGDescriptor에서 PeopleDetector를 사용해야합니다. –