Program/OPEN_CV

[Open CV] OpenCV-Python 기초 사용법 _ 카메라와 동영상 처리하기2

사막여유 2022. 4. 30. 14:54
728x90

 

OpenCV에서는 cv2.VideoWriter 클래스를 사용하여 프레임을 동영상 파일로 저장할 수 있다.

약 5가지의 코덱,압축방식,색상,픽셀포멧을 사용할 수 있는데

DIVX XVID FMP4 X264 MJPG 등의 압축방식을 사용할 수 있다.

혹시 아래 강의를 따라하다가 동영상이 잘 실행이 되지않는다고하면 위 코덱을 따로 설치해야 한다.

근데 왠만한 window 10이상의 PC들은 위 코덱들이 설치 되있을 것이다.

 

 - 저장을 위한 동영상 파일 열기 ( cv2.VideoWriter )

 fourcc 인자에서는 위 5가지의 압축방식을 입력해주면 해당 압축방식으로 저장할 수 있고

중요한건 GrayScale 영상을 저장하고싶으면 그대로 저장할 수 없고 TreuColor 영상으로 변환한 이후에 저장해야한다.

그리고 해당 함수의 리턴값으로 객체를 생성하여 사용할 수 있다.

VideoWriter.isOpened로 영상을 제대로 불러왓는지 확인해준뒤

VideoWriter.write함수를 사용하여 ndarray 타입을 저장할 수 있다.

 

 

위 함수들을 실제 코드로 작성해보면 위와같이 사용할 수 있다.

w, h 변수에는 해당 이미지의 Width , Height 를 반올림하여 받아왔다.

그리고 초당프레임을 해당 카메라의 초당프레임을 받아와서 VideoWrtier 에 넣어줄 수 있는데 

카메라마다 받아와지는 종류가 있고 받아와지지 않는 종류가 있기 때문에 강제로 fps에 

해당 스펙의 값을 넣어줘도 무관하다.

 

fourcc 인자네는 cv2.VideoWriter_fourcc(*'DIVX') 라는 함수와 인자를 사용하여 지정해줄수 있는데 

*'DIVX' 라고사용할 수도 있고, 'D' , 'I' , 'V', 'X' 라고 사용할수도있는데 편리성을위해 전자를 많이 사용한다.

 

그리고 Delay 값은 한프레임과 다음 프레임의 시간간격을 측정하기 위해서 1000(ms) 를 fps로 나눠주면

그 시간간격을 측정할 수 있다.

 

그리고 out = cv2.VideoWrtier('output.avi', fourcc, fps, (w,h))

여기서 생략된 isColored라는 값은 디폴트값이 TRUE이기때문에 생략됐다.

 

 

 

이후 While 루프내부에서

ret, frame = cap. read() 라는 변수를 생성해주고

out.write(frame) 으로 현재 읽어오고 있는 프레임을 하나하나 저장시켜주는 프로그램을 만들었고

WaitKey(delay) 를 해줌으로서 프레임간의 시간간격을 While루프의 딜레이 값으로 받아오는 걸 알수 있다.

 

 * OpenCV 에서 제공하는 VideoWrite는 영상만 저장하고 소리는 저장하지 못한다.

 

그리고 inversed = ~frame 이라는 기능을 보면 영상이 반전되서 저장이되는것을 볼수 있는데 

이를 저번 강의에서 나왔던 edge = cv2.Canny(frame,50,150) 라는 함수를 사용하여 저장하면 엣지 영상이 저장이 된다.

 

하지만 실제로 실행해보기 전에 영상의 용량을 봐도 굉장히 작은 용량이고 실제로 실행시켜도 영상이 켜지지 않는다.

그 이유는 위에서 설명했듯이 edge가 GrayScale 영상으로 반환이 되기때문에 컬러영상으로 변환시켜주지 않아서

영상이 제대로 저장되지 않은 것이다.

 

그래서 edge를 cv2.cvtColor함수를 사용하여 BGR 성분으로 변환시켜준 뒤 Write하면 성공적으로 저장되는것을 확인할 수 있다.

 

 

 

 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

https://bit.ly/3L3avNW

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

 

728x90