본문 바로가기

IT

OpenCV로 영상 내 움직임 감지하기

움직임 감지는 보안, 스마트 홈, 사람 추적, 교통 분석 등에서 널리 쓰이는 핵심 기능 중 하나예요.

 

OpenCV로 영상 내 움직임 감지하기


영상 내에서 배경과 다른 움직이는 객체를 감지하려면 
프레임 간 차이, 배경 제거, 이진화 및 윤곽선 추출과 같은 기법을 프레임 단위로 적용해야 합니다.

움직임 감지의 기본 개념

움직임 감지는 영상에서 정적인 배경과 달리 변화가 생기는 부분을 감지하는 방식이에요.

보통은 연속된 두 프레임 간의 차이를 계산하거나,

배경 모델링(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), 윤곽 크기 필터링, 시간 누적 필터 등을 병행해야 해요.

또한, 움직임이 발생한 시간이나 좌표를 기록해서 이벤트 로그를 만드는 것도 좋은 전략이에요.

 

이 블로그의 내용을 대화 형식인 음성으로 들으면서 정리하면, 보다 쉽게 이해할 수 있을 거예요.
다운로드하여 들어보세요~

OpenCV로 영상 내 움직임 감지하기.mp3
3.73MB