Sun.El Data Analysis

[OpenCV] 이미지/동영상 읽기 및 저장 본문

Deep Learning

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

Sun.El 2023. 8. 21. 23:32
728x90
OpenCV(Computer Vision)
다양한 영상(이미지)나 동영상 처리에 사용되는 오픈소스 라이브러리


1. 설치방법

pip install opencv-python

 

2. image 파일

  2.1 image 출력

[IN]

import cv2 #OpenCV 불러오기
img = cv2.imread('./img/panda.jpg')  # 해당 경로의 파일을 읽어옴
cv2.imshow('panda', img)  #panda라는 이름의 창에 img를 표시
key = cv2.waitKey(0) #지정된 시간(millisecond)동안 사용자 키 입력 대기(아무키나 누르면 꺼짐), 0-무한대기
print(key) #esc시 입력시 ===> 27(아스키코드값) 출력
cv2.destroyAllWindows() #모든창 닫기

 

  2.2 이미지 읽기

cv2.imread([파일경로], [읽기옵션])
[읽기옵션]
cv2.IMREAD_COLOR : 컬러(BGR) 스케일, 기본값 1
cv2.IMREAD_UNCHANGED : 파일에 저장된 스케일, 기본값 -1
cv2.IMREAD_GRAYSCALE : 그레이 스케일, 0

 

[IN]

import cv2 #OpenCV 불러오기
img_color = cv2.imread('./img/panda.jpg',cv2.IMREAD_COLOR) #cv2.IMREAD_COLOR = 1
img_unchanged = cv2.imread('./img/panda.jpg',cv2.IMREAD_UNCHANGED) #cv2.IMREAD_UNCHANGED = -1
img_grayscaled = cv2.imread('./img/panda.jpg',cv2.IMREAD_GRAYSCALE) #cv2.IMREAD_GRAYSCALE = 0

cv2.imshow('panda_color', img_color) #panda_color라는 이름의 창에 img_color를 표시
cv2.imshow('panda_unchanged', img_unchanged)
cv2.imshow('panda_grayscaled', img_grayscaled)
img.shape

cv2.waitKey(0)
cv2.destroyAllWindows()

[OUT]

(853, 1280, 3) #가로, 세로, 채널(3: 컬러)

 

  2.3 이미지 저장하기

[IN]

img_file = './book/img/girl.jpg'
save_file = './book/img/girl_gray_save.jpg'
img = cv2.imread(img_file, cv2.IMREAD_GRAYSCALE)

if img is not None:
    cv2.imshow('IMG',img)
    cv2.imwrite(save_file, img) #cv2.imwrite 이미지 저장
    cv2.waitKey(0)
    cv2.destroyAllWindows()
else:
    print('No Image file.')

 

3. 영상 파일

  3.1 동영상 파일 읽기

[IN]

import cv2
video_file = './book/img/big_buck.avi'
cap = cv2.VideoCapture(video_file) #cv.Video 비디오 파일 읽기

if cap.isOpened():
    fps = cap.get(cv2.CAP_PROP_FPS) #비디오 파일의 프레임 수 구하기
    delay = int(1000/fps)
    print("FPS: %f, delay: %ddms" %(fps, delay))
    while True:
        ret, img = cap.read() #cap.read() 비디오의 한 프레임씩 읽음, 성공 여부에 따라 ret = True/False, img에 읽은 프레임 수 입력
        if ret:
            cv2.imshow(video_file, img)
            cv2.waitKey(25)
        else:
            break
else:
    print("can't open vido.")

cap.release() #자원 반납
cv2.destroyAllWindows() #모든 창 닫기

 

 

  3.2 카메라 구동 → 캡쳐 후 저장

[IN]

import cv2
cap = cv2.VideoCapture(0) #카메라 0번 장치 연결
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH) #프레임 폭 값 구하기
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT) #프레임 높이 값 구하기
print("Original width : %d, height : %d" % (width, height))

cap.set(cv2.CAP_PROP_FRAME_WIDTH, 320) #프레임 폭 설정
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 240) #프레임 높이 설정
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH) #재지정한 프레임 폭 값 구하기
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT) #재지정한 프레임 높이 값 구하기
print("Resized width : %d, height : %d" % (width, height))

if cap.isOpened(): #cap 객체가 지정한 파일로 정상적으로 초기화되었는지 확인하는 코드
    while True:
        ret, img = cap.read() 
        if ret:
            cv2.imshow('camera', img) #프레임 화면에 표시
            if cv2.waitKey(1) != -1: #아무키나 누르면 빠져나옴
				cv2.imwrite('./img/photo.jpg', frame) #프레임을 photo.jpg로 저장
                break
        else:
            print('no frame!')
            break
else:
    print("can't open camera!")
    
cap.release()
cv2.destroyAllWindows()

 

 

  3.3 카메라 녹화 → 저장

[IN]

import cv2
cap = cv2.VideoCapture(0) #카메라 0번 장치 연결

if cap.isOpened(): #cap 객체가 지정한 파일로 정상적으로 초기화되었는지 확인하는 코드
    file_path = './img/record.avi' #저장할 파일 경로
    fourcc = cv2.VideoWriter_fourcc(*'DIVX') #인코딩 포맷 문자
    fps = 30.0 #fps, 초당 프레임 수
    
    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.waitKey(1) #지연시키고 싶은 시간, 단위 milisecond