Python / / 2022. 1. 28. 21:17

예제] openCV Motion Analysis - 객체 추적

728x90
반응형

실행 화면

import cv2
from cv2 import threshold

cap = cv2.VideoCapture("car_way.mp4")

# 백그라운드와 객체와 분리 
object_detector = cv2.createBackgroundSubtractorMOG2(history=200, varThreshold=80)

#백그라운드와 분리가 잘 안됨. 정확한 옵션을 알아야 할듯.
#od_knn = cv2.createBackgroundSubtractorKNN(dist2Threshold=100)

while True:
    # 프레임 별 읽기
    ret, frame = cap.read()
    h, w, _ = frame.shape
    # extract region of interest
    #frame[x: x1, y: y1] x좌표에서 x1좌표까지, y좌표에서 y1좌표까지 roi 설정
    roi = frame[300: 600, 400: 1200]
    
    # 프레임별 오브젝트 디텍팅
    mask = object_detector.apply(roi)
    _, mask = cv2.threshold(mask, 254, 255, cv2.THRESH_BINARY)
    contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    #maskknn = od_knn.apply(frame)
    #cv2. imshow('knn', maskknn)
    
    
    for cnt in contours:
        #area = cv2.contourArea(cnt)
        #if area > 100:
        #    cv2.drawContours(roi, [cnt], -1, (0, 255, 0), 2)
            
        x, y, w, h = cv2.boundingRect(cnt)
        cv2.rectangle(roi, (x,y), (x+w, y+h), (0, 255, 0,), 3)
        
    cv2.imshow('cap', frame)
    cv2.imshow('mask', mask)
    
    
    key = cv2.waitKey(30)
    if key == 27:
        break
    
cap.release()
cv2.destroyAllWindows()

여기에서 중요한 것은 다음 class 일것이다.

createBackgroundSubtractorMOG2
 

백그라운드와 오브젝트와 분리를 해주는 class 이다. 

백그라운드를 잘 인식하게 하기 위해서 물체가 없는 상태에서 인식을 시작한다면 좀더 잘 잡을 수 있을것이다.

영상에서 보면 인식하려는 물체가 화면에서 차지하는 크기가 작다. 

varThreshold 값을 적당히 조절하면 쉽게 찾을 수 있을거라 생각된다.
 
건물이나 특정지역에서 움직임을 감지하고 싶다면 이 함수를 이용하여 쉽게 구현이 가능할거라 생각된다.

 

동영상 출처: https://pixabay.com/ko/videos/search/%EA%B3%A0%EC%86%8D%EB%8F%84%EB%A1%9C/

참고] https://www.youtube.com/watch?v=O3b8lVF93jU&t=596s 

함수 설명 : https://docs.opencv.org/4.x/de/de1/group__video__motion.html

728x90
반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유