Правильный scaleFactor, minNeighbor и размер для обнаружения верхней части тела и нижней части тела с использованием haarcascade

Я создаю программу, которая получит ширину и длину прямоугольника, нарисованного на изображении всего тела пользователя. Кажется, я не могу получить правильный scaleFactor, minNeighbor и размер. как или что делать, чтобы получить правильную информацию...

Вот мой код:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.Util;
namespace fitting
{ public partial class Form1 : Form { HaarCascade UpperBody = new HaarCascade("haarcascade_mcs_upperbody.xml"); HaarCascade LowerBody = new HaarCascade("haarcascade_lowerbody.xml"); Capture camera; bool captureProcess = false; Image<bgr, byte=""> img; public Form1() { InitializeComponent(); } void viewImage(object sender, EventArgs e) { img = camera.QueryFrame(); if (img == null) return; CamImageBox.Image = img; } private void btnCapture_Click(object sender, EventArgs e) { if (captureProcess == true) { string data; Application.Idle -= viewImage; captureProcess = false; SaveFileDialog dlg = new SaveFileDialog(); //dlg="Image|*.jpg;*png"; if (dlg.ShowDialog() == DialogResult.OK) { img.ToBitmap().Save(dlg.FileName + ".jpg", System.Drawing.Imaging.ImageFormat.Png); data = dlg.FileName + ".jpg"; } measureImage(); } } void measureImage() { OpenFileDialog dlg2 = new OpenFileDialog(); dlg2.Filter = "Image|*.jpg;*png"; if (dlg2.ShowDialog() == DialogResult.OK) { Image<bgr, byte=""> frame = new Image<bgr, byte="">(dlg2.FileName); Image<gray, byte=""> Gray_Frame = frame.Convert<gray, byte="">(); MCvAvgComp[][] LowerBodyDetect = Gray_Frame.DetectHaarCascade( LowerBody, 1.985603925968, 0, Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, new Size()); MCvAvgComp[][] UpperBodyDetect = Gray_Frame.DetectHaarCascade( UpperBody, 1.3, 5, Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, new Size()); //foreach (MCvAvgComp Upp_Body in UpperBodyDetect[0]) //{ // frame.Draw(Upp_Body.rect, new Bgr(Color.Red), 2); // ****** width = (Upp_Body.rect.Width * 0.264583333); // textBox1.Text = (Convert.ToString(width)); //} try { frame.Draw(UpperBodyDetect[0][0].rect, new Bgr(Color.Red), 2); ****** width = (UpperBodyDetect[0][0].rect.Width); textBox1.Text = (Convert.ToString(width)); } catch (Exception e) { MessageBox.Show(e.Message); } //foreach (MCvAvgComp Low_Body in LowerBodyDetect[0]) //{ // frame.Draw(Low_Body.rect, new Bgr(Color.Green), 2); //} try { frame.Draw(LowerBodyDetect[0][0].rect, new Bgr(Color.Green), 2); } catch (Exception e) { MessageBox.Show(e.Message); } CamImageBox.Image = frame; } } private void Form1_Load(object sender, EventArgs e) { bool useCam = false; if (!useCam) measureImage(); else { try { camera = new Capture(); } catch (Exception exc) { MessageBox.Show(exc.Message); return; } Application.Idle += viewImage; captureProcess = true; } } }
}
</gray,></gray,></bgr,></bgr,></bgr,>
1 ответ

Правильного параметра нет. Вы должны выбрать их для своей проблемы. Для этого вы должны знать, что означают эти параметры. Позвольте мне немного помочь.

scaleFactor: для этого параметра существует торговля. Если вы выберете его, ваш детектор будет работать быстрее, но скорость обнаружения будет меньше. Он не найдет верхний или нижний корпус в каждом масштабе, если вы выберете его больше. Таким образом, просто больший масштабФактор → более быстрое обнаружение, меньшая скорость обнаружения. Меньший масштабФактор → более медленное обнаружение, более высокая скорость обнаружения.

minNeighbor: основное определение заключается в том, что детектор сначала обнаруживает области тела кандидата, а затем, применяя некоторую фильтрацию в тех регионах-кандидатах, он выбирает области тела. Здесь фильтрация - это минимальный подсчет соседей каждой области кандидата, поэтому, если вы выберете параметр 3, и у вас есть 10 регионов-кандидатов, но не из них являются соседями (так сказать, перекрывающимися), вы не получите никаких обнаруженных тел. Если вы выберете этот параметр высокой, он найдет меньше тел и выберет его, чтобы найти больше тел. Но не все обнаруженные регионы будут правильными. Если вы выберете его на низком уровне, детектор, вероятно, найдет большинство тел в данном изображении, но также даст много ложных срабатываний. Если вы выберете его, высокий уровень обнаружения ложных срабатываний будет очень мал, но он может пропустить некоторые правильные обнаружения.

Лучше вы читаете оригинальную документацию об этом.

Надеюсь, поможет..

licensed under cc by-sa 3.0 with attribution.