파이썬 기반 주요 이미지 라이브러리에는 크게 3가지가 존재한다.
1. PIL
주로 이미지 처리만을 위해 사용되고, 처리 성능이 상대적으로 느리다는 특징을 가지고 있다.
2. scikit-image
파이썬 기반의 전반적인 컴퓨터 비전 기능을 제공하고 Scipy 기반으로 만들어졌다.
3. OpenCV
오픈 소스 기반의 최고 인기 컴퓨터 비전 라이브러리이다. 컴퓨터 비전 기능 일반화에 크게 기여를 했으며 C++기반이나 Python도 지원한다.
OpenCV를 이용하여 이미지 로딩을 할때는 imread()함수를 이용해준다.
imread("파일명")은 파일을 읽어 넘파이 array로 변환해준다.
여기서 주의해야 할 점이 OpenCV가 이미지를 RGB형태가 아닌 BGR형태로 로딩하기 때문에 색감이 원본 이미지와 다르게 나타난다.
OpenCV에서 imread("파일명")을 이용하여 로딩된 이미지 배열은 BGR형태의 배열이므로 cvtColor(이미지 배열, cv2.COLOR_BGR2RGB)를 이용하여 변환을 해준다.
OpenCV에서 메모리에 있는 이미지 배열을 다시 파일에 저장하려면 imwrite("출력파일명",이미지배열)을 이용한다.
이때 imread()로 인해 BGR형태로 되어 있는 이미지 배열을 다시 RGB형태로 변환하여 저장하게 된다.
OpenCV의 VideoCapture class는 동영상을 개별 Frame으로 하나씩 읽어들이는 기능을 제공한다.
VideoWrite는 VideoCapture로 읽어들인 개별 Frame을 동영상 파일로 Write를 수행한다.
cap = cv2.VideoCapture(video_input_path)
영상 Frame 너비 : cap.get(cv2.CAP_PROP_FRAME_WIDTH)
영상 Frame 높이 : cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
영상 FPS: cap.get(cv2.CAP_PROP_FPS )
실습
- OpenCV의 imread()는 RGB를 BGR로 변환하므로 원하지 않는 이미지가 출력됨
-
cv2_image = cv2.imread('/content/data/beatles01.jpg') plt.figure(figsize=(10, 10)) plt.imshow(cv2_image) plt.show()
cv2_image = cv2.imread('/content/data/beatles01.jpg')
draw_image = cv2.cvtColor(cv2_image, cv2.COLOR_BGR2RGB)
plt.figure(figsize=(10, 10))
plt.imshow(draw_image)
plt.show()
OpenCV 영상처리
import cv2
video_input_path = '/content/data/Night_Day_Chase.mp4'
video_output_path = '/content/data/Night_Day_Chase_out.mp4'
cap = cv2.VideoCapture(video_input_path)
# Codec은 *'XVID'로 설정.
codec = cv2.VideoWriter_fourcc(*'XVID')
vid_size = (round(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),round(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
vid_fps = cap.get(cv2.CAP_PROP_FPS )
vid_writer = cv2.VideoWriter(video_output_path, codec, vid_fps, vid_size)
frame_cnt = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
print('총 Frame 갯수:', frame_cnt, 'FPS:', round(vid_fps), 'Frame 크기:', vid_size)
총 Frame 갯수: 1383 FPS: 28 Frame 크기: (1216, 516)
import time
green_color=(0, 255, 0)
red_color=(0, 0, 255)
start = time.time()
index=0
while True:
hasFrame, img_frame = cap.read()
if not hasFrame:
print('더 이상 처리할 frame이 없습니다.')
break
index += 1
print('frame :', index, '처리 완료')
cv2.rectangle(img_frame, (300, 100, 800, 400), color=green_color, thickness=2)
caption = "frame:{}".format(index)
cv2.putText(img_frame, caption, (300, 95), cv2.FONT_HERSHEY_SIMPLEX, 0.7, red_color, 1)
vid_writer.write(img_frame)
print('write 완료 시간:', round(time.time()-start,4))
vid_writer.release()
cap.release()
코드를 살펴보면 cap.read()를 이용해 hasFrame 즉 다음 frame의 존재 여부를 알아내어 다음 frame이 존재할때 까지 반복문을 실행한다.
앞으로 진행할 object detection에서는 cap.read()를 통해 구해낸 img_frame을 이용하여 코딩에 활용될 예정이다.