임베디드/Lane detection

[OpenCV] cv2.VideoCapture 영상 데이터 다루기

나야, 웅이 2023. 6. 14. 14:56
728x90
반응형
SMALL

OpenCV로 영상 데이터 다루기

카메라 객체 함수

cv2.VideoCapture()

 

cap  = cv2.VideoCapture()에서 cap은 영상을 다루는 객체

 

1) 실시간 카메라 영상 데이터 가져오기

cap = cv2.VideoCaputre(0)

인자를 0으로 주어서 카메라로 찍히는 실시간 영상 데이터 가져오기

카메라가 여러개라면 0이외에 1, 2 ... 이렇게 인자를 주어서 카메라 영상 데이터를 가져올 수 있다.

 

2) 동영상 파일 읽어오기

cap = cv2.VideoCapture('영상데이터 경로')

 

3) 비디오 캡처 isOpend()

cv2.VideoCapture.isOpend()

카메라가 정상적으로 연결되었거나, 영상을 읽어올 수 있으면 Ture / 실패하였으면 False를 반환하는 함수

 

4) 한 프레임씩 읽어오기 read()

cv2.VideoCapture.read()

영상을 한프레임씩 읽어온다.

 

5) 영상 프레임 크기

cv2.CAP_PROP_FRAME_WIDTH

영상 프레임의 너비

 

cv2.CAP_PROP_FRAME_HEIGHT

영상의 프레임의 높이

 

frame_size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))

cap.get()함수는 영상 객체의 속성 값을 가져온다.

여기서 cv2.CAP_PROP_FRAME_WIDTH와 HEIGHT 값을 가져온다. 

여기서 위의 값들을 float 형태라서 int형으로 형변환하여 사용한다.

 

6) 읽어온 영상 녹화하기

동영상 녹화를 할때, 녹화되는 영상을 설정해야한다.

여기서 녹화 영상의 가로, 세로를 읽어온 영상 프레임의 너비, 높이를 그대로 사용하려면 위에서 사용한 cv2.CAP_PROP_FRAME_WIDTH와 HEIGHT을 사용하면된다.

따로 설정하려면

cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
 
 
 
7) 녹화 영상 코덱 설정
MPEG > mp4
DIVX > avi
 
cv2.VideoWriter(저장할 파일명, 코덱, 프레임 수, 동영상 크기)
out = cv2.VideoWriter('out.avi', fourcc, 20.0, frame_size)
 
import cv2
import numpy as np

#동영상 읽기
cap = cv2.VideoCapture('test.mp4')
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)

#동영상 녹화 설정
#녹화 영상의 가로, 녹화 영상의 세로
frame_size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))

#코덱 설정
#MPEG > mp4
#DIVX > avi
fourcc = cv2.VideoWriter_fourcc(*'XVID')

#녹화 저장 설정
#cv2.VideoWriter(저장할 파일명, 코덱, 프레임 수, 동영상 크기)
out = cv2.VideoWriter('out.avi', fourcc, 20.0, frame_size)

record = False

#동영상 출력하기
while True:
    #동영상에서 이미지를 프레임 단위로 읽어옴
    #ret : 정상적으로 읽어오면 True, 아니면 False
    #frame : 프레임 이미지, numpy 배열
    ret, frame = cap.read()

    #ret이 false일 때(파일에 문제가 있거나 동영상이 끝났을 때)
    if not ret:
        print('이미지 읽기 실패 또는 모두 읽음')
        #비디오 종료
        cap.release()

        #윈도우 실행창 종료
        cv2.destroyAllWindows()

        #반복문 종료
        break
    
    #동영상을 잘 읽어 왔을 때
    cv2.imshow('result', frame)

    #waitKey(33) : 한장의 사진을 0.033초 동안 띄움 
    k = cv2.waitKey(33)

    #esc를 누르면 동영상 종료
    if k == 27 :
        print('동영상 종료')
        cap.realse()
        cv2.destroyAllWindows()
        break

    #녹화 시작 버튼(2를 눌렀을 때)
    if k == 50 :
        record = True
        print('녹화시작')

    if record :
        out.write(frame)

    #녹화 종료
    if k == 51 :
        out.release()
        print('녹화 종료')

728x90
반응형
LIST