OpenCV中文网站

 找回密码
 立即注册
搜索
热搜: 安装 配置
查看: 4777|回复: 1

脸部追蹤问题提问

[复制链接]
发表于 2012-8-6 17:58:51 | 显示全部楼层 |阅读模式
请问一下我试著用haar的face detection +camshift来实现人脸追蹤
可是就是不成功!是不是有可以告诉我我错在那裹?!谢谢
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using Emgu.CV;
  10. using Emgu.CV.Structure;
  11. using Emgu.Util;
  12. using System.Threading;
  13. namespace FaceDetection_camshift
  14. {
  15.     public partial class Form1 : Form
  16.     {
  17.         public Form1()
  18.         {
  19.             InitializeComponent();
  20.         }
  21.         private Capture _capture;
  22.         private bool _captureInProgress;
  23.         private HaarCascade face;
  24.         private bool isTrack = false;
  25.         private Image<Gray, byte> hue = null;
  26.         private Image<Gray, byte> mask = null;
  27.         private Image<Gray, byte> backproject = null;
  28.         private Image<Hsv, byte> hsv = null;
  29.         private IntPtr&#91;&#93; img = null;
  30.         private Rectangle trackwin;
  31.         private MCvConnectedComp trackcomp = new MCvConnectedComp();
  32.         private MCvBox2D trackbox = new MCvBox2D();
  33.         private DenseHistogram hist = new DenseHistogram(16, new RangeF(0, 180));
  34.         private void ProcessFrame(object sender, EventArgs arg)
  35.         {
  36.            
  37.            
  38.             using( Image<Bgr, Byte> frame = _capture.QueryFrame())
  39.             {
  40.                  
  41.                  if (isTrack == false)
  42.                  {
  43.                      Image<Gray, Byte> gray = frame.Convert<Gray, Byte>();
  44.                      gray._EqualizeHist();
  45.                      MCvAvgComp&#91;&#93;&#91;&#93; facesDetected = gray.DetectHaarCascade(face, 1.1, 10, Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, new Size(40, 40));
  46.                      hsv = new Image<Hsv, byte>(gray.Width, gray.Height);
  47.                      hsv = gray.Convert<Hsv, byte>();
  48.                      hsv._EqualizeHist();
  49.                      hue = new Image<Gray, byte>(gray.Width, gray.Height);
  50.                      mask = new Image<Gray, byte>(gray.Width, gray.Height);
  51.                      backproject = new Image<Gray, byte>(gray.Width, gray.Height);
  52.                      //Emgu.CV.CvInvoke.cvInRangeS(hsv, new MCvScalar(0, 30, 10, 0), new MCvScalar(180, 256, 256, 0), mask);
  53.                      Emgu.CV.CvInvoke.cvInRangeS(hsv, new MCvScalar(0, 30, Math.Min(10, 255), 0), new MCvScalar(180, 256, Math.Max(10, 255), 0), mask);
  54.                      Emgu.CV.CvInvoke.cvSplit(hsv, hue, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);
  55.                     
  56.                      foreach (MCvAvgComp f in facesDetected&#91;0&#93;)
  57.                      {
  58.                          Emgu.CV.CvInvoke.cvSetImageROI(hue, f.rect);
  59.                          Emgu.CV.CvInvoke.cvSetImageROI(mask, f.rect);
  60.                          frame.Draw(f.rect, new Bgr(Color.Red), 2);
  61.                          trackwin = f.rect;
  62.                         
  63.                      }
  64.                      img = new IntPtr&#91;1&#93;
  65.                     {
  66.                         hue
  67.                     };
  68.                      Emgu.CV.CvInvoke.cvCalcHist(img, hist, false, mask);
  69.                      Emgu.CV.CvInvoke.cvResetImageROI(hue);
  70.                      Emgu.CV.CvInvoke.cvResetImageROI(mask);
  71.                      if (facesDetected&#91;0&#93;.Length > 0)
  72.                      {
  73.                          isTrack = true;
  74.                      }
  75.                  }
  76.                  else
  77.                  {
  78.                      if (trackwin != null)
  79.                      {
  80.                          hsv = frame.Convert<Hsv, byte>();
  81.                          Emgu.CV.CvInvoke.cvInRangeS(hsv, new MCvScalar(0, 30, 10, 0), new MCvScalar(180, 256, 256, 0), mask);
  82.                          Emgu.CV.CvInvoke.cvSplit(hsv, hue, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);
  83.                          imageBox2.Image = hue;
  84.                          imageBox3.Image = mask;
  85.                      }
  86.                      img = new IntPtr&#91;1&#93;
  87.                     {
  88.                             hue
  89.                     };
  90.                      Emgu.CV.CvInvoke.cvCalcBackProject(img, backproject, hist);
  91.                      Emgu.CV.CvInvoke.cvAnd(backproject, mask, backproject, IntPtr.Zero);
  92.                      if (trackwin.Width == 0) trackwin.Width = 40;
  93.                      if (trackwin.Height == 0) trackwin.Height = 40;
  94.                      Emgu.CV.CvInvoke.cvCamShift(backproject, trackwin, new MCvTermCriteria(10, 0.5), out trackcomp, out trackbox);
  95.                      trackwin = trackcomp.rect;
  96.                      //label1.Text = trackcomp.rect.X.ToString();
  97.                      frame.Draw(trackwin, new Bgr(Color.Red), 2);
  98.                  }
  99.          
  100.            
  101.          
  102.             imageBox1.Image = frame;
  103.             }
  104.            
  105.            
  106.         }
  107.         private void button1_Click(object sender, EventArgs e)
  108.         {
  109.             #region if capture is not created, create it now
  110.             if (_capture == null)
  111.             {
  112.                 try
  113.                 {
  114.                     _capture = new Capture();
  115.                     
  116.                 }
  117.                 catch (NullReferenceException excpt)
  118.                 {
  119.                     MessageBox.Show(excpt.Message);
  120.                 }
  121.             }
  122.             #endregion
  123.             if (_capture != null)
  124.             {
  125.                 //pictureBox2.Image = Resource1._01;
  126.                 if (_captureInProgress)
  127.                 {  //stop the capture
  128.                     Application.Idle -= new EventHandler(ProcessFrame);
  129.                     button1.Text = &quot;Start Capture&quot;;
  130.                 }
  131.                 else
  132.                 {
  133.                     //start the capture
  134.                     button1.Text = &quot;Stop&quot;;
  135.                     Application.Idle += new EventHandler(ProcessFrame);
  136.                 }
  137.                 _captureInProgress = !_captureInProgress;
  138.             }
  139.         }
  140.         private void Form1_Load(object sender, EventArgs e)
  141.         {
  142.             face = new HaarCascade(&quot;haarcascade_frontalface_alt_tree.xml&quot;);
  143.         }
  144.     }
  145. }
复制代码
回复

使用道具 举报

 楼主| 发表于 2012-8-7 14:24:44 | 显示全部楼层

脸部追蹤问题提问

问题我已经自行研究出来了,我把程式源码放在我的部落格上,有兴趣的同好
可以参考看看,我使用的是emgucv 2.1.0.793 + Visual Studio 2008 。

<!-- m --><a class=\"postlink\" href=\"http://is90057.pixnet.net/blog/post/46352826\">http://is90057.pixnet.net/blog/post/46352826</a><!-- m -->
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|OpenCV中文网站

GMT+8, 2024-4-29 00:46 , Processed in 0.008701 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表