OpenCV란 무엇인가?
OpenCV(Open Source Computer Vision)는 머신러닝과 컴퓨터 비전을 위해 개발된 오픈소스 프로그래밍 라이브러리입니다. 컴퓨터 비전 애플리케이션을 개발하고 상용 제품에 머신러닝을 빠르게 적용할 수 있는 공통 인프라를 제공합니다.
OpenCV는 컴퓨터 비전과 머신러닝을 위한 2,500개 이상의 최적화된 알고리즘을 보유하고 있으며, 클래식 알고리즘부터 최첨단 알고리즘까지 모두 포함되어 있습니다. 이렇게 방대한 알고리즘 덕분에 얼굴 검출 및 인식, 객체 식별, 동영상 속 인간 행동 분류, 카메라 움직임 추적, 여러 이미지를 합쳐 고해상도 파노라마 이미지 생성 등 다양한 용도로 활용할 수 있습니다.
프로젝트 개요
이번 실습에서는 동영상을 프레임 단위로 처리하는 기능을 구현해 보겠습니다. 입력 동영상은 실시간 카메라 영상이거나 로컬 컴퓨터에 저장된 파일일 수 있습니다. 여기서는 로컬에 저장된 동영상으로부터 프레임을 생성하고, 해당 프레임들을 로컬 드라이브에 저장하는 방법을 다룹니다.
OpenCV 설치하기
OpenCV는 Python 표준 라이브러리가 아니므로 별도로 설치해야 합니다. pip를 사용하면 매우 간단하게 설치할 수 있습니다:
pip install opencv-python Collecting opencv-python Downloading https://files.pythonhosted.org/packages/49/4b/ad55a2e2c309fb698e1283e687129e0892c7864de9a4424c4ff01ba0a3bb/opencv_python-4.0.0.21-cp36-cp36m-win32.whl (22.1MB) 100% |████████████████████████████████| 22.1MB 141kB/s Requirement already satisfied: numpy>=1.11.3 in c:\python\python361\lib\site-packages (from opencv-python) (1.13.0) Installing collected packages: opencv-python Successfully installed opencv-python-4.0.0.21
설치가 완료되면 동영상 파일을 준비합니다. 이 예제에서는 F 드라이브에 저장된 동영상 파일을 프레임(썸네일)으로 변환한 후, 원하는 위치에 프레임 이미지를 저장할 것입니다.
프레임 추출 코드 구현
아래는 동영상 파일을 읽어 프레임을 추출하는 전체 코드입니다:
#Import libraries
import cv2
import os
#Function to extract frames
def extractFrames(pathIn, pathOut):
#directory path, where my video images will be stored
os.mkdir(r'c:/users/rajesh/Desktop/data')
#Capture vidoe from video file
cap = cv2.VideoCapture(pathIn)
#Counter Variable
count = 0
while (cap.isOpened()):
# Capture frame-by-frame
ret, frame = cap.read()
if ret == True:
print('Read %d frame: ' % count, ret)
# save frame as JPEG file
cv2.imwrite(os.path.join(pathOut, "frame{:d}.jpg".format(count)), frame)
count += 1
else:
break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()
def main():
extractFrames(r'f:/I Miss You.mp4' , 'data')
if __name__=="__main__":
main()코드 동작 원리
1. 라이브러리 임포트: cv2(OpenCV)와 os(운영체제 관련 기능) 모듈을 가져옵니다.
2. 출력 디렉토리 생성: os.mkdir() 함수를 사용하여 추출된 프레임 이미지가 저장될 디렉토리를 생성합니다.
3. 동영상 캡처: cv2.VideoCapture()로 지정된 경로의 동영상 파일을 엽니다.
4. 프레임별 읽기 및 저장: cap.read()가 프레임을 하나씩 읽어들이고, 각 프레임을 frame0.jpg, frame1.jpg 형태의 JPEG 파일로 순차적으로 저장합니다. 더 이상 읽을 프레임이 없으면 반복문이 종료됩니다.
5. 리소스 해제: 모든 작업이 끝나면 cap.release()와 cv2.destroyAllWindows()로 캡처 객체와 창 관련 리소스를 정리합니다.
실행 결과
코드를 실행하면 데스크톱(지정한 목적지 경로)에 data 폴더가 생성되고, 동영상에서 추출된 프레임들이 해당 폴더 안에 저장된 것을 확인할 수 있습니다.
이 방법을 활용하면 동영상 데이터 분석, 이미지 데이터셋 구축, 특정 장면 캡처 등 다양한 작업을 효율적으로 수행할 수 있습니다. 또한 실시간 카메라 영상에도 동일한 로직을 적용할 수 있어 확장성이 뛰어납니다.