Image Processing/Cv2

SSIM 흑백 이미지 동영상 저장하기

jinmc 2022. 10. 24. 17:16
반응형

제 블로그의 인기 포스트 OpenCV를 이용해서 두개의 이미지 비교하기  의 심화편 입니다.

 

 

예를 들어, 다음과 같은 영상 이 있을 때, 비디오의 ssim을 비디오로 계속 보고 싶다고 생각하면, 

처음 이미지를 기준으로 잡고, 그 이미지를 바탕으로 계속 그 차이를 표시할 수 있습니다.

 

원봉 영상

 

diff
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()도 사용해 보았지만, 미묘하게 다르게 되더군요.

정확하게 어떻게 달라지는지는 아직 모르겠습니다. ㅎㅎ

반응형