Я пытаюсь разработать приложение, которое будет обнаруживать верхнюю часть тела и нижнюю часть тела человека через веб-камеру. Я попытался посмотреть на обнаружение лица эмги и загрузить «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;
}
Можете ли вы четко сформулировать, в чем проблема? Что касается «реального времени», это недостаточно ясно. Какова резолюция вашей картины? Сколько кадров в секунду? Обнаруживает ли он другую верхнюю часть тела? –
Проблема в том, что система не может обнаружить никаких ... Я хочу нарисовать прямоугольник на захваченной верхней части тела, но он не рисует ... все мои коды указаны выше ... – newbie07
Вы попробовали очень просто тест перед этим? Как просто пытаться обнаружить верхнюю часть тела? Потому что прямо сейчас, кажется, вы пытаетесь найти верхнюю часть тела, а затем, если вы ее найдете, попытайтесь найти нижнюю часть тела. Шанс, что эти 2 найдены на одном изображении, очень низок. И чтобы найти людей, вы должны использовать PeopleDetector в HoGDescriptor. –