OpenCV - 카메라 제어

1 분 소요

카메라 제어

카메라 객체 생성 & 사진 찍기

import cv2
import sys

cap = cv2.VideoCapture(0)  # 카메라 오픈

if not cap.isOpen():
    print('카메라 오픈 안됨')
    sys.exit(0)

cap.set(3, 800)  # 카메라 영상의 가로 길이를 800으로 변경
cap.set(4, 600)  # 카메라 영상의 세로 길이를 600으로 변경

#카메라 영상 읽기. ret:처리결과(True, False) / frame:읽은 영상
ret, frame = cap.read() 
if ret:
    cv2.imwrite('pic1.jpg', frame) #카메라 영상 저장
    cv2.imshow('img', frame) #영상을 윈도우에 출력
    cv2.waitKey(0)
    cap.release()
    cv2.destroyAllWindows()
  • cv2.VideoCapture() : 비디오 캡쳐 객체 생성. 파라미터는 어떤 카메라를 사용할 것인가에 대한 장치 인덱스. 카메라가 1개일 경우 0, 2개 이상일 경우 장치 순서대로 0부터 숫자 지정.
  • cap.isOpen() : 카메라 객체가 오픈되었는지 확인. 정상오픈이면 True, 아니면 False
  • cap.set(propId, value) : 카메라 객체의 속성 설정.
    • propId - 카메라 객체의 속성 ID로, 지정된 상수명을 적어도 되고 0에서 18 사이의 숫자를 입력해도 된다. 여기서는 영상의 너비와 높이를 지정하는 아래 두 속성을 사용한다.
      • CV_CAP_PROP_FRAME_WIDTH 또는 3
      • CV_CAP_PROP_FRAME_HEIGHT 또는 4

      그 외 다른 속성들

  • ret, frame = cap.read() : 영상의 한 프레임을 읽음. 정상적으로 처리되었다면 True, 실패하면 False가 나타나며 frame 변수 안에 읽은 영상 프레임을 담는다.
  • cap.release() : 카메라 장치에서 받아온 메모리를 해제하여 카메라 객체 해제

동영상 찍기

프레임 한 장만 필요로 하는 사진과 달리 while 문으로 loop를 돌려서 연속된 프레임의 동영상으로 출력한다.

import cv2
cap = cv2.VideoCapture(0)  # 카메라 오픈
codec = cv2.VideoWriter_fourcc(*'DIVX')  # 사용할 코덱 생성
out =  cv2.VideoWriter('a.avi', codec, 25.0, (640,480))  # 동영상 작성자 객체 생성
while cap.isOpened():	 # 카메라 정상 오픈일 때 반복하여 동작
    ret, frame = cap.read()  # 카메라 영상 읽기
    if ret:  # 읽기가 정상이면
        out.write(frame)  # 동영상 작성
        cv2.imshow('frame', frame)  # 현재 frame을 윈도우에 출력
        if cv2.waitKey(1) & 0xFF == ord('q'): #q입력 시 종료 
            break
    else:
        break
cap.release()  # 카메라 객체 해제
out.release()  # 동영상 작성자 객체 해제, 동영상 촬영 종료
cv2.destroyAllWindows()
  • cv2.VideoWriter_fourcc(*‘DIVX’) : 동영상 저장에 사용할 코덱 (영상 데이터 처리 알고리즘) 설정
  • cv.VideoWriter(‘파일명’, 코덱종류, 초당 프레임 수, 가로세로 크기) : 동영상 저장 객체. 코드 실행 시점부터
  • out.release() : 카메라 객체 해제와 함께 동영상 작성자 객체도 해제

촬영한 영상 실행

import cv2
cap = cv2.VideoCapture('a.avi')   # 영상 파일 오픈
while cap.isOpened():  # 동영상 파일이 정상 오픈이면
    ret, frame = cap.read()  # 동영상에서 frame을 읽음
    if not ret:
        break
    cv2.imshow('a.avi', frame)	# 읽은 frame을 윈도우에 출력
    if cv2.waitKey(42) & 0xFF == ord('q'): #q입력 시 종료 
        break
cap.release()
cv2.destroyAllWindows()

동영상 촬영과 마찬가지로 동영상을 재생하려면 프레임을 모두 보여줘야하기 때문에 while문 사용하여 연속해서 프레임 출력

댓글남기기