OpenCV를 이용한 정지 영상 및 동영상 데이터의 입출력 프로세스 이해
영상 처리는 결국 데이터를 읽어와서(Input), 가공하고, 다시 보여주거나 저장하는(Output) 과정의 반복이다. 특히 동영상은 아주 빠른 속도로 정지 영상을 연속해서 보여주는 것이 핵심이다.
cv2.imread(filename, flags): 파일을 읽어 행렬(numpy.ndarray)로 반환한다.
cv2.imshow(title, image): 특정 윈도우 창에 영상을 출력한다.
cv2.imwrite(filename, image): 가공된 행렬 데이터를 파일로 저장한다.
cv2.VideoCapture(): 카메라 장치나 동영상 파일을 연다. (보통 웹캠은 0번 사용)
프레임(Frame): 동영상을 구성하는 한 장 한 장의 정지 영상.
cap.read(): 카메라로부터 한 프레임씩 읽어온다
웹캠 영상을 실시간으로 읽어와서 화면에 출력하고 종료하는 실습.
Python
import cv2
# 0번 카메라 장치 열기
cap = cv2.VideoCapture(0)
if not cap.isOpened():
print("카메라를 열 수 없습니다.")
exit()
# 카메라 속성 출력 (가로, 세로 크기)
print('Width:', cap.get(cv2.CAP_PROP_FRAME_WIDTH))
print('Height:', cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
while True:
# 한 프레임씩 읽기 (ret: 성공여부, frame: 이미지 데이터)
ret, frame = cap.read()
if not ret:
break
# 영상을 화면에 표시
cv2.imshow('Webcam View', frame)
# 1ms 대기, 'q' 키를 누르면 루프 탈출
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 자원 해제
cap.release()
cv2.destroyAllWindows()
cap.isOpened() 체크: 카메라가 다른 프로그램에서 사용 중이거나 연결이 불량하면 에러 없이 빈 화면만 나올 수 있다. 반드시 초기 오픈 여부를 확인하는 습관이 중요하다.
waitKey(1)의 중요성: 동영상 출력 시 waitKey 값이 너무 크면 슬로우 모션이 되고, 너무 작으면 CPU 점유율이 치솟는다. 보통 실시간 처리를 위해 1 또는 10 정도를 사용한다는 점을 배웠다.
영상 입출력의 기본 함수는 imread, imshow, imwrite이다.
동영상은 VideoCapture 객체를 통해 While 루프 안에서 프레임 단위로 처리한다.
작업이 끝나면 반드시 release()를 호출하여 카메라 자원을 반납해야 한다.