• 上海合作组织青岛峰会举行 2019-04-20
  • 遭遇隐形歧视 就业权益谁来维护 2019-04-20
  • 杨立新解读2018年天津市《政府工作报告》--天津频道--人民网 2019-04-19
  • 【北京海之沃车型报价】北京海之沃4S店车型价格 2019-04-19
  • 让个体诚信有力推动社会诚信 2019-04-13
  • 习近平会见巴基斯坦总统侯赛因 2019-04-13
  • 罗亦农:“残躯何足惜,大敌正当前” 2019-03-21
  • 由进口至出口再至走向世界,这一路着实不易,其中少不了无数位科研人员的奉献与牺牲。 2019-03-21
  • 查看: 35178|回复: 41
    打印 上一主题 下一主题

    [进阶教程] Mathematica+Arduino 摄像头检测人脸并跟随

    [复制链接]
    本帖最后由 mmaer 于 2017-8-14 18:44 编辑

    通过USB摄像头获取图像,如果检测到人脸将计算出中心坐标,把坐标通过串口发送给Arduino,算出人脸坐标偏离画面中心点的距离,然后根据这个偏离值驱动舵机带动摄像头修正指向,从而可以跟随人脸移动。

    软件
    Mathematica 10/11
    Arduino IDE

    硬件
    Arduino开发板
    USB摄像头
    9g舵机
    舵机云台

    连接线若干

    连接
    把摄像头固定在舵机云台上,在Arduino开发板上插上IO传感器扩展板,舵机接在传感器扩展板的第9个数字引脚上。
    注意:
    如果选用的是大功率的云台和舵机,需要为舵机独立供电。
    本文使用的云台为一个自由度(水平移动),知道了原理后扩展为两个自由度也很简单(水平+垂直)。


    演示



    Mathematica 代码
    [AppleScript] 纯文本查看 复制代码
    $ImagingDevice = $ImagingDevices[[2]];
    
    dev = DeviceOpen["Serial", "COM3"]
    
    Dynamic[
     i = CurrentImage[];
     boxes = FindFaces[i];
     If[boxes =!= {},
      {X, Y} = Round[Mean @@ boxes];
      [email protected]
       {
        HighlightImage[i, Circle[{X, Y}, 50], ImageSize -> {320, 240}], 
        DeviceWrite[dev, ToString[X]]
        },
      i]
     ]


    Arduino 代码
    [C] 纯文本查看 复制代码
    #include <Servo.h>
    
    #define  servomaxx   180   // max degree servo horizontal (x) can turn
    #define  screenmaxx   320   // max screen horizontal (x)resolution
    #define  screenmaxy   240    // max screen vertical (y) resolution
    #define  servocenterx   90  // center po#define  of x servo
    #define  servopinx   9   // digital pin for servo x
    #define  baudrate 9600  // com port speed. Must match your setting
    #define distancex 2  // x servo rotation steps
    
    int valx = 0;       // store x data from serial port
    int posx = 0;
    int incx = 10;  // significant increments of horizontal (x) camera movement
    
    Servo servox;
    
    void setup() {
      Serial.begin(baudrate);        // connect to the serial port
      Serial.setTimeout(20);
      Serial.println("Starting Cam-servo Face tracker");
    
      pinMode(servopinx, OUTPUT);   // declare the LED's pin as output
    
      servox.attach(servopinx);
    
      // center servos
      servox.write(servocenterx);
      delay(200);
    }
    
    
    void loop () {
      while (Serial.available() <= 0); // wait for incoming serial data
      if (Serial.available() >= 1)  
      {
        // get X axis 2-byte integer from serial
        valx = Serial.parseInt();
    
        // read last servos positions
        posx = servox.read();
    
        //Find out if the X component of the face is to the left of the middle of the screen.
        if (valx < (screenmaxx / 2 - incx)) {
          if ( posx >= incx ) posx += distancex; //Update the pan position variable to move the servo to the left.
        }
        //Find out if the X component of the face is to the right of the middle of the screen.
        else if (valx > screenmaxx / 2 + incx) {
          if (posx <= servomaxx - incx) posx -= distancex; //Update the pan position variable to move the servo to the right.
        }
    
        // Servos will rotate accordingly
        servox.write(posx);
    
      }
    }



    沙发

    hnyzcj  超级版主

    发表于 2016-12-6 19:09:13

    这个有些牛逼
    板凳

    dsweiliang  版主

    发表于 2016-12-8 16:38:15

    学习学习
    地板

    飞猪的小号  中级技师

    发表于 2016-12-9 20:22:38

    看起来好酷啊,学习学习
    5#

    HMark  初级技师

    发表于 2016-12-11 08:26:13

    厉害厉害
    6#

    gray6666  高级技匠

    发表于 2016-12-11 14:21:26

    好东西,学习了
    7#

    iooops  版主

    发表于 2016-12-11 21:42:16

    为什么代码这么短。。
    8#

    Memorainer  见习技师

    发表于 2016-12-11 22:04:10

    我想知道,如果出现多张脸会发生什么
    9#

    mmaer  初级技师
     楼主|

    发表于 2016-12-12 10:52:23

    iooops 发表于 2016-12-11 21:42
    为什么代码这么短。。

    案例本来就简单,还有Mathematica库函数丰富 语法比较简洁
    10#

    mmaer  初级技师
     楼主|

    发表于 2016-12-12 10:53:19

    Memorainer 发表于 2016-12-11 22:04
    我想知道,如果出现多张脸会发生什么

    这种情况还没有考虑,现在只检测一张脸
    11#

    吹口琴的钢铁侠  版主

    发表于 2016-12-13 10:19:58

    是在pc上跑mathematic?Arduino只是控制舵机?
    什么型号的Arduino能跑起人脸识别呢
    12#

    mmaer  初级技师
     楼主|

    发表于 2016-12-13 12:03:35

    吹口琴的钢铁侠 发表于 2016-12-13 10:19
    是在pc上跑mathematic?Arduino只是控制舵机?
    什么型号的Arduino能跑起人脸识别呢 ...

    是在PC上跑的,LattePanda上也可以跑的,树莓派上自带的有Mathematica但功能不完整。
    pcDuino上可以跑人脸检测的
    13#

    John管宁川  

    发表于 2016-12-20 15:09:24

    提示: 作者被禁止或删除 内容自动屏蔽
    14#

    DFrobothty  中级技师

    发表于 2016-12-29 09:07:05

    厉害了world哥
    15#

    Xpimach  见习技师

    发表于 2017-1-5 14:28:30

    很不错欸
    16#

    Xpimach  见习技师

    发表于 2017-1-5 14:28:39

    大神

    点评

    过奖了  发表于 2017-1-5 16:42
    17#

    Xpimach  见习技师

    发表于 2017-1-5 14:28:50

    顶一个。
    18#

    砖头墙  初级技师

    发表于 2017-1-6 21:17:57

    叼                       牛                       膜拜大神
    19#

    vvvvv  学徒

    发表于 2017-1-20 18:10:57

    收藏 学习了
    20#

    hnyzcj  超级版主

    发表于 2017-1-21 09:04:04

    楼主用你的真脸试试看看行不行呀
    21#

    lauren  高级技师

    发表于 2017-1-25 18:39:02

    哟不错,简单好玩!有没有耍过Wolfram的Systemmodeler!?

    点评

    没玩过这个呢,以后有机会试试  发表于 2017-2-6 11:55
    12下一页
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    为本项目制作心愿单
    购买心愿单
    心愿单 编辑
    wifi气象站

    硬件清单

    btnicon
    我也要做!
    点击进入购买页面
    关于楼主
    上海智位机器人股份有限公司 沪ICP备09038501号-4

    © 2013-2019 Comsenz Inc. Powered by Discuz! X3.4 Licensed

    浙江6加1开奖结果
  • 上海合作组织青岛峰会举行 2019-04-20
  • 遭遇隐形歧视 就业权益谁来维护 2019-04-20
  • 杨立新解读2018年天津市《政府工作报告》--天津频道--人民网 2019-04-19
  • 【北京海之沃车型报价】北京海之沃4S店车型价格 2019-04-19
  • 让个体诚信有力推动社会诚信 2019-04-13
  • 习近平会见巴基斯坦总统侯赛因 2019-04-13
  • 罗亦农:“残躯何足惜,大敌正当前” 2019-03-21
  • 由进口至出口再至走向世界,这一路着实不易,其中少不了无数位科研人员的奉献与牺牲。 2019-03-21