본문 바로가기
OpenCV[Computer Vision]

OpenCV 이미지 및 동영상 읽기[OpenCV]

by cellin 2024. 1. 2.

OpenCV 이미지 및 동영상 읽기[OpenCV]

 

 

 

 

 

이미지 읽기

 

OpenCV를 사용해서 이미지를 화면에 표시

 

# 이미지 파일_화면 표시

import cv2

img_file = "../img/img1.jpg" # 이미지 경로           
img = cv2.imread(img_file)    # 이미지 읽어서 img 변수에 할당

if img is not None:
  cv2.imshow('IMG', img)      # 읽은 이미지를 화면에 표시    
  cv2.waitKey()               # 키 입력될 때 까지 대기   
  cv2.destroyAllWindows()     # 창 닫기       
else:
    print('No image file.')
    
 

 

 

 

cv2.imread() 함수로 이미지를 읽어 온다

img = cv2.imread(img_file) # 이미지 읽어서 img 변수에 할당
 

 

cv2.imshow() 함수는 읽어 온 이미지를 화면에 표시한다

cv2.imshow('IMG', img) # 읽은 이미지를 화면에 표시
 

 

cv2.imread()

- 파라미터로 cv2.IMREAD_GRAYSCALE을 전달하면 흑백 이미지로 불러옵니다

- cv2.imread(path, flag)

  • path: 이미지 파일 경로
  • flag: 이미지를 어떻게 읽을지 방식 설정
  • - cv2.IMREAD_COLOR(기본값): 색깔 이미지로 불러옵니다. (이때 투명도(alpha값)는 무시)
  • - cv2.IMREAD_GRAYSCALE: 이미지를 흑백톤으로 불러옴
  • - cv2.IMREAD_UNCHANGED: 투명도(alpha값)를 포함해 이미지를 그대로 불러옴

 

# 이미지 파일_화면 표시

import cv2

img_file = "../img/img1.jpg"           
img = cv2.imread(img_file, cv2.IMREAD_GRAYSCALE)    # 회색으로 읽기

if img is not None:
  cv2.imshow('IMG', img)     
  cv2.waitKey()              
  cv2.destroyAllWindows()     
else:
    print('No image file.')
    
 

 

 

 

이미지 저장하기

cv2.imread() 함수를 호출하면 읽은 사진 파일이 img라는 변수에 담기며

cv2.imwrite() 함수를 호출하면 img 변수에 담긴 사진 파일을 자신의 PC에 저장가능하다.

# 이미지 저장하기

import cv2

img_file = '../img/img1.jpg'
save_file = '../img/img1-1.jpg'

img = cv2.imread(img_file, cv2.IMREAD_GRAYSCALE)
cv2.imshow(img_file, img)
cv2.imwrite(save_file, img) #파일로 저장, 포맷은 확장에 따름
cv2.waitKey()
cv2.destroyAllWindows()
 

img 디렉토리에 img1-1.jpg라는 회색 사진이 생성된다

 

 

 

 

 

동영상 파일 읽기

# 동영상 파일 읽기 (video_play.py)

import cv2

video_file = "../img/big_buck.avi" # 동영상 파일 경로

cap = cv2.VideoCapture(video_file) # 동영상 캡쳐 객체 생성  
if cap.isOpened():                 # 캡쳐 객체 초기화 확인
    while True:
        ret, img = cap.read()      # 다음 프레임 읽기    
        if ret:                     # 프레임 읽기 정상
            cv2.imshow(video_file, img) # 화면에 표시 
            cv2.waitKey(25)            # 25ms 지연(40fps로 가정)   
        else:                       # 다음 프레임 읽을 수 없슴,
            break                   # 재생 완료
else:
    print("can't open video.")      # 캡쳐 객체 초기화 실패
cap.release()                       # 캡쳐 자원 반납
cv2.destroyAllWindows()
 

cv2.VideoCapture(video_file)을 통해 동영상 파일인 video_file의 첫 프레임 읽어 캡처 객체 cap에 저장

(**동영상의 첫 프레임만 담기게된다)

초기화가 잘 되었다면 True를 반환하고, 그렇지 않으면 False를 반환

연속해서 파일의 프레임을 읽어오기 위해 무한루프로 cap.read()를 호출

 

