본문 바로가기
Developer/OpenCV

[OpenCV] 이미지 / 비디오 파일 읽기

by Doony 2020. 1. 26.

얼마 전에 책을 한 권 구매했습니다. 파이썬으로 만드는 OpenCV 프로젝트라는 책인데, 예전에 못다한 영상처리에 대해 공부해보려고 합니다.


오늘은 가장 기초적인 부분으로, openCV 설치부터 이미지/비디오 파일을 읽어오는 방법에 대해 알아보겠습니다.


OpenCV 설치하기

  • 터미널을 열고, 아래 내용을 입력하면 설치가 완료됩니다.
    pip install opencv-contrib-python
    pip install opencv-python
    둘 중 아무거나 설치해도 기본 연습에는 지장이 없습니다.

이미지 파일 여는 예제

  • 이미지 파일을 여는 방법은 다음과 같습니다. 비교적 직관으로 코드를 이해할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import cv2
 
img_file = './sky.jpg'
save_file = './sky_gray.jpg'
 
img = cv2.imread(img_file, cv2.IMREAD_GRAYSCALE)
 
if img is not None:
    cv2.imshow('IMG', img)
    cv2.imwrite(save_file, img)
    cv2.waitKey()
    cv2.destroyAllWindows()
else:
    print('No image file')
cs
  • IMREAD_GRAYSCALE: 이미지를 흑백으로 여는 부분. 별도 지정하지 않으면 원본 색상 그대로 가져옵니다.
  • waitKey: 사용자의 키 인풋을 기다립니다. 인풋이 들어오면 다음 코드로 넘어가게 됩니다.

    비디오 파일 읽기 - 비디오 파일을 여는 방법도 이미지와 비슷합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import cv2
 
video_file = './bunny.mp4'
 
cap = cv2.VideoCapture(video_file)
if cap.isOpened():
    while True:
        ret, img = cap.read()
        if ret:
            cv2.imshow(video_file, img)
            cv2.waitKey(33)
        else:
            break
else:
    print('cannot open the file')
 
cap.release()
cv2.destroyAllWindows()
cs
  • ret: 객체 초기화를 확인하는 변수로, 잘 읽어왔다면 true를 반환합니다.
  • img: 각 프레임에 해당하는 이미지 변수 즉, 갖고 있는 동영상 프레임에 맞춰서 waitKey 내에 밀리초 단위로 프레임에 맞는 딜레이를 지정해줘야 동영상을 제대로 불러올 수 있습니다.

    노트북 카메라 영상을 가져오고 싶다면?

  • 노트북 또는 캠의 경우, 각각의 순서에 따라 0, 1, 2... 에 해당하는 인덱스 값을 가지고 있습니다. 원하는 캠 번호에 맞게 아래 코드에서 0 부분을 바꿔주면 됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import cv2
 
cap = cv2.VideoCapture(0)
if cap.isOpened():
    while True:
        ret, img = cap.read()
        if ret:
            cv2.imshow('camera', img)
            if cv2.waitKey(1!= -1:
                break
        else:
            print('no frame')
            break
else:
    print('cannot open the file')
 
cap.release()
cap.destroyAllWindows()
cs
  • cv2.waitKey(1) != -1: 1ms 동안 계속 인풋이 오는지를 체크합니다. 값이 들어온다면 종료할 수 있도록 합니다.

댓글