使用haarcascade检测上半身和下半身的正确比例因子,最小邻居和大小

本文关键字:邻居 上半身 检测 haarcascade 下半身 使用 | 更新日期: 2023-09-27 18:36:59

我正在创建一个程序,它将获得在用户的全身图片上绘制的矩形的宽度和长度。我似乎无法获得正确的比例因子,最小邻居和大小。我应该如何或应该怎么做才能获得正确的信息...

这是我的代码:

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);
                //    double width = (Upp_Body.rect.Width * 0.264583333);
                //    textBox1.Text = (Convert.ToString(width));
                //}
                try
                {
                    frame.Draw(UpperBodyDetect[0][0].rect, new Bgr(Color.Red), 2);
                    double 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;
            }
        }
    }
}

使用haarcascade检测上半身和下半身的正确比例因子,最小邻居和大小

没有正确的参数。您应该为您的问题选择它们。为此,您应该知道这些参数代表什么。让我帮你一点。

scaleFactor: 此参数有一个交易。如果选择更大的探测器,则检测器工作得更快,但检测率会更低。如果你选择更大的,它不会在每个比例中找到上半身或下半身。所以简单地说,更大的尺度因子 ->更快的检测,更低的检测率。比例因子更小 ->检测速度较慢,检测率较高。

minNeighbor: 基本定义是这样的,检测器首先检测候选身体区域,然后通过对这些候选区域应用一些过滤来选择身体区域。在这里,过滤是每个候选区域的最小相邻计数,因此,如果您选择参数 3 并且您有 10 个候选区域,但没有一个是邻居(也就是说重叠),您将不会得到任何检测到的实体。如果选择此参数高,它将找到较少的实体,选择低将找到更多的实体。但并非所有检测到的区域都是正确的。如果选择低,探测器可能会找到给定图像中的大多数物体,但它也会给出很多错误检测。如果选择它,高误检率将非常小,但它可能会错过一些正确的检测。

最好阅读有关此内容的原始文档。

希望对您有所帮助。