设为首页收藏本站

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

mmaer 发表于 2016-12-6 15:14:41 | 显示全部楼层 [复制链接]
31 9435
本帖最后由 mmaer 于 2017-8-14 18:44 编辑

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

软件
Mathematica 10/11
Arduino IDE

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

连接线若干

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

演示

摄像头追踪人脸.gif

Mathematica 代码
[AppleScript] 纯文本查看 复制代码
$ImagingDevice = $ImagingDevices[[2]];

dev = DeviceOpen["Serial", "COM3"]

Dynamic[
 i = CurrentImage[];
 boxes = FindFaces[i];
 If[boxes =!= {},
  {X, Y} = Round[Mean @@ boxes];
  Column@
   {
    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);

  }
}



发表于 2016-12-6 19:09:13 | 显示全部楼层
这个有些牛逼
回复 支持 反对

使用道具 举报

发表于 2016-12-8 16:38:15 | 显示全部楼层
学习学习
回复 支持 反对

使用道具 举报

发表于 2016-12-9 20:22:38 | 显示全部楼层
看起来好酷啊,学习学习
回复 支持 反对

使用道具 举报

发表于 2016-12-11 08:26:13 | 显示全部楼层
厉害厉害
回复 支持 反对

使用道具 举报

发表于 2016-12-11 14:21:26 | 显示全部楼层
好东西,学习了
回复 支持 反对

使用道具 举报

发表于 2016-12-11 21:42:16 | 显示全部楼层
为什么代码这么短。。
回复 支持 反对

使用道具 举报

发表于 2016-12-11 22:04:10 | 显示全部楼层
我想知道,如果出现多张脸会发生什么
回复 支持 反对

使用道具 举报

发表于 2016-12-12 10:52:23 | 显示全部楼层
iooops 发表于 2016-12-11 21:42
为什么代码这么短。。

案例本来就简单,还有Mathematica库函数丰富 语法比较简洁
回复 支持 反对

使用道具 举报

发表于 2016-12-12 10:53:19 | 显示全部楼层
Memorainer 发表于 2016-12-11 22:04
我想知道,如果出现多张脸会发生什么

这种情况还没有考虑,现在只检测一张脸
回复 支持 反对

使用道具 举报

发表于 2016-12-13 10:19:58 | 显示全部楼层
是在pc上跑mathematic?Arduino只是控制舵机?
什么型号的Arduino能跑起人脸识别呢
回复 支持 反对

使用道具 举报

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

是在PC上跑的,LattePanda上也可以跑的,树莓派上自带的有Mathematica但功能不完整。
pcDuino上可以跑人脸检测的
回复 支持 反对

使用道具 举报

发表于 2016-12-20 15:09:24 | 显示全部楼层
本帖最后由 John管宁川 于 2016-12-20 15:10 编辑

厉害了word艹
回复 支持 反对

使用道具 举报

发表于 2016-12-29 09:07:05 | 显示全部楼层
厉害了world哥
回复 支持 反对

使用道具 举报

发表于 2017-1-5 14:28:30 | 显示全部楼层
很不错欸
回复 支持 反对

使用道具 举报

发表于 2017-1-5 14:28:39 | 显示全部楼层
大神

点评

过奖了  发表于 2017-1-5 16:42
回复 支持 反对

使用道具 举报

发表于 2017-1-5 14:28:50 | 显示全部楼层
顶一个。
回复 支持 反对

使用道具 举报

发表于 2017-1-6 21:17:57 | 显示全部楼层
叼                       牛                       膜拜大神
回复 支持 反对

使用道具 举报

发表于 2017-1-20 18:10:57 | 显示全部楼层
收藏 学习了
回复 支持 反对

使用道具 举报

发表于 2017-1-21 09:04:04 | 显示全部楼层
楼主用你的真脸试试看看行不行呀
回复 支持 反对

使用道具 举报

发表于 2017-1-25 18:39:02 | 显示全部楼层
哟不错,简单好玩!有没有耍过Wolfram的Systemmodeler!?

点评

没玩过这个呢,以后有机会试试  发表于 2017-2-6 11:55
回复 支持 反对

使用道具 举报

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

本版积分规则 允许回帖同步到新浪微博  

  • 初级技师
  • 278
  • 4

推荐阅读

精华导读




公司简介| 联系我们| 小黑屋| 加入我们| 微博| 优酷| 英文网站| DF创客社区 ( 沪ICP备09038501号-4  
友情链接| 硬创邦| 花生壳社区| 模友之吧| 电子发烧友社区| 创客星球| 云汉电子社区| 电子工程网| 与非网| Arduino中文社区| 南极熊3D打印网| OneNET|

上海智位机器人有限公司  沪ICP备09038501号-4   

Powered by Discuz! X3.1

Licensed Comsenz Inc.

返回顶部 返回列表