[Open CV] OpenCV-Python 기초 사용법 _ 카메라와 동영상 처리하기2
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하면 성공적으로 저장되는것을 확인할 수 있다.
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
패스트캠퍼스 [직장인 실무교육]
프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.
fastcampus.co.kr