小R科技-WIFI机器人网·机器人创意工作室

 找回密码
 立即注册
查看: 17736|回复: 28

基于emgu CV 下的瓦力人脸识别基础版上位机

[复制链接]
发表于 2013-4-1 17:24:11 | 显示全部楼层 |阅读模式
本帖最后由 whble 于 2013-4-1 17:24 编辑

最近学习了Emgu cv 的图像处理算法,使用opencv公司提供的开源代码做了一个远程
图片流的人脸识别检测的上位机,首先来看看效果图
首先启动程序后
QQ截图20130401170929.png
然后点击取得连接,蓝色区域将会显示远程摄像头采集的视频图像,
此时将捕捉人脸,并识别,如图
1.png
侧脸时,由于我使用的是之前训练的识别库,这个角度没法识别出我的脸,
调整角度后结果就如下图,识别出我的脸,并显示出在识别库对应的我的名字。
2.png

当点击训练识别时将调用笔记本的摄像头进行训练,界面如下(此段是参考别人的训练方法)
QQ截图20130401170538.png
在训练框中的名字栏填写要的存储对应头像的人名。
训练完成后,关闭窗口,自动回调出远程视频连接。
再来测试一下识别能力
QQ截图20130401170822.png
同为侧面角度,就能识别出人脸并检测了。

  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 System.Net;
  10. using System.IO;
  11. using Emgu.CV;
  12. using Emgu.CV.Structure;
  13. using Emgu.CV.UI;
  14. using Emgu.CV.GPU;
  15. using Emgu.CV.CvEnum;

  16. namespace FacesDetect
  17. {
  18.     public partial class VideoForm : Form
  19.     {
  20.         private Image<Bgr, byte> currentImage;//设置当前画面
  21.         Image<Gray, byte> result = null;//返回帧
  22.         Image<Gray, byte> gray_frame = null;//灰度帧
  23.         public HaarCascade Face = new HaarCascade(Application.StartupPath + "/Cascades/haarcascade_frontalface_alt2.xml");//载入训练库数据
  24.         MCvFont font = new MCvFont(FONT.CV_FONT_HERSHEY_COMPLEX, 0.5, 0.5);//设置摄像头字体

  25.         //Classifier with default training location
  26.         Classifier_Train Eigen_Recog = new Classifier_Train();//实例化一个分类训练器
  27.         public VideoForm()
  28.         {
  29.             InitializeComponent();
  30.         }


  31.         private void showVideo(object sender, EventArgs e)
  32.         {
  33.             MyCaputre myCap = new MyCaputre();
  34.             string sourceURL = this.textBox1.Text;
  35.             Bitmap bmp = myCap.myCaputre(sourceURL);
  36.             currentImage = new Image<Bgr, byte>(bmp);
  37.             markFace(currentImage);
  38.             pictureBox1.Image = new System.Drawing.Bitmap(currentImage.ToBitmap(), 850, 660);

  39.         }
  40.         private Image<Bgr, byte> markFace(Image<Bgr, byte> pic)
  41.         {
  42.             currentImage =currentImage.Resize(320, 240, Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC);
  43.             //Convert it to Grayscale
  44.             if (currentImage != null)
  45.             {
  46.                 gray_frame = currentImage.Convert<Gray, Byte>();

  47.                 //Face Detector
  48.                 MCvAvgComp[][] facesDetected = gray_frame.DetectHaarCascade(Face, 1.2, 10, Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, new Size(50, 50));

  49.                 //Action for each element detected
  50.                 foreach (MCvAvgComp face_found in facesDetected[0])
  51.                 {
  52.                     result = currentImage.Copy(face_found.rect).Convert<Gray, byte>().Resize(100, 100, Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC);
  53.                     //draw the face detected in the 0th (gray) channel with blue color
  54.                     currentImage.Draw(face_found.rect, new Bgr(Color.Red), 2);

  55.                     if (Eigen_Recog.IsTrained)
  56.                     {
  57.                         string name = Eigen_Recog.Recognise(result);
  58.                         int match_value = (int)Eigen_Recog.Get_Eigen_Distance;

  59.                         //Draw the label for each face detected and recognized
  60.                         currentImage.Draw(name + " ", ref font, new Point(face_found.rect.X - 2, face_found.rect.Y - 2), new Bgr(Color.LightGreen));
  61.                     }
  62.                 }
  63.                 //Show the faces procesed and recognized
  64.                 pictureBox1.Image = currentImage.ToBitmap();
  65.             }
  66.             return pic;
  67.         }
  68.         private void button1_Click(object sender, EventArgs e)
  69.         {
  70.             start_cam();
  71.         }

  72.         private void button2_Click(object sender, EventArgs e)
  73.         {
  74.             stop_cam();
  75.             //OpenForm
  76.             Training_Form TF = new Training_Form(this);//以本窗体为父窗体打开训练窗体
  77.             TF.Show();//启动训练窗体
  78.             
  79.         }
  80.         public void retrain()//重新加载数据
  81.         {

  82.             Eigen_Recog = new Classifier_Train();
  83.             if (Eigen_Recog.IsTrained)
  84.             {
  85.               //  message_bar.Text = "训练图像数据加载完毕!";
  86.             }
  87.             else
  88.             {
  89.                // message_bar.Text = "训练数据无法找到, 请通过训练菜单选项进行训练!";
  90.             }
  91.         }

  92.         public void start_cam()
  93.         {
  94.             Application.Idle += new EventHandler(showVideo);
  95.         }
  96.         private void stop_cam()
  97.         {
  98.             Application.Idle -= new EventHandler(showVideo);

  99.             if (currentImage != null)
  100.             {
  101.                 currentImage.Dispose();
  102.             }
  103.         }
  104.     }
  105. }
