Section 1. 카메라와 동영상 처리
1. 동영상 처리
- 동영상 - 일련의 영상 파일이 빠른 속도로 보여지는 것
- 다양한 코덱으로 압축된 동영상을 파싱해서 일련의 프레임 추출
2. 카메라 처리
- 특정 기기의 입력 하드웨어인 카메라를 다루는 것
- 노트북의 웹캠, 핸드폰의 카메라 등
3. FPS (Frame Per Second)
- 초당 보여지는 영상파일의 수를 의미
- FPS가 높으면 동영상이 부드럽게 보이고, 낮으면 끊겨서 보임
Section 2. 카메라 및 동영상 출력
1. cv2.VideoCapture 클래스
- opencv에서 제공하는 카메라 및 동영상 처리 클래스
- 카메라와 동영상으로부터 프레임(Frame)을 받아오는 작업을 수행
2. 카메라 열기
- VideoCaputre() - 카메라 연결 함수
- index - camera_id
- apiPreference - 선호하는 카메라 처리 방법 (보통 생략)
- retval - cv2.VideoCapture 객체
3. 동영상 파일 열기
- VideoCaputre() - 동영상 파일 불러오기 함수
- filename - 동영상 파일, 비디오 스트림 URL 등
- apiPreference - 선호하는 동영상 처리 방법 (보통 생략)
- retval - cv2.VideoCapture 객체
4. 프레임(Frame) 추출
- 동영상 파일 또는 카메라 입력으로부터 하나의 프레임(Frame)을 추출
- read()함수 - 두 개의 반환값
- retval - 성공적으로 불러오면 True, 실패하면 False
- image - 현재 프레임(numpy.ndarry)
5. 카메라 및 동영상 파일 속성 참조 1
- propld - 속성 상수
- retval - 성공하면 해당 속성 값, 실패하면 0
6. 카메라 및 동영상 파일 속성 참조 2
- propld - 속성 상수
- value - 지정하고 싶은 속성 값
- retval - 성공하면 True, 실패하면 False
7. 실습 코드
cap = cv2.VideoCapture(0) # 기본 카메라로 설정된 카메라 불러오기 index = 0
cap.open(0) # 생략 가능
if not cap.isOpened(): # 카메라가 연결되지 않았다면
...
...
cap.get(cv2.CAP_PROP_FRAME_WIDTH # 연결된 카메라 프레임의 가로 크기 추출
cap.get(cv2.CAP_PROP_FRAME_HEIGHT # 연결된 카메라 프레임의 세로 크기 추출
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640) # 연결된 카메라 프레임의 가로 크기 640으로 변경
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480) # 연결된 카메라 프레임의 세로 크기 480으로 변경
- set()함수는 카메라의 속성을 바꾸지 못해도 True를 반환함
- 카메라마다 지원하는 고유의 프레임 크기가 정해져있음
- 맥북의 웹캠(Facetime camera)은 1280x720과 640x480을 지원하지만 opencv 및 VScode로는 직접적으로 기본 설정을 바꿀 수 없었음 따라서 set()함수 대신 resize()함수를 이용해서 출력되는 창의 크기를 640x480으로 변경함
ret, frame = cap.read() # 연결된 카메라로부터 하나의 프레임(영상파일)을 읽어오기
# 이때 2개의 값을 반환하고 첫번 째는 성공여부 두번 째가 프레임
- 카메라로부터 프레임을 추출한 뒤에 해당 영상 파일을 빠르게 출력하여 동영상처럼 보이게 함
- 동영상 파일 출력은 VideoCapture 객체 생성 시 카메라가 아닌 동영상 파일 지정하면 됨
Section 3. 동영상 저장하기
1. cv2.VideoWiriter 클래스
- 일련의 프레임을 동영상 파일로 저장
- 일련의 프레임은 모두 크기와 데이터 타입이 같아야 함
- filename - 저장될 파일 이름 (ex. 'video.avi')
- fourcc - fourcc 값 (ex. cv2.VideoWriter_fourcc(*DIVX'))
- fps - 초당 프레임 수
- isColor - 컬러 영상이면 True, 그렇지 않으면 False
- retval - cv2.VideoWriter 객체
2. Fourcc (four character code)
- 동영상 파일의 코덱, 압축 방식, 색상, 픽셀, 포맷 등을 정의하는 정수 값
3. 실습 코드
cap = cv2.VideoCapture(0) # 기본 카메라 연결
fps = 30 # fps = 30 설정
fourcc = cv2.VideoWriter_fourcc(*'DIVX') # fourcc 값 지정
out = cv2.VideoWriter('output.avi',fourcc,fps,(1280,720)) # VideoWriter 객체 생성
cv2.namedWindow("frame",0) # 0 = cv2.WINDOW_NORMAL
cv2.resizeWindow("frame",640,480) # 카메라 영상 출력 창 640x480으로 변경
- 1280x720 그대로 출력하면 출력하는데 처리속도가 오래 걸리기 때문에 반응속도가 낮아짐
- 영상 파일은 1280x720이지만 출력되는 창만 640x480으로 설정하면 처리속도가 빨라짐
ret, frame = cap.read() # 카메라 입력으로부터 프레임 읽어오기
out.write(frame) # 해당 영상파일을 동영상의 한 프레임으로 저장
cv2.imshow('frame', frame) # 카메라 영상 출력
- 1280x720 크기로 imshow-waitkey를 수행하면 처리속도가 오래걸려서 카메라 입력을 그대로 동영상으로 저장할 수 가 없음
- 만약 카메라 영상을 imshow-waitkey를 통해 출력하지 않고 저장만 한다면 제대로 저장됨
error
1. VScode opencv 카메라 접근 error
- terminal 상에서 프로그램 실행하거나 sudo code를 이용해서 관리자 권한으로 VScode 실행
2. set으로 프레임 크기 변경해도 변경되지 않는 error
- VScode로는 접근해서 직접 변경할 수 없는 것 같음
- OBS 프로그램으로 카메라 프레임 640x480으로 변경 후 실행하면 640x480으로 설정됨