juuuding

[Computer Vision & Deep Learning] OpenCV - 웹 캠에서 비디오 읽기 본문

인공지능/cs231n

[Computer Vision & Deep Learning] OpenCV - 웹 캠에서 비디오 읽기

jiuuu 2023. 10. 30. 19:21

 웹 캠을 통해 입력되는 동영상을 윈도우에 디스플레이 해보겠다.

 

[웹 캠에서 비디오 읽기]

 먼저 VideoCapture()로 웹 캠과의 연결을 시도한다. 함수의 첫 번째 인수 값에는 웹 캠의 번호를 지정하고, 두 번째 인수 값에  CAP_DSHOW를 넣어주어 비디오가 바로 화면에 나타나게 해준다. 참고로 컴퓨터에 연결된 웹 캠이 하나라면 웹 캠의 번호를 0으로 입력하면 된다. 웹 캠과의 연결이 성공적이라면 결과 값은 isOpened로 반환된다. 

 

 이제 무한 루프를 이용하여 영상이 이어지며 계속 화면에 보이도록 설정해준다. read()를 호출한 순간의 프레임을 획득하여 imshow를 통해 화면에 디스플레이 해주고, 이것이 ms 단위로 반복되면서 영상이 이어서 송출된다. read의 반환 값으로는 프레임 획득 성공여부, 프레임이 순서대로 저장된다. 

 

 키 입력으로 영상이 종료되면 release()로 캠과 연결을 해제해주고, destroyAllWindows()로 모든 윈도우를 닫아준다. 

 

[Code]

'''
웹 캠에서 비디오 읽기
'''  

import cv2 as cv
import sys

# 웹 캠과의 연결 시도
cap=cv.VideoCapture(0,cv.CAP_DSHOW)

# 웹 캠과 연결 실패시 cap에 False 저장
if not cap.isOpened():
    sys.exit("카메라 연결 실패")

while True:
    # read 함수를 호출한 순간의 프레임 획득
    ret, frame=cap.read()

    # 프레임 획득 실패시
    if not ret:
        print("프레임 획득에 실패하여 루프를 나갑니다.")
        break

    cv.imshow("Video display",frame)

    # 1ms 동안 키 입력 기다림
    key=cv.waitKey(1)

    # 'q' 입력하면 영상 종료
    if key==ord('q'):
        break

# 카메라와 연결 해제
cap.release()
cv.destroyAllWindows()

 

[비디오에서 영상 수집하기]

 이제 위의 코드로 웹 캠에서 비디오를 표시하고 이 비디오에서 이미지를 수집하여 frames하는 리스트에 저장해보겠다.

if 문을 추가하여 'c' 키가 입력되면 그 때의 frame 값을 frames라는 리스트에 추가한다. 그 후 if len(frames)>0로 frames 리스트에 이미지가 수집되었는지 확인하고, 수집되었다면 hstack으로 리스트에 있는 배열들을 이어 붙여준다. 이때, 반복문에 min(3,len(frames))을 이용하여 최대 3개의 영상을 이어 붙일 수 있게 제한을 걸어주었다. 그리고 나서 imshow를 이용하여 수집된 영상을 윈도우에 디스플레이 해준다. 

 

[Code]

'''
비디오에서 수집한 영상 이어 붙이기
''' 

import cv2 as cv
import sys
import numpy as np

cap=cv.VideoCapture(0,cv.CAP_DSHOW)

if not cap.isOpened():
    sys.exit("카메라 연결 실패")

frames=[]   # 영상을 저장할 리스트 frames
while True:
    ret,frame=cap.read()

    if not ret:
        print("프레임 획득에 실패하여 루프를 나갑니다.")
        break

    cv.imshow("Video display",frame)

    key=cv.waitKey(1)
    # c가 입력되면 리스트에 프레임 추가
    if key == ord('c'):
        frames.append(frame)
    elif key == ord('q'):
        break

cap.release()
cv.destroyAllWindows()

# 리스트에 프레임이 추가되었다면
if len(frames)>0:
    imgs=frames[0]
    for i in range(1,min(4,len(frames))):   # 최대 3프레임까지 이어 붙임
        imgs=np.hstack((imgs,frames[i]))

    cv.imshow("collected images",imgs)

    cv.waitKey()
    cv.destroyAllWindows()

# 리스트 요소 개수
print(len(frames))
# 저장된 첫 번째 영상의 배열 모양 (480, 640, 3)
print(frames[0].shape)
# 3장의 영상을 이어 붙인 이미지는 numpy.ndarray형
print(type(imgs))
# 3장의 이미지를 이어 붙인 이미지의 배열 모양 (480, 1920(640*3), 3)
print(imgs.shape)