아두이노와 서보로 구현하는 정밀 객체 추적 감시 시스템
프로젝트 개요
컴퓨터 비전 분야에서 객체 추적은 움직이는 관심 객체를 감지하고, 프레임 간 궤적을 추적하며, 행동 패턴을 분석하는 3단계로 구성됩니다. 본 프로젝트는 CCTV 카메라 영상에서 얼굴/객체를 실시간 검출하고, 팬-틸트 서보 구동 로봇 팔(레이저 마운트)로 대상을 물리적으로 추적하는 감시 시스템을 구현합니다. 처리(Processing) 환경에서 OpenCV 라이브러리를 활용해 얼굴 검출(하르 캐스케이드) 및 마우스 드래그 수동 제어 두 가지 모드를 제공합니다.
활용 분야
- 자동 감시: 의심스러운 활동/이상 이벤트 실시간 모니터링
- 모션 기반 인식: 보행 패턴 기반 인물 식별, 자동 객체 검출
- 비디오 인덱싱: 멀티미디어 DB 자동 주석 및 검색
- 인간-컴퓨터 상호작용: 제스처 인식, 시선 추적 입력
- 교통 모니터링: 실시간 교통 통계 수집 및 흐름 제어
- 차량 내비게이션: 비디오 기반 경로 계획 및 장애물 회피
하드웨어 구성
| 부품 | 수량 | 비고 |
| 아두이노 우노 (또는 호환 보드) | 1 | 서보 제어용 |
| 서보 모터 (Tower Pro MG996R) | 2 | 팬(좌우), 틸트(상하) 축 구동 |
| 카메라 (일반 웹캠/CCTV) | 1 | PC 연결, Processing에서 비디오 캡처 |
| 레이저 모듈 (옵션) | 1 | 서보 암에 장착하여 추적 지점 표시 |
소프트웨어 아키텍처
PC (Processing + OpenCV) → 시리얼(9600 bps) → 아두이노 → 서보 PWM 제어
- Processing 스케치: 비디오 캡처, OpenCV 얼굴 검출, 마우스 좌표 읽기, 팬/틸트 각도 계산(0~180°), 시리얼 전송 프로토콜(팬, 틸트, 255 종료 바이트)
- 아두이노 스케치: 시리얼 수신 파싱, 서보 라이브러리로 각도 적용
소스 코드
1. 마우스 드래그 수동 제어 모드 (Processing)
// mouse_drag_final_arduino_working_code.pde
import processing.serial.*;
import processing.video.*;
import java.awt.*;
import gab.opencv.*;
Capture video;
OpenCV opencv;
Serial Com7;
int pan, tilt;
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, 320, 240);
opencv = new OpenCV(this, 320, 240);
opencv.loadCascade(OpenCV.CASCADE_FRONTALFACE);
video.start();
background(0); ellipse(width/2, height/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();
for (int i=0; i
2. 자동 얼굴 추적 모드 (Processing)
// facetracking_processing_final_code.pde
// ... setup 동일 ...
void draw() {
scale(2);
opencv.loadImage(video);
image(video, 0, 0);
Rectangle[] faces = opencv.detect();
for (int i=0; i
3. 아두이노 서보 제어 코드
// mouse_drag_final_arduino_working_code.ino
#include
byte inBytes[3];
Servo panservo, tiltservo;
int panangle = 90, 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);
}
}
}
필수 라이브러리 설치
회로도 및 기계부
CAD 파일 링크는 원문 참조. 팬-틸트 브래킷에 서보 2개 직교 장착, 카메라 또는 레이저 모듈 탑재.
구현 시 주의사항
- Processing의
Serial.list()[0] 인덱스는 환경에 따라 달라질 수 있음. 실제 포트 이름으로 변경 권장
- 카메라 해상도(320x240)와 Processing 창 크기(500x500) 비율에 맞춰 좌표 매핑 공식 조정 필요
- 서보 동작 범위(0~180°)와 기계적 간섭 범위 확인 후
constrain 값 조정
- OpenCV 하르 캐스케이드 파일 경로 확인(
OpenCV.CASCADE_FRONTALFACE 내장 사용)
- 실외/조도 변화 환경에서는 배경 차분(Background Subtraction) 또는 딥러닝 기반 검출기(Yolo, SSD 등)로 업그레이드 고려
확장 아이디어
- 다중 객체 추적: 검출된 여러 얼굴 중 가장 큰 것/가까운 것 선택 로직 추가
- PTZ 카메라 직접 제어: 서보 대신 ONVIF/RS-485 프로토콜로 카메라 팬/틸트/줌 제어
- 알림 연동: 특정 구역 진입 시 MQTT/이메일/푸시 알림 발송
- 녹화 연동: 추적 이벤트 발생 시 비디오 클립 자동 저장