Precisie Surveillance: Object Tracking met Arduino en Servo's
Onderdelen en benodigdheden
| Onderdeel | Aantal |
|---|---|
| Arduino verwerking (Processing) | 1 |
| Arduino UNO | 1 |
| Camera (generiek) | 1 |
| Servo's (Tower Pro MG996R) | 1 |
Apps en online diensten
- Arduino IDE
Over dit project
Object tracking is een cruciale taak binnen computer vision. De beschikbaarheid van krachtige computers, goedkope high-quality camera's en de groeiende behoefte aan geautomatiseerde videoanalyse heeft veel belangstelling gewekt voor object tracking algoritmes. Er zijn drie sleutelstappen in videoanalyse: detectie van interessante bewegende objecten, tracking van deze objecten van frame naar frame, en analyse van objectsporen om gedrag te herkennen. Object tracking is relevant voor:
- Bewegingsgebaseerde herkenning: mensidentificatie op basis van looppatroon, automatische objectdetectie
- Geautomatiseerde surveillance: een scène monitoren om verdachte activiteiten of onwaarschijnlijke gebeurtenissen te detecteren
- Video-indexering: automatische annotatie en ophalen van video's in multimediadatabases
- Mens-computer interactie: gebarenerkenning, oogbewegingstracking voor data-invoer
- Verkeersmonitoring: realtime verzamelen van verkeersstatistieken om verkeersstroom te sturen
- Voertuignavigatie: videobaseerde routeplanning en obstakelvermijding
In de simpelste vorm is tracking het probleem van het schatten van de traject van een object in het beeldvlak terwijl het zich door een scène beweegt. Een tracker wijst consistente labels toe aan getrackte objecten in verschillende frames van een video. Afhankelijk van het domein kan een tracker ook object-gerichte informatie leveren zoals oriëntatie, oppervlakte of vorm.
Dit project behandelt realtime objectdetectie en tracking waarbij we een CCTV-camera gebruiken om een doelwit in het zichtbereik te identificeren en te tracken vanuit de surveillance-ruimte. Naast software-tracking volgt het systeem het object ook fysiek met een laser-gemonteerde robotarm. De robotarm bedekt elke coördinaat in het videoframe door pan-tilt beweging.
Code
Muis-besturing Arduino code (Processing)
Deze Processing-code stuurt muiscoördinaten naar de Arduino en past de servo's aan op basis van de muispositie.
///////////////////// Processing Code /////////////////////////////////
import processing.serial.*;
import processing.video.*;
import java.awt.*;
import gab.opencv.*;
Capture video;
OpenCV opencv;
Serial Com7;
float fpan,ftilt;
int pan, tilt, x, y;
int[] inBytes = new int[3];
void setup(){
size(500,500);
String portName = Serial.list()[0];
Com7 = new Serial(this, portName, 9600);
video = new Capture(this, 640/2, 480/2);
opencv = new OpenCV(this, 640/2, 480/2);
opencv.loadCascade(OpenCV.CASCADE_FRONTALFACE);
video.start();
background(0,0,0);
ellipse(width/2,width/2,10,10);
}
void draw() {
scale(2);
opencv.loadImage(video);
noFill();
stroke(0, 255, 0);
strokeWeight(3);
image(video, 0, 0 );
Rectangle[] faces = opencv.detect();
println(faces.length);
for (int i = 0; i < faces.length; i++) {
println(faces[i].x + "," + faces[i].y);
rect(faces[i].x, faces[i].y, faces[i].width, faces[i].height);
}
pan = int(mouseX*180/width);
tilt = int(mouseY*180/height);
pan = constrain(180 - pan,0,180);
tilt = constrain(tilt,0,180);
Com7.write(pan);
Com7.write(tilt);
Com7.write(255);
while (Com7.available()>0) {
inBytes[0] = inBytes[1];
inBytes[1] = inBytes[2];
inBytes[2] = Com7.read();
if(inBytes[2] == 255) {
println(inBytes[0] +" , " + inBytes[1]);
}
}
}
void captureEvent(Capture c) {
c.read();
}
Gezichtstracking Processing code
Deze code trackt een gezicht in het zichtbereik.
///////////////////// Processing Code /////////////////////////////////
import processing.serial.*;
import processing.video.*;
import java.awt.*;
import gab.opencv.*;
Capture video;
OpenCV opencv;
Serial Com7;
float fpan,ftilt;
int pan, tilt, x, y;
int[] inBytes = new int[3];
void setup(){
size(500,500);
String portName = Serial.list()[0];
Com7 = new Serial(this, portName, 9600);
video = new Capture(this, 640/2, 480/2);
opencv = new OpenCV(this, 640/2, 480/2);
opencv.loadCascade(OpenCV.CASCADE_FRONTALFACE);
video.start();
background(0,0,0);
ellipse(width/2,width/2,10,10);
}
void draw() {
scale(2);
opencv.loadImage(video);
noFill();
stroke(0, 255, 0);
strokeWeight(3);
image(video, 0, 0 );
Rectangle[] faces = opencv.detect();
println(faces.length);
for (int i = 0; i < faces.length; i++) {
println(faces[i].x + "," + faces[i].y);
rect(faces[i].x, faces[i].y, faces[i].width, faces[i].height);
pan = int(faces[i].x*180/width);
tilt = int(faces[i].y*180/height);
}
pan = constrain(180 - pan,0,180);
tilt = constrain(tilt,0,180);
Com7.write(pan);
Com7.write(tilt);
Com7.write(255);
while (Com7.available()>0) {
inBytes[0] = inBytes[1];
inBytes[1] = inBytes[2];
inBytes[2] = Com7.read();
if(inBytes[2] == 255) {
println(inBytes[0] +" , " + inBytes[1]);
}
}
}
void captureEvent(Capture c) {
c.read();
}
Arduino code voor servobeweging
#include <Servo.h>
byte inBytes[3];
Servo panservo;
Servo tiltservo;
int panangle = 90;
int tiltangle = 90;
void setup(){
Serial.begin(9600);
panservo.attach(9);
tiltservo.attach(11);
}
void loop() {
if(Serial.available()> 0){
inBytes[0] = inBytes[1];
inBytes[1] = inBytes[2];
inBytes[2] = Serial.read();
if(inBytes[2] == 255) {
Serial.write(inBytes,3);
panangle = inBytes[0];
tiltangle = inBytes[1];
panservo.write(panangle);
tiltservo.write(tiltangle);
}
}
}
OpenCV bibliotheek voor Processing
Installeer deze bibliotheek voor de code: https://github.com/atduskgreg/opencv-processing
Aangepaste onderdelen en behuizingen
CAD-bestand: Link niet beschikbaar
Productieproces
- Nauwkeurige Raspberry Pi Temperatuurprofielering Met Python, SQLite En LabVIEW
- Externe weerbewaking met Raspberry Pi 3 en PubNub
- TI SensorTag integreren met Blynk via Node-RED op Raspberry Pi Zero
- Geavanceerde Tafeltennisbal Tracking met OpenCV op Raspberry Pi
- Een LED Besturen met een PIR-bewegingssensor op Raspberry Pi
- Geautomatiseerde Visuele Object-tracking met Raspberry Pi en OpenCV
- Bouw een Slimme Robot met de Bridge Shield – Raspberry Pi & Arduino Integratie
- Bouw een Wi-Fi-gecontroleerde Raspberry Pi Robot met Python – Stap-voor-stap Gids
- Nauwkeurigheid Meten van Dynamisch Object Tracking in Motion Capture Systemen
- C# using-statements: imports, aliasen en static directives
- Strings in C# Beheersen: Best Practices & Tips