728x90
728x90
정적 배경 모델 사용 시 문제점
* 미리 등록된 기준 영상이 실제 배경과 크게 달라질 경우 오동작
- 도로에 차는 잠깐 있다가 없어짐
==> 평균을 구한 영상과 현재 Frame의 차영상을 계산하면 현재 Frame에 있는
새로운 차들만 검출가능
== 이런 수백장의 영상을 저장한다는게 시스템쪽으로 무리가 생김(= 대용량 메모리가 필요)
So, 이동평균 사용
이동 평균(Moving Average)
= WeightSum
- 수백 장의 영상을 저장하는 대신 매 프레임이 들어올 때마다 평균 영상을 갱신
- 갱신된 배경영상 = int가 아니라 미세하게 업데이트 되야하기 때문에 float
가중치
∝ = 0 -> 현재프레임=0, 이전 배경영상을 계속 쓰니 의미가 없다(업데이트가 안됨)
∝ = 1 -> 현재프레임을 계속 쓰겠다 이 또한 의미가 없다.
cap = cv2.VideoCapture('ch10\\videos\\PETS2000.avi')
if not cap.isOpened():
print('Video load failed')
sys.exit()
# 배경 영상 등록(정적(static) 배경)
ret, back = cap.read()
if not ret:
print('Background image registration failed!')
sys.exit()
back = cv2.cvtColor(back, cv2.COLOR_BGR2GRAY)
back = cv2.GaussianBlur(back, (0,0), 1.)
# *cv2.accumulateWeighted(gray, fback, 0.01) 연산을 위함*
fback = back.astype(np.float32)
'''
cv2.accumulateWeighted(src, dst, alpha, mask=None) -> dst
dst: 축적영상, 입력 영상과 동일 채널개수
32bit or 64bit float
alpha: (입력 영상에 대한)가중치
'''
while True:
ret, frame = cap.read()
if not ret:
brake
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (0,0), 1.)
# fback: float32, back: uint8 정적배경
cv2.accumulateWeighted(gray, fback, 0.01)
# *absdiff 연산을 위한 변환*
back = fback.astype(np.uint8)
diff = cv2.absdiff(gray, back)
_, diff = cv2.threshold(diff, 30, 255, cv2.THRESH_BINARY)
cnt, _, stats, _ = cv2.connectedComponentsWithStats(diff)
for i in range(1, cnt):
x, y, w, h, area = stats[i]
if area < 100:
continue
cv2.rectangle(frame, (x, y, w, h), (0,0,255), 2, cv2.LINE_AA)
cv2.imshow('diff', diff)
cv2.imshow('frame', frame)
cv2.imshow('back', back)
if cv2.waitKey(10) == ord('q'):
break
cap.release()
728x90
'OpenCV > OpenCV-Chapter' 카테고리의 다른 글
CH10 OpenCV-Python 추적(Mean Shift, Cam Shift) (0) | 2021.12.25 |
---|---|
CH10 OpenCV-Python 배경차분(MOG) (1) | 2021.12.25 |
CH10 OpenCV-Python 객체 추적(배경차분) (2) | 2021.12.25 |
CH09 OpenCV-Python 스티칭 Stitching(PANORAMA) (0) | 2021.12.25 |
CH09 OpenCV-Python 호모그래피와 영상 매칭 (0) | 2021.12.25 |
댓글