Header Ads

顔認識して顔をおいかけるWebカメラ

Arduino, Processingを使ってカメラ画像から顔認識し、サーボを使って見つけた顔を追いかけるカメラを作りました。


Arduino側
コードは次の通り。サーボは3番ピン。サーボにWebカメラを取り付ける。

#include <Servo.h>
Servo myservo;
int a = 90;
char val;
void setup() {
Serial.begin(9600); // Start serial communication at 9600 bps
myservo.attach(3);
myservo.write(a);
}
void loop() {
while (Serial.available()) { // If data is available to read,
val = Serial.read(); // read it and store it in val
}
if (val == 'H') {
a = a - 1;
if(a < 0 )a=0;
myservo.write(a);
} if(val == 'L'){
a = a + 1;
if(a > 180)a = 180;
myservo.write(a);
}
delay(100);
}

Processing側
コードは次の通り。カメラがCapture.listの配列の何番目にあるか分からない場合、Capture.listを表示して確認の上、設定。
import gab.opencv.*;
import processing.video.*;
import java.awt.*;
Capture video;
OpenCV opencv;
import processing.serial.*;
Serial myPort; // Create object from Serial class
int val; // Data received from the serial port
void setup() {
size(960, 720);
println(Capture.list());
video = new Capture(this,width/3,height/3,Capture.list()[20]);
opencv = new OpenCV(this, width/3, height/3);
opencv.loadCascade(OpenCV.CASCADE_FRONTALFACE);
video.start();
String portName = Serial.list()[0];
println(portName);
myPort = new Serial(this, portName, 9600);
}
void draw() {
scale(3);
opencv.loadImage(video);
image(video, 0, 0 );
noFill();
stroke(0, 255, 0);
strokeWeight(1);
Rectangle[] faces = opencv.detect();
//println(faces.length);
int[] x = new int[20];
int[] y = new int[20];
boolean exist = false;
for (int i = 0; i < faces.length; i++) {
x[i] = faces[i].x + faces[i].width/2;
y[i] = faces[i].y + faces[i].height/2;
println(i,x[i] , y[i]);
exist = true;
rect(faces[i].x, faces[i].y, faces[i].width, faces[i].height);
}
if(exist == true){
if( x[0] > 170){
myPort.write('H');
println('H');
}else if(x[0] < 130){
myPort.write('L');
println('L');
} else{
myPort.write('C');
println('C');
}
} else {
myPort.write('N');
println('N');
}
}
void captureEvent(Capture c) {
c.read();
}
void sendCommand(){
}

Powered by Blogger.