Show 상상하는 개발자Dev/PYTHON 파이썬 [OpenCV] 파이썬으로 동영상 프레임 초단위 저장/캡처하기 (Save Video Frame per Second by Python)로우로 2022. 1. 4. 17:21 오늘은 동영상(mp4) 파일을 OpenCV를 사용하여 초단위로 저장하는 방법을 알아보도록 하겠습니다 기본적으로는 프레임 단위로 저장이 가능하나 본 예제에서는 다루고자 하는 동영상이 1초에 몇 프레임(fps)으로 구성되어있는지 알아내어 해당 정보를 사용해 초 단위로 저장해보도록 하겠습니다
필요한 라이브러리를 호출합니다 본 예제에서는 파이썬에서 OpenCV를 다루기 위한 cv2 라이브러리와 디렉토리 접근 및 생성 등을 위한 os 라이브러리면 충분합니다
지정된 경로에 저장된 비디오 파일을 불러옵니다 경로는 filepath 변수에 저장하도록 합니다 if문을 통해서 파일이 제대로 불러와졌는지 확인해주도록 합니다 만약 제대로 불러와지지 않았다면 프로그램을 종료해주도록 처리합니다
불러온 비디오 파일의 정보를 확인해보겠습니다 본 예제에서는 사실 초당프레임수만 있으면 되지만, 영상의 길이, 너비, 높이 등 다양한 정보를 함께 확인해보도록 하겠습니다
추출한 프레임들을 저장할 디렉토리를 생성합니다 기존에 디렉토리가 있다면 새로 생성하지 않고, 없을 경우에만 생성하도록 합니다 에러가 발생할 경우를 대비하여 예외처리도 해줍니다
앞서 저장한 fps 값을 사용하여 1초마다 프레임을 저장하도록 합니다 파일 형식은 jpg를 사용하였으며 이미지 파일이 저장될 때마다 몇번째 프레임에 해당하는지 출력해주도록 합니다 모든 작업이 끝나면 비디오를 사용하느라 잡아두었던 메모리를 해제하도록 합니다 포스트를 마치도록 하겠습니다 내용 중에 문제나 변경사항이 있다면 댓글로 말씀해주세요 :) OpenCV 넌 뭐하는 놈이냐?OpenCV는 Open Source Computer Vision Library의 약어로 실시간 컴퓨터 비전을 목적으로 한 프로그래밍 라이브러리이다. 원래는 인텔이 개발하였다. 실시간 이미지 프로세싱에 중점을 둔 라이브러리이다. 인텔 CPU에서 사용되는 경우 속도의 향상을 볼 수 있는 IPP(Intel Performance Primitives)를 지원한다. 이 라이브러리는 윈도, 리눅스 등에서 사용 가능한 크로스 플랫폼이며 오픈소스 BSD 허가서 하에서 무료로 사용할 수 있다. OpenCV TensorFlow , Torch / PyTorch 및 Caffe의 딥러닝 프레임워크를 지원한다. OpenCV는 컴퓨터 비전 관련 프로그래밍을 쉽게 할 수 있도록 도와주는 라이브러리로 이미지 딥러닝(알파고 기술)에도 많이 활용된다. 컴퓨터 비전(Computer Vision)은 카메라, 에지 기반 또는 클라우드 기반 컴퓨팅, 소프트웨어 및 인공 지능(AI)을 결합하여 시스템이 사물을 “확인”하고 식별할 수 있게 합니다. 인텔은 범용 프로세싱을 위한 CPU, 컴퓨터 비전, 비전 처리 장치(VPU)를 비롯한 AI 가속화를 지원하는 다양한 기술 포트폴리오를 보유하고 있습니다. 다양한 환경에서 가치를 발휘하는 컴퓨터 비전 시스템은 사물과 사람을 빠르게 인식하고, 고객 통계 자료를 분석하고, 공산품을 검사하는 등의 작업을 수행할 수 있습니다. 컴퓨터 비전은 딥 러닝을 사용하여 이미지 처리 및 분석 시스템을 안내하는 신경망을 형성합니다. 충분히 훈련된 컴퓨터 비전 모델은 사물을 인식하고 사람을 감지하거나 인식하며 움직임도 추적할 수 있습니다. OpenCV 응용분야인간과 컴퓨터의 상호 작용(HCI), 물체 인식, 안면 인식, 모바일 로보틱스, 제스쳐인식, 자율주행 등 다양함. 파이썬용 OpenCV 설치opencv라이브러리 사용을 위해서 명령프롬프트 창을 열고 pip명령어를 사용하여 설치합니다.
설치된 버전 : opencv-python-4.5.2.54
opencv 설치된 버전 확인 스크립트
OpenCV 이미지 처리1. 이미지를 불러오기imread(filename, flags)함수를 사용하여 이미지를 불러옵니다. 2번째 인자(파라미터) 플래그 타입을 설정하지 않은 경우, 1로 한 경우, cv2.IMREAD_COLOR 한 경우 코드 상 표기만 다를뿐 모두 동일하니, 편한 방법으로 사용하면 된다. 반환된 이미지의 값을 받은 img1 변수의 타입을 print()문으로 출력해보면 넘파이(numpy) 배열(numpy.ndarray)임을 알 수 있어요. imshow()함수는 이미지를 출력하기위한 윈도우 창을 호출하기위해 사용됩니다. 윈도우 창이름을 같은 값으로 지정하면 동일한 윈도우로 간주되어 하나의 윈도우창만 열리게 되니, 여러개의 이미지 창을 실행할 때는 라벨명을 다르게 해야 합니다. destoryAllWindows()함수는 실행중인 프로그램 종료시 모든 창을 닫을 때 사용합니다. waitKey()함수는 사용자의 입력을 기다려주는 함수이다. 인자값이 없거나 0일 경우 시간 제한 없이 기다려 줍니다. 키를 입력받아 분기할 작업이 있을때 활용하면 됩니다. 아래 샘플 코드에서는 cv2.destoryAllWindows()함수를 실행하기 위해 기다린다고 생각하면 되요.
[코드 실행결과] <class 'numpy.ndarray'> imread()함수의 2번째 인자 값 플래그 타입(enum)
5개의 플래그 값에 대한 이미지 반환을 확인해봅니다.
[코드실행결과] 육안으로 식별이 가능한가? 2. 이미지 다른이름으로 저장원본이미지를 그레이스케일 처리 후 다른 이름으로 저장하기위해 cv2.imwrite()함수를 사용 합니다.
[실행결과] 지정한 파일이름으로 지정 폴더에 저장 되었습니다. 이미지를 저장할 때, 3번째 인자값에 다음과 같은 저장 관련 옵션을 적용할 수 있습니다.
이미지 저장시, 이미지 품질을 낮게 처리 한다면 아래와 같은 방법으로 처리해줍니다.
3. OpenCV 이미지 붙이기여러개의 이미지를 붙이기 위해 cv2.vconcat()함수와 cv2.hconcat()함수를 사용한다. 인자값은 n차원 배열 타입입니다.
이미지 2개를 수평방향으로 붙여주는 샘플 코드
[실행결과] 4. OpenCV 이미지 사이즈 조절 (확대 및 축소) cv2.resize() 함수를 사용하여 이미지 사이즈 변경이 가능하며, 튜플 자료형으로 가로와 세로의 사이즈 값을 할당합니다.
resize()함수는 정수값만 적용할 수 있음으로 아래의 코드 스니펫처럼 나눗셈을 한경우 리턴값 타입이 float 타입임으로 round()함수를 이용하여 소숫점을 제거해야 합니다.
이미지 확대 축소시 사용되는 interpolation 속성
5. OpenCV 이미지 밝기 조절이미지의 밝기 값을 덧셈 뺄셈을 이용하여 해당 수치만큼 처리하면 이미지의 밝기를 조절할 수 있습니다. 아래 샘플 코드는 원본이미지의 밝기를 조절한 후 3개의 이미지를 수평방향으로 붙여서 보여줍니다.
[실행결과] 이미지 처리 결과 어디서 많이 보던 이미지가 아닌가? 포토샵에서 히스토그램에서 이미지 밝기 조절할 때 흔히 볼 수 있는 결과 입니다. 이미지 픽셀값의 최대값인 255를 넘기거나 최소값인 0이하로 값이 변경될 경우 나타나는 현상입니다. 처음에 openCV를 사용하여 이미지를 읽어 올때 이미지의 반환 값이 넘파이 배열임을 알고 있죠. 이런 현상을 처리하기 위해 numpy모듈(라이브러리) 사용하여 numpy.clip()함수를 이용하면 해결하여 조건을 추가할 수 있습니다. numpy.clip(src, min, max)함수는 src 값에 적용할 최소값과 최대값을 사전이 대입하여, 최소값 보다 작은 경우, 최소값으로 치환하고, 최대값 보다 큰 경우 최대값으로 치환해주는 함수 입니다. 다음 샘플코드를 실행하면 정상적으로 밝은 이미지와 어두운 이미지로 변환 되었음을 확인할 수 있어요. 이미지의 타입값을 int 타입으로 먼저 변경 후에 밝기 값을 계산 해준 뒤, uint8타입으로 변경해 줘야 오류가 발생하지 않습니다.
6. OpenCV 이미지 회전이미지 회전을 위해 2x3 회전 행렬 생성 함수인 cv2.getRotationMatrix2D(center, angle, scale)를 이용하여 회전 변환 행렬을 계산합니다. 아핀 변환 함수(cv2.warpAffine)로 회전 변환을 계산합니다. 아래 코드는 이미지의 중심점을 기준으로 45도 회전하면서 0.5배로 확대하는 이미지를 반환합니다. 앵글(angle) 회전각도값이 양수값인 경우 시계반대방향으로 회전합니다. cv2.getRotationMatrix2D() 결과에서 나온 변환행렬을 cv2.warpAffine()함수에 적용합니다.
[실행결과] 7. OpenCV 이미지 대칭(Flip)이미지의 대칭 처리를 위해서 cv2.flip(src, flipCode)함수를 사용합니다.
[실행결과] 윈도창 이름을 한글로 했을 경우 깨집니다. 영어로 하세요. 8. OpenCV 이미지 자르기(Slice) 영상이나 이미지의 특정 영역을 잘라내는 것은 관심 영역(Region Of Interest, ROI)이라고 합니다. 이미지를 처리할 때 이미지에서 특정 사물을 탐지하거나 검출하는 영역을 잘라낼때 활용합니다. img1[이미지에 높이(행), 너비(열)]로 관심 영역을 설정합니다.
리스트 혹은 배열의 특정 영역을 자르는 방식과 동일합니다.
[실행결과] 9. OpenCV 이미지 색상 공간 변환색상 공간 변환 함수인 cv2.cvtcolor()를 이용하여 이미지의 색상 공간을 변경할 수 있습니다.
이미지를 처리하는 또 다른 라이브러리가 있다. pillow(PIL)과 Matplotlib 등이 있다. 관심있다면 아래 글을 참고! [Python] 파이썬 matplotlib 설치 및 사용방법 예제 총정리 파이썬에서 데이터(자료)를 시각화 하기 위해 그래프를 그릴 수 있습니다. 그래프를 그리기 위해서는 matplotlib 모듈을 설치하면 가능합니다. 데이터를 그래프화 함으로 써 데이터에 대한 분석이 ddolcat.tistory.com [Python] 파이썬 이미지 처리 pillow(PIL) 설치 및 사용 예제 총정리:드루와 이미지 분석 및 처리를 쉽게 할 수 있는 라이브러리(Python Imaging Library : PIL)가 있습니다. 바로 pillow모듈입니다. 다양한 이미지 파일 형식을 지원하며, 강력한 이미지 처리와 그래픽 기능을 제공하 ddolcat.tistory.com [REFERENCE] https://ko.wikipedia.org/wiki/OpenCV https://pypi.org/project/opencv-python/ https://docs.opencv.org/master/d9/df8/tutorial_root.html https://www.intel.co.kr/content/www/kr/ko/internet-of-things/computer-vision/overview.html https://docs.opencv.org/3.4/d8/d6a/group__imgcodecs__flags.html https://076923.github.io/ https://opencv-python.readthedocs.io/ #python opencv,#numpy.clip(),#파이썬 OpenCV,#OpenCV 사용법,#Python OpenCV,#OpenCV-python 예제,#OpenCV 예제,#OpenCV 사용법,#opencv란,#컴퓨터 비전,#Open CV 활용 |