import cv2
import numpy as np

이미지 읽기

cv2.imread(filename [, flag])

img = cv2.imread(filename, cv2.IMREAD_COLOR) 첫번째 인자에는 이미지 파일을, 두번째 인자에는 이미지 파일을 읽는 방식을 나타내는 플래그를 나타냄. flag는 대표적으로 3가지를 자주 사용함
1. cv2.IMREAD_COLOR : 컬러이미지 로드, 이미지의 투명한 부분(알파채널)은 모두 무시됨. 디폴트 플래그로 정수값은 1
2. cv2.IMREAD_GRAYSCALE : 흑백이미지 로드. 정수값은 0
3. cv2.IMREAD_UNCHANGED : 알파채널을 포함하여 이미지 '그대로' 로드. 정수값은 -1
cv::ImreadModes 참고

cv2.imshow(winname, mat)

cv2.imshow('Show Image', img) imread에 의해 반환된 이미지 객체 img를 화면에 나타내기 위한 함수로 첫번째 인자에는 사진을 나타내는 윈도우의 이름, 두번째 인자에는 화면에 표시할 이미지 객체를 넣어주면 된다.

cv2.waitKey( [, delay])

cv2.waitKey(0) 이 함수는 지정된 시간 동안 키보드 입력을 기다리는 함수이다. 인자로는 키보드 입력을 기다리는 시간으로 1/1000ms 단위를 나타낸다. 즉, cv2.waitKey(5)는 5ms 동안 키보드 입력을 대기한다는 의미이다. 단, cv2.waitKey(0)는 키보드 입력이 있을 때까지 계속해서 기다리게 된다. 이 함수의 리턴값은 사용자가 누른 키보드 값이다. 만약 ESC값을 눌렀다면 cv2.waitKey()는 27를 리턴하게 된다

cv2.destroyAllWindows()

cv2.destroyAllWindows() 이 함수는 우리가 생성한 모든 윈도우를 제거한다.

def showImage_color(img_file):
    img = cv2.imread(img_file, cv2.IMREAD_COLOR)
    cv2.imshow('Show Image', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

def showImage_gray(img_file):
    img = cv2.imread(img_file, cv2.IMREAD_GRAYSCALE)
    cv2.imshow('Show Image', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

def showImage_with_alpha_channel(img_file):
    img = cv2.imread(img_file, cv2.IMREAD_UNCHANGED)
    cv2.imshow('Show Image', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

이렇게 각각 서로 다른 플래그로 만든 세 함수, showImage_color, showImage_gray, showImage_with_alpha_channel를 이용해 사진을 출력하게 되면 사이즈 조절이 되지 않는 고정된 이미지가 출력되게 된다. 만약 크기 조절이 가능한 이미지를 출력하고 싶으면 cv2.namedWindow()를 이용해 이미지가 표시될 창의 성격을 지정해주어야 한다.

 


cv2.namedWindow(winname [, flags])

cv2.namedWindow('Show Image', cv2.WINDOW_NORMAL) 첫번째 인자에는 사진을 나타내는 윈도우의 이름을, 두번째 인자에는 나타나는 윈도우의 성격을 지정해주면 된다. 이때 주의할 점은 ★ cv2.namedWindow에서 지정한 winname과 cv2.imshow에서 지정한 winname 윈도우 타이틀이 동일해야 namedWindow에서 지정한 flag의 성격이 반영된다는 점이다.

대표적인 flag에는 다음 두가지가 있다.
1. cv2.WINDOW_NORMAL : 원본 이미지 크기로 윈도우 생성. 이미지 크기 조절 가능 
2. cv2.WINDOW_AUTOSIZE : 원본 이미지 크기로 윈도우를 생성. 이미지 크기 조절 불가능
cv::WindowFlags 참고

def showImage_scale_adjustment(img_file):
    img = cv2.imread(img_file, cv2.IMREAD_COLOR)
    cv2.namedWindow('Show Image with scale adjustment', cv2.WINDOW_NORMAL | cv2.WINDOW_KEEPRATIO)
    cv2.imshow('Show Image with scale adjustment', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

 


cv2.imwrite(filename, img [, params])

cv2.imwrite(store_img_file_name, img) 이미지를 저장하는 함수

우선 아래의 코드를 보자. waitKey(0)는 사용자가 키보드로 입력할 때까지 이미지를 띄워주는 함수로 사용자가 누른 키보드 값을 반환한다고 했다. 0xFF를 &(bit operator) 연산한 이유는 운영체제가 64비트이기 때문이다. 32비트 운영체제라면 & 0xFF 연산할 필요가 없다. 만약 아스키 코드 값이 27인 ESC를 누르면 그냥 윈도우 창을 종료하고, 'c'를 누르면 기존의 이미지 파일 이름에 _copy를 붙여 복사본을 만든다.

참고 : ord('c') 함수는 해당 문자의 아스키 코드 값을 반환한다. ord('c') == 99
참고 : chr(99) 함수는 해당 아스키 코드 값을 가진 문자를 반환한다. chr(99) == 'c'

def store_image(img_file):
    img = cv2.imread(img_file, cv2.IMREAD_COLOR)
    cv2.imshow('Show Image', img)
    
    k = cv2.waitKey(0) & 0xFF
    if k == 27:
        cv2.destroyAllWindows()
    elif k == ord('c'):
        img_file = img_file[:-4]
        store_img_file_name = img_file + "_copy.jpg"
        print(store_img_file_name)
        cv2.imwrite(store_img_file_name, img)
        cv2.destroyAllWindows()  

 

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기