-
이미지 처리-6 기본 동영상 처리이미지 처리 2023. 6. 19. 18:49
1. 동영상 열기
cv2에서의 동영상 처리는 주피터 환경에서 불가능하기 때문에 vscode에서 진행한다. vscode에서 구축한 아나콘다 환경을 실행하기 위해서는 cd anaconda3/envs/conda/python.exe 로 이동한 뒤 anaconda prompt에서 한 것처럼 activate conda 명령어를 실행시켜 주면 파이썬 파일을 실행할 수 있다. 이후에 run python을 하면 코드가 잘 동작한다.
import cv2 import matplotlib.pyplot as plt import os os.chdir('C:/Users/dotor/OneDrive/바탕 화면/jupyter/2. image') cap = cv2.VideoCapture('./picture/blooms-113004.mp4') width = cap.get(cv2.CAP_PROP_FRAME_WIDTH) height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT) fps = cap.get(cv2.CAP_PROP_FPS) frame_count = cap.get(cv2.CAP_PROP_FRAME_COUNT) if cap.isOpened(): print("success") while True: ret, frame = cap.read() if not ret: break else: frame = cv2.resize(frame, (640, 480)) cv2.imshow("video test", frame) if cv2.waitKey(25) & 0xFF == ord("q"): exit() else: print("fail") cap.release() cv2.destroyAllWindows()
cv2.VideoCapture 함수를 사용하여 실제 동영상 파일이 있는 경로를 지정하게 되는데 이것을 상대경로로 지정하면 파일이 열리지 않는 오류가 발생한다. 따라서 os.chdir로 절대 경로로 폴더를 지정해 주고 그 밑에서 파일을 선택하여 불러오면 동영상이 잘 동작한다.
cv2.VideoCapture을 사용하여 정보를 cap 변수에 저장하였고 이후에 get 메소드를 통해 파일 위치, 밝기 정보, 프레임 속도 등 동영상 정보를 가져올 수 있다. CAP_PROP_FRAME_WIDTH, HEIGHT, FPS, COUNT 함수를 사용하여 영상이 넓이, 높이, FPS, 총 프레임 개수를 가져온다.
이후 동영상이 잘 가져왔는지 cap.isOpend 함수를 사용하여 확인하고 참일 경우 cap.read 함수를 사용하여 동영상의 실행 상태와 프레임을 ret, frame 변수에 저장한다.
만약 ret 값이 false일 때는 브레이크 문을 걸어 동영상을 종료시킨다. cv2.imshow 함수를 통해 저장한 프레임을 재생시키고 q를 누르면 동영상이 종료되도록 설정한다.
waitKey 함수는 키입력을 기다리는 함수이다. 단위는 ms로 1 프레임 당 25ms를 기다리며 ms를 길게 줄수록 오래 기다리기 때문에 동영상이 느리게 재생된다. 이 함수는 사용자가 누른 키를 ascii 코드로 반환하며 0 xff는 이것을 8비트로 변환한다. ord 역시 ascii 코드로 반환하는 역할이기 때문에 만약 사용자가 누른 q 값의 ascii코드가 ord('q') 와 일치할 경우 exit 하는 것이다.
cap.releae 함수는 비디오 캡처 객체를 해제하여 할당된 리소스를 제거하며 cv2.destroyAllWindows는 현재 열려있는 모든 OpenCV 창을 닫는 역할을 한다.
2. 동영상 프레임 저장
fps =25 count = 0 if cap.isOpened(): while True: ret, frame = cap.read() if ret: if (int(cap.get(1)) % fps == 0): print(cap.get(1),fps) os.makedirs("./frame_image_data/", exist_ok=True) cv2.imwrite( f"./frame_image_data/image_{str(count).zfill(4)}.png", frame ) count = count + 1 else: break cap.release() cv2.destroyAllWindows() 25.0 50.0 75.0 100.0 125.0 150.0 175.0 200.0 225.0 250.0 275.0 300.0 325.0 350.0 375.0 400.0 425.0 450.0
불러온 동영상 파일을 재생시켜서 ret 값이 true일 때 cap.get(1)은 frame을 가져온다. 이것을 print로 찍어보면 25의 배수이기 때문에 프레임을 25로 나눴을 때 0이면 makedirs로 파일을 만들고 imwrite로 파일을 저장한다.
imwrite는 프레임을 image_0000.png 형식으로 저장한다. zfill(4)는 count 변수의 숫자를 4자리로 만들고 count +1 함수를 넣어서 값이 1씩 증가하게 만든다.
이후에 경로를 찾아서 들어가면 파일이 잘 저장된 것을 볼 수 있다.
3. 웹캠 열기
cap = cv2.VideoCapture(0) width = cap.get(cv2.CAP_PROP_FRAME_WIDTH) height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT) while True: ret, frame = cap.read() if ret: frame = cv2.resize(frame, (854, 480)) cv2.imshow("video test", frame) if cv2.waitKey(1) == ord('q'): break cap.release() cv2.destroyAllWindows()
cv2.VideoCapture에 번호를 줄 경우 장치관리자에 있는 순서대로 카메라를 가져온다. 현재 내 컴퓨터에서는 0번이 노트북 내장 카메라이기 때문에 내장 카메라를 열고 종료시킬 수 있다.
'이미지 처리' 카테고리의 다른 글
이미지 처리-8 이미지 라벨링 (0) 2023.06.19 이미지 처리-7 객체 추적 (0) 2023.06.19 이미지 처리-5 이미지 혼합 (0) 2023.06.19 이미지 처리-4 얼굴 이미지 회전 (0) 2023.06.19