Yours Ever, Data Chronicles
Python OpenCV (1) - 이미지, 동영상 데이터를 불러오고 저장하기 본문
안녕하세요, Everly입니다 :)
지금까지 한 포스팅으로 현장에서 데이터 분석 업무를 어떻게 하는지, 어떻게 결과를 내고 개선하는지에 대한 내용을 알아봤습니다.
지금부터는 '발전 편'으로, 이미지 인식과 텍스트 분석이라는 2가지 AI(인공지능) 기술을 소개합니다. 이미지와 텍스트 데이터는 지금까지 봤던 csv 형태로 깔끔하게 저장된 정형 데이터가 아니라, 비정형 데이터라서 다소 까다롭습니다.
자세히 다루지는 않고 맛보기로만 볼 거라서, 여기서 흥미가 생기신다면 더 깊이 공부하면 좋을 것 같아요 :)
먼저 이번 포스팅부터는 '이미지 인식 기술'을 공부해봅니다.
여기서는 다음과 같은 것을 배울 수 있습니다.
- 이미지, 동영상 데이터를 불러오는 방법
- 동영상을 이미지로 나눠서 저장하는 방법
- 이미지, 동영상 속에서 사람의 얼굴을 검출하는 방법(어느 쪽을 보고 있는지도!)
- 원본 영상에서 사람 얼굴을 검출하고 짧은 타임랩스 영상 만들기
※ 이미지 및 동영상 데이터를 다루는 데에는 OpenCV 무료 라이브러리를 사용합니다. 무료아기 때문에 100%에 가까운 정확도는 아니지만, '어느 정도의 성능'을 기대한다면 사용하기 좋은 라이브러리입니다.
※ 또한 얼굴 안면 인식을 가능하게 하는 dlib 무료 라이브러리를 설치합니다.
아나콘다 프롬프트 창을 열고 다음을 입력합니다.
pip install opencv-python
pip install dlib
설치가 완료되었다면 지금 바로 시작해볼까요?
(여기서 dlib 설치가 안 된다면 이 포스팅을, pip upgrade 에러가 뜨면 이 포스팅을 참고하세요!)
✔Table of Contents
데이터 살펴보기
[고객의 소리] 우리가 운영하는 대리점에 카메라를 설치하고 촬영해 봤습니다. 시간대에 따라 사람의 왕래가 다르기 때문에 분석하면 재미있을 것 같습니다만, 이미지를 어떻게 분석하는지 저희가 전혀 모릅니다.
도 이미지에서 어떤 정보를 얻을 수 있는지도 모르기 때문에 어떻게 활용해야 할지 모르겠습니다. 활용할 수 있는 방법을 알려주세요.
먼저 우리가 쓸 데이터는 대리점 앞 도로의 동영상/이미지 데이터입니다. 동영상은 mov 폴더에, 이미지는 img 폴더에 각각 저장돼있습니다.
이번 장에서는 이런 이미지와 동영상 파일을 어떻게 읽어들이는지를 알아봅시다.
Tech 81. 이미지 데이터를 불러오자
먼저 이미지 처리를 하기 위해 opencv 라이브러리를 설치했습니다. 이를 파이썬에서 불러오려면 import cv2를 입력하면 됩니다.
img 폴더의 img01.jpg 파일을 불러옵니다.
[중요 메서드]
- cv2.imread(path) : path로부터 이미지 파일을 읽어온다.
- cv2.imshow('file', file) : 앞에서 읽어온 파일의 파일명(file)을 입력해 이미지 파일을 연다.
- cv2.waitKey(숫자) : 숫자에 지정한 밀리초(ms) 만큼 이미지를 표시한다. 예를 들어, 1000 지정 시 1초 동안 이미지가 나타나고 자동으로 꺼진다. (다만, 0을 지정하면 직접 사용자가 창을 닫을 때까지 꺼지지 않음)
import cv2
img = cv2.imread('img/img01.jpg')
height, width = img.shape[:2]
print('이미지 가로: ', width)
print('이미지 세로: ', height)
이미지는 imread 메서드를 사용해 불러올 수 있습니다. height와 width엔 각각 이미지 세로와 가로 정보가 저장됩니다.
※ 주의! imread 파일 경로인 path엔 한글이 들어가면 AttributeError가 뜹니다. 경로가 영어로 되어있으면 문제가 없으니 꼭 영어로 설정해주세요!
cv2.imshow('img', img)
cv2.waitKey(0) #사진이 큰 창으로 크게 출력됨.
이렇게 이미지를 불러왔습니다.
앞에서도 설명했지만 cv2.waitKey에 0을 입력하면 창을 닫을 때까지 이미지가 자동으로 꺼지지 않습니다. 불러온 이미지를 닫아줍니다.
Tech 82. 동영상 데이터를 불러오자
이번에는 mov 폴더의 mov01.avi 파일을 불러옵니다.
[중요 메서드]
- cap = cv2.VideoCapture(path) : path로부터 동영상 파일을 불러와 'cap'으로 저장한다.
- cap.read() : 영상 정보를 읽어온다.
- cap.get() : 영상 정보를 읽어온다. 옵션으로 다른 정보만 뽑을 수 있다.
- cv2.CAP_PROP_FRAME_WIDTH : width 정보
- cv2.CAP_PROP_FRAME_HEIGHT : height 정보
- cv2.CAP_PROP_FRAME_COUNT : 영상 총 프레임 수
- cv2.CAP_PROP_FPS : 영상 fps값
- cv2.imshow('file', file) : 영상 파일을 연다.
- cv2.waitKey(숫자) : 숫자에 지정한 밀리초(ms) 만큼 영상을 표시한다.
- cv2.destroyAllWindows() : 모든 열려있는 창(영상, 이미지)을 닫는다.
import cv2
#동영상 불러오기
cap = cv2.VideoCapture('mov/mov01.avi')
cap
동영상을 불러옵니다. 현재 불러온 데이터 'cap'의 정보를 뽑아봅시다.
#동영상 정보
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
count = cap.get(cv2.CAP_PROP_FRAME_COUNT)
fps = cap.get(cv2.CAP_PROP_FPS)
print('가로: ', str(width))
print('세로: ', str(height))
print('총 프레임수: ', str(count))
print('FPS: ' + str(fps))
get 메서드로 영상의 정보를 뽑아봤습니다. 총 401개의 프레임으로 구성된 짧은 영상입니다.
read 메서드를 활용하여 영상 전체 정보를 가져오고, imshow 메서드로 영상을 출력하겠습니다.
#동영상 출력 - 실행시 큰 창으로 출력
while(cap.isOpened()):
ret, frame = cap.read() #동영상 정보 읽어오기 -read
if ret:
#frame은 이미지 정보이므로 imshow 로 읽어들일 수 있음
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
위와 같이 동영상이 잘 불러와져 'cap' 객체에 저장되었습니다.
waitKey를 1로 설정하였기에 각 frame을 1밀리초 동안 표시 후 다음 프레임으로 이동하며, 모든 프레임을 처리한 후 키보드의 'q' 키를 누르면 영상이 꺼집니다.
Tech 83. 동영상을 이미지로 나누고 저장하자
동영상을 분할해 여러개의 이미지로 저장하는 것은 실제 현장에선 중요한 의미가 있습니다.
앞서 다룬 mov01.avi 영상을 snapshot2 폴더에 이미지로 나눠 저장해봅시다. 앞서 get 메서드로 읽었을 때 총 프레임 수가 401개라고 하였으므로, 영상을 이미지로 나눠본다면 총 401개의 이미지가 저장될 것입니다.
현재는 폴더 snapshot2는 비어 있습니다.
[중요 메서드]
- cv2.imwrite(path, file) : path에 새로 만들어진 file을 저장한다.
import cv2
cap = cv2.VideoCapture('mov/mov01.avi') #동영상 불러오기
num = 0
while(cap.isOpened()):
ret, frame = cap.read()
if ret:
cv2.imshow('frame', frame)
#이미지의 각 이름을 자동으로 지정
path = 'snapshot2/snapshot_' + str(num) + '.jpg'
cv2.imwrite(path, frame) #영상 -> 이미지로 저장
if cv2.waitKey(1) & 0xFF == ord('q'):
break
num += 1
cap.release()
cv2.destroyAllWindows()
위 코드를 실행하면 이와 같이 영상이 이미지 401개로 나뉘어 저장됩니다.
이렇게 하여 오늘은 이미지와 동영상 데이터를 불러오고, 동영상을 이미지로 나누어 저장해보았습니다.
다음 포스팅에선 불러온 이미지와 동영상 데이터에서, 사람만 인식해보겠습니다.
'Data Science > Analysis Study' 카테고리의 다른 글
Python OpenCV (3) - 이미지에서 사람 얼굴 & 방향 인식하기 (python dlib, 안면 인식 기술) (1) | 2022.05.13 |
---|---|
Python OpenCV (2) - 이미지에서 사람 얼굴 인식하기 (0) | 2022.05.12 |
파이썬 시뮬레이션 - SNS 입소문 전파 예측하기 (4) / 파이썬 데이터 분석 실무 테크닉 100 (0) | 2022.05.05 |
파이썬 시뮬레이션 - SNS 입소문 전파 예측하기 (3) / 파이썬 데이터 분석 실무 테크닉 100 (0) | 2022.05.04 |
파이썬 시뮬레이션 - SNS 입소문 전파 예측하기 (2) / 파이썬 데이터 분석 실무 테크닉 100 (0) | 2022.05.03 |