반응형
제 블로그의 인기 포스트 OpenCV를 이용해서 두개의 이미지 비교하기 의 심화편 입니다.
예를 들어, 다음과 같은 영상 이 있을 때, 비디오의 ssim을 비디오로 계속 보고 싶다고 생각하면,
처음 이미지를 기준으로 잡고, 그 이미지를 바탕으로 계속 그 차이를 표시할 수 있습니다.
import cv2
from skimage.metrics import structural_similarity as ssim
import numpy as np
cap = cv2.VideoCapture('thisvideo.mp4')
w, h = round(cap.get(3)), round(cap.get(4))
orig_img, grayA = None, None
fps = 0
# 코덱값
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
# 파일이름, 코덱, fps, width, height, isColor 값을 parameter로 받습니다.
out = cv2.VideoWriter_fourcc('diff.avi', fourcc, 30, (w, h), False)
while cap.isOpened():
ret, img = cap.read()
# 처음 이미지 저장
if orig_img is None:
orig_img = img
grayA = cv2.cvtColor(orig_img, cv2.COLOR_BGR2GRAY)
# fps 계산
fps += 1
if ret:
grayB = cv2.cvtColor(img, cv2.COLOR2GRAY)
(score, diff) = ssim(grayA, grayB, full=True) # full 이 있어야 diff 값이 나옴
# print(score)
# 이미지 보여주기
cv2.imshow('Video feed', img)
cv2.imshow('diff', diff)
## 포맷에 맞춰서 normalize 하기
new_img = diff * 255
new_img = np.uint8(new_img)
out.write(new_img) # diff write to video
if cv2.waitKey(1) == 13: # enter key pressed
break
else:
break
# 뒷처리
cap.release()
out.release()
cv2.destroyAllWindows()
계속 저장이 되지 않아서 디버깅을 계속 했었는데,
VideoWriter에 integer값이 들어가야 되어서, 여러가지 방법을 모색하다가,
위와 같은 방법을 사용하게 되었습니다.
cv2.noramalize()도 사용해 보았지만, 미묘하게 다르게 되더군요.
정확하게 어떻게 달라지는지는 아직 모르겠습니다. ㅎㅎ
반응형
'Image Processing > Cv2' 카테고리의 다른 글
python opencv 를 이용해서 동영상에서 이미지 추출 (이미지에서 동영상) (0) | 2021.12.13 |
---|---|
opencv waitkey 설명 (0) | 2021.07.16 |
opencv 를 이용해서 rtsp 동영상 받기(ft. multithreading) (0) | 2021.06.18 |
(opencv) 두 이미지의 차이를 박스로 나타내기 (0) | 2021.03.10 |
OpenCV를 이용해서 두 개의 이미지 비교하기 (SSIM) (0) | 2021.03.10 |