인공지능 AI

[ OpenCV로 동영상 불러오기, glob ]

kybeen 2022. 9. 26. 20:51
728x90
반응형

OpenCV

import cv2

 

 

  • 동영상 데이터 불러오기

cv2.VideoCapture(파일 경로)

video = cv2.VideoCapture(TUTORIAL_PATH + "/tutorial.mp4")
video.isOpened()
# True

 

 

  • 영상 정보 확인
  • video.get()으로 여러 정보 불러올 수 있음
video.get(cv2.CAP_PROP_FRAME_WIDTH) # 영상 가로길이 확인
# 640.0

video.get(cv2.CAP_PROP_FRAME_HEIGHT) # 영상 세로길이 확인
# 360.0

video.get(cv2.CAP_PROP_FPS) # FPS 확인
# 24.0

video.get(cv2.CAP_PROP_FRAME_COUNT)# 비디오 총 길이 (프레임이 총 몇개인지)
# 3288.0 -> 프레임 3288장으로 이루어진 영상임

# 영상 길이 확인 ==> 총 프레임 수 / FPS
print(round(video_length/video_fps))
# 137초

 

영상을 불러오고 다 사용한 뒤에는 release()를 해주어야 한다.

안해주면 계속 메모리를 차지하고 있어서 오버플로우가 난다.

video.release()

 

 

 

[ 동영상을 초 단위로 나눠서 이미지 저장하기 ]

video.read()

  • (리턴값, 프레임)을 반환해준다.
  • 다음에 이어서 나올 프레임이 있으면 리턴값=True
  • frame이 해당 프레임의 이미지
TUTORIAL_IMAGE = TUTORIAL_PATH + "/image2"

TIME_MEASUREMENT_UNIT = 1 # 몇 초 단위로 이미지를 저장할 지 지정

# 해당하는 경로의 폴더가 존재하지 않으면 만들어줌
if not os.path.exists(TUTORIAL_IMAGE):
  os.mkdir(TUTORIAL_IMAGE)

video = cv2.VideoCapture(TUTORIAL_PATH + "/tutorial.mp4")

while video.isOpened():
  ret, frame = video.read() # read() : 리턴값과 프레임을 반환해줌 (읽어올 다음 프레임이 있으면 ret = True)
  if ret:
    # 현재 프레임 위치 (msec)
    frame_sec = video.get(cv2.CAP_PROP_POS_MSEC)/1000
    if frame_sec.is_integer(): # 초단위가 정수일때
      if (frame_sec % TIME_MEASUREMENT_UNIT == 0): # 1초마다
        filename = TUTORIAL_IMAGE + "/" + str(round(frame_sec)) + ".jpg"
    cv2.imwrite(filename, frame) # 각 프레임의 이미지를 저장

  else:
    break

video.release()

 

 

 

  • 코드로 이미지 확인해보기

openCV에서는 이미지를 그냥 불러오면 BGR의 순서로 이미지를 불러오기 때문에 정상적인 이미지를 보고 싶다면 RGB로 변환해주어야 한다.

cv2.cvtColor(cv2.COLOR_BGR2RGB)

image = cv2.imread(TUTORIAL_IMAGE + '/2800.jpg')
rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
plt.imshow(rgb_image)

 

 

 

 

 

 

glob

glob.glob() 함수는 파라미터에 지정한 경로와 확장자에 해당하는 파일명을 리스트로 반환해준다.

조건에는 *?같은 와일드카드 문자만 지원한다.

  • * : 임의의 길이의 모든 문자열
  • ? : 한자리의 문자열
import glob

 

  • 파일명 불러오기
video_list = glob.glob(VIDEO_PATH + '/*.mp4')
video_list
['/content/drive/MyDrive/KT_AIVLE_SCHOOL/11주차_미니프로젝트_3차/AIVLE3rd_individual/video/jung.mp4',
 '/content/drive/MyDrive/KT_AIVLE_SCHOOL/11주차_미니프로젝트_3차/AIVLE3rd_individual/video/park.mp4',
 '/content/drive/MyDrive/KT_AIVLE_SCHOOL/11주차_미니프로젝트_3차/AIVLE3rd_individual/video/sam.mp4',
 '/content/drive/MyDrive/KT_AIVLE_SCHOOL/11주차_미니프로젝트_3차/AIVLE3rd_individual/video/sayuri.mp4']

그대로 불러오면 경로와 확장자까지 모두 포함되어있다.

 

 

mp4파일의 이름만 사용하기 위해 split()으로 '/'문자 단위로 나눠서 맨 마지막에 있는 내용을 다시 '.'으로 잘랐다.

print(video_list[0].split('/')[-1].split('.')[0])
print(video_list[1].split('/')[-1].split('.')[0])
print(video_list[2].split('/')[-1].split('.')[0])
print(video_list[3].split('/')[-1].split('.')[0])
# jung
# park
# sam
# sayuri

 

 

 

 

 

728x90
반응형