본문 바로가기
컴퓨터 비전

cv.cvtColor(frame, cv.COLOR_BGR2GRAY)후 write로 영상 저장 시 오류

by miiinn 2022. 10. 12.

[요약]

cv.cvtColor(frame, cv.COLOR_BGR2GRAY)후 write로 영상 저장 시 오류가 나면
VideoWrite객체를 초기화 하는 과정에서 isColor=False의 속성값을 추가해준다.

 


 

웹캠에서 받아온 영상을 그레이 스케일로 저장하기 위해 다음의 코드를 짜고 있었다.

import cv2 as cv

def invert():
    cap = cv.VideoCapture(0) # 웹캠에서 받아오기
    if not cap.isOpened():
        print("Camera open failed!")
        return

    # output.avi 동영상 파일 저장
    w = round(cap.get(cv.CAP_PROP_FRAME_WIDTH))
    h = round(cap.get(cv.CAP_PROP_FRAME_HEIGHT))
    fps = cap.get(cv.CAP_PROP_FPS) # 저장에 필요한 정보들

    fourcc = cv.VideoWriter_fourcc(*'DIVX')
    delay = round(1000 / fps)

    outputVideo = cv.VideoWriter('output.avi', fourcc, fps, (w, h), isColor=False) # VideoWriter 객체초기화
    if not outputVideo.isOpened():
        print('File open failed!')
        return

    # 프레임정보 가져와서 저장
    while True:
        ret, frame = cap.read() # 각 프레임 읽기
        if not ret:
            break

        previous = frame.mean() # 직전 프레임의 평균 밝기
        current = # 현재 프레임의 평균 밝기

        gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY) # 그레이스케일로 변환
        inversed = ~gray

        outputVideo.write(gray)

        cv.imshow('frame', gray)  # 원본 화면에 출력
        #cv.imshow('inversed', inversed)  # 반전 화면에 출력

        if cv.waitKey(delay) == 27:
            break

    cv.destroyAllWindows()

invert()

 

코드의 이부분에서

frame을 cv.cvtColor 함수를 이용하여 그레이 스케일로 변환하고 write로 저장하면 에러가 났다.

    while True:
        ret, frame = cap.read() # 각 프레임 읽기
        if not ret:
            break

        gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY) # 그레이스케일로 변환

        outputVideo.write(gray) # 저장

        cv.imshow('frame', gray)  # 원본 화면에 출력
        #cv.imshow('inversed', inversed)  # 반전 화면에 출력

        if cv.waitKey(delay) == 27:
            break

 

imshow는 잘 되는데 막상 저장된 영상을 보려고 하면 자꾸 0xc10100be에러가 뜨며 파일이 손상되어 열리지 않았다.

그런데 gray로 바꾸는 코드인

>>> gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY) # 그레이스케일로 변환

부분을  빼면 잘 저장된다.

 

영상 형식이 달라서 그랬다.

 

frame은 3채널(a,b,c)이고 gray는 2채널(a,b)이기 때문.

 

이걸 또 어케 바꾸나.. 하다가

 

윗 부분이 잘못됐었던 것을 알았다.

outputVideo = cv.VideoWriter('output.avi', fourcc, fps, (w, h), isColor=False) # VideoWriter 객체초기화

isColor=False가 없었는데 넣어주었다.

애초에 색깔이 없는 상태로 VideoWriter 객체를 만들겠다는 뜻..!

 

이렇게 하니 write를 써도 그레이스케일로 잘 저장이 된다. 

 

객체를 초기화 하는 과정에서 isColor=False의 속성값을 추가해준다.