复制代码


评分

参与人数 2威望 +1 金钱 +1 贡献 +1 收起 理由
oatoner + 1
liuviking + 1 + 1 赞一个!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2013-4-1 17:32:29 | 显示全部楼层
本帖最后由 whble 于 2013-10-24 14:06 编辑

由于使用了第三方的类库 文件比较大 不好上传 有时间弄到网盘里面去
如果论坛也有人研究opencv的可以交流学习
QQ:512580942
关于楼下如何接收远程视频和用opencv处理做个解释

首先有一个摄像头的类
public class MyCaputre
    {
        byte[] buffer = new byte[1000000];
        int read, total = 0;
         public  Bitmap  myCaputre(string url)
        {
            HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);//url 就是传递过来的视频地址
            WebResponse resp = req.GetResponse();
            System.IO.Stream stream = resp.GetResponseStream();
            while ((read = stream.Read(buffer, total, 100000)) != 0)
            {
                total += read;
            }
       Bitmap bmp = (Bitmap)Bitmap.FromStream(new MemoryStream(buffer, 0, total));
       return bmp;
        }
    }


这段代码是实现远程图片流的显示的
MyCaputre myCap = new MyCaputre();//首先定义MyCaputre
            string sourceURL = this.textBox1.Text; //定义视频地址
            Bitmap bmp = myCap.myCaputre(sourceURL);//将地址作为参数传递到MyCaputre 下面的myCaputre方法
           Image<Bgr, byte> currentImage = new Image<Bgr, byte>(bmp);//定义当前图片等于接收的图片
            markFace(currentImage);//这个方法是实现了人脸识别和检测
            pictureBox1.Image = new System.Drawing.Bitmap(currentImage.ToBitmap(), 850, 660);//将图片绘制在pictureBox中


通过这两部分就实现了远程视频数据的接收和用opencv来处理接收的图片
就可以实现 帖子的内容了
今天有人告诉我说源码无法运行 请问大家下载试用能实现么?





回复 支持 反对

使用道具 举报

发表于 2013-4-1 19:55:18 | 显示全部楼层
这个很牛!顶起来!
回复 支持 反对

使用道具 举报

发表于 2013-4-1 20:04:42 | 显示全部楼层
等楼主上传资料。。。。。嘿嘿。。。百度网盘。迅雷都可以,哈哈
回复 支持 反对

使用道具 举报

发表于 2013-4-1 21:52:38 | 显示全部楼层
顶!OpenCV是运行在PC机里,可以方便地从USB摄像头获得视频数据,不知楼主是否用OpenCV打开从Wifi小车传来的视频流?能不能也把代码写上来共享一下?
回复 支持 反对

使用道具 举报

发表于 2013-4-1 21:55:45 | 显示全部楼层
是否有人把Kinect接在小车上做人体和家具识别?或者通过图像识别避障?
回复 支持 反对

使用道具 举报

发表于 2013-4-1 22:38:05 | 显示全部楼层
这个很强!很有新意~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-4-2 06:53:55 | 显示全部楼层
本帖最后由 whble 于 2013-4-2 07:13 编辑
mysvw 发表于 2013-4-1 21:52
顶!OpenCV是运行在PC机里,可以方便地从USB摄像头获得视频数据,不知楼主是否用OpenCV打开从Wifi小车传来的 ...

是的 打开的是wifi车上的视频,获取视频的方法跟论坛里的差不多

回复 支持 反对

使用道具 举报

发表于 2013-4-2 15:49:00 | 显示全部楼层
whble 发表于 2013-4-2 06:53
是的 打开的是wifi车上的视频,获取视频的方法跟论坛里的差不多

这个我也弄过,不过我测试的时候很卡,视频一顿一顿的,非常慢,不知楼主的怎么样?
回复 支持 反对

使用道具 举报

发表于 2013-4-2 18:32:32 | 显示全部楼层
加我QQ好吗?780611863,有关于图像处理与模式识别的问题请教
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

新品特惠推荐上一条 /2 下一条

QQ|QQ技术咨询1|QQ技术咨询2|商务合作微信1:xiaorgeek001|商务合作微信2:XiaoRGEEK|诚聘英才|Archiver|手机版|小R科技-WIFI机器人网·机器人创意工作室 ( 粤ICP备15000788号-6 )

GMT+8, 2024-5-19 08:35 , Processed in 1.095299 second(s), 23 queries .

Powered by XiaoR GEEK X3.4

© 2014-2021 XiaoR GEEK

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