카메라와 동영상 처리

Codren·2021년 5월 9일
0

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

  • get() 함수 - 속성 추출

  • propld - 속성 상수
  • retval - 성공하면 해당 속성 값, 실패하면 0




6. 카메라 및 동영상 파일 속성 참조 2

  • set() 함수 - 속성 수정

  • 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으로 설정됨

0개의 댓글