2013-10-26 42 views
0

我正在創建一個程序,該程序將獲取在用戶的全身圖片上繪製的矩形的寬度和長度。我似乎無法得到正確的scaleFactor,minNeighbor和大小。我應該怎樣還是怎樣做才能得到正確的信息的...正確的scaleFactor,minNeighbor和使用hacascascade檢測上半身和下半身的尺寸

這裏是我的代碼:

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; 
      } 
     } 
    } 
} 

回答

2

沒有正確的參數。您應該爲您的問題選擇它們。爲此,你應該知道這些參數代表什麼。讓我幫你一點。

scaleFactor:這個參數有一個交易。如果您選擇的更大,檢測器的工作速度會更快,但檢測率會更低。如果您選擇較大,它不會在每個比例中找到上半身或下半身。所以簡單大一點scaleFactor - >檢測速度更快,檢測率更低。較小scaleFactor - >檢測速度較慢,檢出率較高。

minNeighbor:基本定義是這樣的,第一檢測器檢測候選體區,然後在其上選擇的身體區域的那些候選區域施加一些過濾。在這裏,過濾是每個候選區域的最小鄰居數量,所以如果選擇參數3並且您有10個候選區域,但它們之間不是鄰居(可以說重疊),您將不會得到任何檢測到的物體。如果你選擇這個參數高,它會發現更少的機構,並選擇它低找到更多的機構。但並非所有檢測到的區域都是正確的。如果你選擇它低,探測器可能會發現給定圖像中的大部分物體,但它也會帶來大量的錯誤檢測。如果選擇較高的錯誤檢測率會很小,但可能會錯過一些正確的檢測結果。

你最好閱讀有關這方面的原始文檔。

希望它有幫助..

+0

感謝您的回答和時間先生。 – newbie07