C# 使用haarcascade检测上半身和下半身的右比例因子、minNeighbor和大小

C# 使用haarcascade检测上半身和下半身的右比例因子、minNeighbor和大小,c#,opencv,emgucv,C#,Opencv,Emgucv,我正在创建一个程序,它将获得在用户全身图片上绘制的矩形的宽度和长度。我似乎找不到合适的缩放因子、明尼堡和大小。我应该如何或怎样做才能获得正确的信息 这是我的密码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System

我正在创建一个程序,它将获得在用户全身图片上绘制的矩形的宽度和长度。我似乎找不到合适的缩放因子、明尼堡和大小。我应该如何或怎样做才能获得正确的信息

这是我的密码:

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;
            }
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用系统组件模型;
使用系统数据;
使用系统图;
使用System.Linq;
使用系统文本;
使用System.Windows.Forms;
使用Emgu.CV;
使用Emgu.CV.Structure;
使用Emgu.Util;
名称空间拟合
{
公共部分类Form1:Form
{
HaarCascade UpperBody=新的HaarCascade(“HaarCascade_mcs_UpperBody.xml”);
HaarCascade LowerBody=新的HaarCascade(“HaarCascade_LowerBody.xml”);
摄像机;
bool captureProcess=false;
图像img;
公共表格1()
{
初始化组件();
}
void viewImage(对象发送方,事件参数e)
{
img=camera.QueryFrame();
如果(img==null)
返回;
CamImageBox.Image=img;
}
私有void btnCapture_单击(对象发送者,事件参数e)
{
如果(captureProcess==true)
{
字符串数据;
Application.Idle-=viewImage;
captureProcess=false;
SaveFileDialog dlg=新建SaveFileDialog();
//dlg=“Image |*.jpg;*png”;
if(dlg.ShowDialog()==DialogResult.OK)
{
img.ToBitmap().Save(dlg.FileName+“.jpg”,System.Drawing.Imaging.ImageFormat.Png);
数据=dlg.FileName+“.jpg”;
}
measuremage();
}
}
void measuremage()
{
OpenFileDialog dlg2=新建OpenFileDialog();
dlg2.Filter=“Image |*.jpg;*png”;
if(dlg2.ShowDialog()==DialogResult.OK)
{
图像帧=新图像(dlg2.FileName);
Image Gray_Frame=Frame.Convert();
MCvAvgComp[]]LowerBodyDetect=灰色\u帧。DetectHarcascade(
下体,
1.985603925968,
0,
Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_prunting,
新尺寸());
MCvAvgComp[][]上部车身检测=灰色(帧)。检测ARCASCADE(
上身,
1.3,
5.
Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_prunting,
新尺寸());
//foreach(上部车身中的MCvAvgComp Upp_车身检测[0])
//{
//画框(Upp_Body.rect,新Bgr(颜色.红色),2);
//双宽度=(Upp_Body.rect.width*0.26458333);
//textBox1.Text=(Convert.ToString(宽度));
//}
尝试
{
frame.Draw(UpperBodyDetect[0][0].rect,新Bgr(Color.Red),2);
double width=(UpperBodyDetect[0][0]。矩形宽度);
textBox1.Text=(Convert.ToString(宽度));
}
捕获(例外e)
{
MessageBox.Show(e.Message);
}
//foreach(MCvAvgComp Low_Body位于LowerBodyDetect[0])
//{
//画框(Low_Body.rect,新Bgr(颜色.绿色),2);
//}
尝试
{
frame.Draw(LowerBodyDetect[0][0].rect,新Bgr(Color.Green),2);
}
捕获(例外e)
{
MessageBox.Show(e.Message);
}
CamImageBox.Image=帧;
}
}
私有void Form1\u加载(对象发送方、事件参数e)
{
bool-useCam=false;
如果(!useCam)
measuremage();
否则{
尝试
{
照相机=新捕获();
}
捕获(异常exc)
{
MessageBox.Show(exc.Message);
返回;
}
Application.Idle+=viewImage;
captureProcess=true;
}
}
}
}

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

scaleFactor:此参数需要交换。如果你选择更大,你的探测器工作得更快,但探测率会更低。如果选择更大的比例,它不会在每个比例中都找到上半身或下半身。因此,只需更大的scaleFactor->更快的检测速度,更低的检测率。scaleFactor越小->检测速度越慢,检测率越高

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

您最好阅读有关这方面的原始文档


希望对您有所帮助。

没有正确的参数。你应该为你的问题选择它们。