움직임 감지는 보안, 스마트 홈, 사람 추적, 교통 분석 등에서 널리 쓰이는 핵심 기능 중 하나예요.
영상 내에서 배경과 다른 움직이는 객체를 감지하려면
프레임 간 차이, 배경 제거, 이진화 및 윤곽선 추출과 같은 기법을 프레임 단위로 적용해야 합니다.
움직임 감지의 기본 개념
움직임 감지는 영상에서 정적인 배경과 달리 변화가 생기는 부분을 감지하는 방식이에요.
보통은 연속된 두 프레임 간의 차이를 계산하거나,
배경 모델링(Background Subtraction) 기법을 활용해서 움직이는 객체만 추출하죠.
이 차이를 시각화하면 움직이는 영역만 하얗게 보이고, 정적인 배경은 어둡게 유지돼요.
이를 바탕으로 특정 영역에 누가 들어왔는지, 얼마나 움직였는지를 분석할 수 있어요.
OpenCV는 이런 작업을 위한 다양한 함수와 알고리즘을 제공해요.
프레임 간 차이(diff) 기반 감지 예제
cv::Mat prev, frame, gray, diff, thresh; cv::VideoCapture cap(0); cap >> prev; cv::cvtColor(prev, prev, cv::COLOR_BGR2GRAY); while (true) { cap >> frame; if (frame.empty()) break; cv::cvtColor(frame, gray, cv::COLOR_BGR2GRAY); cv::absdiff(prev, gray, diff); cv::threshold(diff, thresh, 25, 255, cv::THRESH_BINARY); cv::imshow("Motion", thresh); prev = gray.clone(); if (cv::waitKey(1) == 27) break; } |
이 코드는 직전 프레임과 현재 프레임의 차이를 계산하여 움직임이 있는 부분을 흰색으로 표현해요.
배경 제거를 이용한 움직임 감지
OpenCV는 createBackgroundSubtractorMOG2() 같은 고급 배경 제거 함수를 제공해요.
이 방식은 움직이지 않는 부분을 자동으로 배경으로 모델링하고,
새롭게 등장하거나 움직이는 객체만 분리해 줘요.
위 프레임 간 차이보다 더 안정적이며, 장시간 모니터링에 유리해요.
특히 그림자 제거 기능도 포함되어 있어 정확도가 높아요.
auto backSub = cv::createBackgroundSubtractorMOG2(); cv::Mat fgMask; while (true) { cap >> frame; if (frame.empty()) break; backSub->apply(frame, fgMask); cv::imshow("Foreground Mask", fgMask); if (cv::waitKey(1) == 27) break; } |
이 방식은 사람이 들어오거나 물체가 움직일 때마다 그 부분만 흰색으로 분리돼요.
움직임의 윤곽선 그리기 및 객체 강조
움직임이 있는 부분을 단순히 검출하는 것에서 더 나아가,
그 윤곽을 그려서 시각적으로 표현할 수 있어요.
윤곽선을 검출한 후, 해당 영역에 사각형을 그리거나 라벨링 하면
어디서 움직임이 발생했는지 직관적으로 알 수 있어요.
또, 움직임의 크기를 측정해 알림 조건을 만들 수도 있어요.
std::vector<std::vector<cv::Point>> contours; cv::findContours(thresh, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE); for (const auto& c : contours) { if (cv::contourArea(c) < 500) continue; cv::Rect rect = cv::boundingRect(c); cv::rectangle(frame, rect, cv::Scalar(0, 0, 255), 2); } cv::imshow("Motion with Boxes", frame); |
작은 노이즈는 제외하고, 일정 크기 이상의 움직임만 강조할 수 있어요.
실전 활용 팁과 고려 사항
움직임 감지를 실전에서 사용할 땐
조명 변화, 카메라 떨림, 그림자 등 노이즈 요인들을 고려해야 해요.
고정 카메라에서만 안정적으로 작동하며,
실외 환경에선 햇빛이나 나뭇잎의 흔들림도 움직임으로 인식될 수 있어요.
이를 보완하기 위해 모폴로지 연산(morphology), 윤곽 크기 필터링, 시간 누적 필터 등을 병행해야 해요.
또한, 움직임이 발생한 시간이나 좌표를 기록해서 이벤트 로그를 만드는 것도 좋은 전략이에요.
이 블로그의 내용을 대화 형식인 음성으로 들으면서 정리하면, 보다 쉽게 이해할 수 있을 거예요.
다운로드하여 들어보세요~
'IT' 카테고리의 다른 글
OpenCV와 Python의 차이점 및 장단점 비교 (0) | 2025.07.06 |
---|---|
OpenCV 디버깅 방법과 흔한 오류 해결법 (0) | 2025.07.05 |
OpenCV 환경설정 팁 - 다양한 IDE 환경에서 (0) | 2025.07.04 |
OpenCV로 이미지 분류 모델의 결과를 시각화하는 방법 (0) | 2025.07.03 |
OpenCV + TensorFlow 모델 연동 튜토리얼 (0) | 2025.07.02 |