0

ユーザーの全身写真に描かれた長方形の幅と長さを取得するプログラムを作成しています。正しい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);
                //    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;
            }
        }
    }
}
4

1 に答える 1

3

正しいパラメータがありません。問題に対してそれらを選択する必要があります。そのためには、これらのパラメーターが何を表しているかを知っておく必要があります。少しお手伝いさせてください。

scaleFactor:このパラメーターには代償があります。より大きく選択すると、検出器の動作は速くなりますが、検出率は低くなります。大きく選択すると、すべてのスケールで上半身または下半身が検出されません。したがって、単純にscaleFactorを大きくすると、検出が速くなり、検出率が低下します。scaleFactorが小さい-> 検出が遅くなり、検出率が高くなります。

minNeighbor:基本的な定義はこれです。検出器は最初に候補となる身体領域を検出し、次にそれらの候補領域に何らかのフィルタリングを適用して身体領域を選択します。ここで、フィルタリングは各候補領域の最小隣接数であるため、パラメーター 3 を選択し、10 個の候補領域がある場合、それらのいずれも隣接していない (つまり、重複している) 場合、検出されたボディは取得されません。このパラメータを高く選択すると検出される物体が少なくなり、低く選択するとより多くの物体が検出されます。しかし、検出されたすべての領域が正しいわけではありません。低い値を選択すると、検出器はおそらく指定された画像内のほとんどの物体を検出しますが、多くの誤検出も発生します。高い値を選択すると、誤検出率は非常に低くなりますが、正しい検出を見逃す可能性があります。

これについては、元のドキュメントを読むことをお勧めします。

それが役に立てば幸い..

于 2013-10-26T10:04:52.240 に答える