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
반응형
'Python' 카테고리의 다른 글
예제] mediapipe 를 이용하여 손 인식 하기 (0) | 2022.01.30 |
---|---|
예제] openCV 실시간 영상 배경 교체 - cvzone (0) | 2022.01.29 |
자료형 리스트, 튜플, 딕셔너리, 셋 (0) | 2022.01.27 |
예제] CV 이용하여 mp4 캡쳐하기 (0) | 2022.01.26 |
로그]로또 예측 - 번호 만들기 (0) | 2022.01.21 |