imshow의 첫 번째 인자인 video_file은 화면에 나타나는 창의 제목이고, 두 번째 인자인 img는 화면에 표시할 프레임 이미지 객체

 

 

 

 

웹캠 프레임 읽기

# 카메라(웹캠) 프레임 읽기

import cv2

cap = cv2.VideoCapture(0)               # 0번 카메라 장치 연결 
if cap.isOpened():                      # 캡쳐 객체 연결 확인
    while True:
        ret, img = cap.read()           # 다음 프레임 읽기
        if ret:
            cv2.imshow('camera', img)   # 다음 프레임 이미지 표시
            if cv2.waitKey(1) != -1:    # 1ms 동안 키 입력 대기 ---②
                break                   # 아무 키라도 입력이 있으면 중지
        else:
            print('no frame')
            break
else:
    print("can't open camera.")
cap.release()                           # 자원 반납
cv2.destroyAllWindows()
 

v2.VideoCapture()은 인자로 동영상 파일 경로를 입력할 수도 있지만 카메라 장치 번호를 입력[웹캠이 하나밖에 없다면 인자로 0]

 

cv.waitKey(1) != -1 코드에서 사용자가 아무 키나 누르면 break가 되어 루프를 빠져나옴

 

 

 

웹캠으로 사진 찍기

# 웹캠으로 사진찍기 

import cv2

cap = cv2.VideoCapture(0)                       # 0번 카메라 연결
if cap.isOpened() :
    while True:
        ret, frame = cap.read()                 # 카메라 프레임 읽기
        if ret:
            cv2.imshow('camera',frame)          # 프레임 화면에 표시
            if cv2.waitKey(1) != -1:            # 아무 키나 누르면
                cv2.imwrite('photo.jpg', frame) # 프레임을 'photo.jpg'에 저장
                break
        else:
            print('no frame!')
            break
else:
    print('no camera!')
cap.release()
cv2.destroyAllWindows()
 

cv2.imwrite() 함수를 활용하여 특정 프레임을 저장

 

 

 

 

 

웹캠으로 녹화하기

# 웹캠으로 녹화하기 

import cv2

cap = cv2.VideoCapture(0)    # 0번 카메라 연결
if cap.isOpened:
    file_path = './rec.avi'    # 저장할 파일 경로 이름 
    fps = 30.0                     # FPS, 초당 프레임 수
    fourcc = cv2.VideoWriter_fourcc(*'DIVX') # 인코딩 포맷 문자
    width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
    height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
    size = (int(width), int(height))                        # 프레임 크기
    out = cv2.VideoWriter(file_path, fourcc, fps, size) # VideoWriter 객체 생성
    while True:
        ret, frame = cap.read()
        if ret:
            cv2.imshow('camera-recording',frame)
            out.write(frame)                        # 파일 저장
            if cv2.waitKey(int(1000/fps)) != -1: 
                break
        else:
            print("no frame!")
            break
    out.release()                                   # 파일 닫기
else:
    print("can't open camera!")
cap.release()
cv2.destroyAllWindows()
 

cv2.VideoWriter() 함수를 사용하여 여러 프레임을 동영상으로 저장

 

cv2.VideoWriter(file_path, fourcc, fps, (width, height))

- file_path는 동영상 파일을 저장할 경로

- fourcc는 동영상 인코딩 형식(codec 정보)

- fps는 초당 저장될 프레임 수

- (width, height)는 프레임의 너비와 높이

 

cap.get()은 동영상이나 카메라의 속성을 확인하는 함수

cv2.CAP_PROP_FRAME_WIDTH는 프레임 너비

cv2.CAP_PROP_FRAME_HEIGHT는 프레임 높이를 뜻

cap.get(cv2.CAP_PROP_FRAME_WIDTH)은 cap 객체의 프레임 너비를 반환

 

FPS(Frames Per Second)는 초당 프레임 수를 뜻하며 지연 시간은 FPS를 활용하여 구할 수 있음

1000으로 계산하는 이유는 1초(1s)가 1,000밀리 초(1,000ms)이기 때문

코드에서 지연 시간을 cv2.waitKey(int(1000/fps))로 설정

 

** 실행한 뒤 아무 키나 누르면 키를 누르기 전까지 모든 프레임이 rec.avi라는 동영상으로 저장

 

 

 

사진: UnsplashBen Kolde

728x90
반응형