Точное видеонаблюдение: отслеживание объектов с Arduino и сервоприводами
Компоненты и материалы
| Arduino (обработка) | × | 1 |
| Arduino UNO | × | 1 |
| Камера (любая) | × | 1 |
| Сервоприводы (Tower Pro MG996R) | × | 1 |
Приложения и сервисы
| Arduino IDE |
О проекте
Отслеживание объектов — важная задача компьютерного зрения. Распространение мощных компьютеров, доступность качественных недорогих камер и растущая потребность в автоматизированном видеоанализе стимулировали интерес к алгоритмам трекинга. В видеоанализе три ключевых этапа: обнаружение движущихся объектов интереса, их слежение кадр за кадром и анализ траекторий для распознавания поведения. Применение трекинга актуально для:
- Распознавания по движению (идентификация людей по походке, автоматическое обнаружение объектов);
- Автоматизированного видеонаблюдения (мониторинг сцены для обнаружения подозрительной активности или необычных событий);
- Индексации видео (автоматическая аннотация и поиск видео в мультимедиа базах);
- Человеко-компьютерного взаимодействия (распознавание жестов, отслеживание взгляда для ввода данных);
- Мониторинга трафика (сбор статистики в реальном времени для управления потоком);
- Навигации транспортных средств (видео-ориентированное планирование пути и избегание препятствий).
В простейшей форме трекинг — это оценка траектории объекта в плоскости изображения по мере его перемещения по сцене. Трекер присваивает согласованные метки отслеживаемым объектам в разных кадрах видео. В зависимости от домена трекер может также предоставлять информацию об объекте: ориентацию, площадь, форму.
Этот проект реализует метод обнаружения и отслеживания объектов в реальном времени: CCTV-камера идентифицирует и отслеживает цель в поле зрения из комнаты наблюдения. Параллельно с программным трекингом система механически следит за объектом с помощью лазера на роботизированной руке. Ручка движется так, чтобы охватывать каждую координату видеокадра своими панорамированием и наклоном (pan-tilt).
CAD-файл: (ссылка отсутствует)
Программный код
mouse_drag_final_arduino_working_code.ino (Processing)
Этот код на Processing передает координаты мыши на Arduino и регулирует сервоприводы согласно позиции указателя.
///////////////////// 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();
}
facetracking_processing_final_code.pde (Processing)
Этот код отслеживает лицо человека в поле зрения.
///////////////////// 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();
}
mouse_drag_final_arduino_working_code.ino (Arduino)
Код Arduino для движения сервоприводов.
#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 для Processing
Необходима для работы кода: https://github.com/atduskgreg/opencv-processing
Печатные платы и корпуса
(Раздел пуст)
Производственный процесс
- Точный температурный профиль Raspberry Pi с Python, SQLite и LabVIEW
- Удалённый мониторинг погоды на Raspberry Pi 3 с PubNub
- Интеграция TI SensorTag с Blynk через Node‑RED на Raspberry Pi Zero
- Продвинутое отслеживание теннисного мяча на Raspberry Pi с OpenCV
- Управление светодиодом с PIR-датчиком движения на Raspberry Pi
- Автоматизированное визуальное отслеживание объектов на Raspberry Pi и OpenCV
- Создание умного робота с Bridge Shield — интеграция Raspberry Pi и Arduino
- Построение Wi-Fi-управляемого робота на Raspberry Pi с Python — пошаговое руководство
- Строки в C#: создание, свойства, методы и лучшие практики
- Измерение точности динамического трекинга объектов в системах моشن-капчера