2강 OpenCV 프로그래밍 기초

양말신은도비·2022년 7월 2일
0

1. 영상 불러와서 출력하기

기본 함수

  • 영상 파일 불러오기
    cv2.imread(filename, flags=None)
    1. filename : 불러올 영상 파일 이름
      • 상대 경로 : 'cat.bmp'등
      • 절대 경로 : 'c:\cat.bmp'등
    2. flags : 영상 파일 불러오기 옵션
      • cv2.IMREAD_COLOR : BGR 컬러 영상으로 읽기
      • cv2.IMREAD_GRAYSCALE : 그레이스케일 영상으로 읽기
      • cv2.IMREAD_UNCHANGED : 영상 파일 속성 그대로 읽기
  • 영상 파일 저장하기
    cv2.imwrite(filename, img, params=None)
    1. filename : 저장할 영상 파일 이름 (문자열)
    2. img : 저장할 영상 데이터 (numpy.ndarray)
    3. params : 파일 저장 옵션 지정 (속성 & 값의 정수 쌍)
    4. retval : 정상적으로 저장하면 True, 실패하면 False
  • 새 창 띄우기 & 창 닫기
    cv2.namedWindow(winname, flags=None)
    1. winname: 창 고유 이름. 이 이름으로 창을 구분함.

    2. flags: 창 속성 지정 플래그
      - cv2.WINDOW_NORMAL : 영상 크기가 창 크기에 맞게 지정됨
      - cv2.WINDOW_AUTOSIZE : 창 크기가 영상 크기에 맞게 자동으로 변경됨 (기본값)

      cv2.destroyWindow(winname)
      cv2.destroyAllWindows()
    3. winname: 닫고자 하는 창 이름, 일반적인 경우 프로그램 종료 시 운영 체제에 의해 열려 있는 모든 창이 자동으로 닫힘

  • 창 위치 & 크기 지정
    cv2.moveWindow(winname, x, y)
    1. winname: 창 이름

    2. x, y: 이동할 위치 좌표

      cv2.resizeWindow(winname, width, height)
    3. winname: 창 이름

    4. width, height: 변경할 창 크기

  • 영상 출력하기
    cv2.imshow(winname, mat)
    1. winname: 영상을 출력할 대상 창 이름
    2. mat: 출력할 영상 데이터 (numpy.ndarray)
    3. 데이터 타입에 따른 출력 방식
      • uint8: 픽셀 값을 그대로 출력
      • uint16, int16: 픽셀 값을 255로 나눠서 출력
      • float32, float64: 픽셀 값에 255를 곱해서 출력
  • 키보드 입력 대기

실습

  • 코드
    import cv2
    import sys
    
    img = cv2.imread('cat.bmp') # cv2.IMREAD.GRAYSCALE => 흑백..
    
    # 이미지 불러오기에 실패했을 때를 대비한 예외 처리.
    if img is None:
        print('Image load Failed!!')
        sys.exit()
    
    # 파일 형식을 보자.
    print('type : ', type(img))
    print('shape: ', img.shape)
    print('dtype: ', img.dtype)
    
    cv2.namedWindow('image') # 이게 없이 imshow하면 없는거를 알고 알아서 만들어서 출력함. 
    cv2.imshow('image', img)
    
    # waitkey를 주지 않으면 프로그램이 꺼지면 꺼져서 번쩍하고 사라짐.
    cv2.waitKey()
    cv2.destroyAllWindows()
  • 결과
    type :  <class 'numpy.ndarray'>
    shape:  (480, 640, 3)
    dtype:  uint8

Matplotlib을 이용한 영상 출력

주의! ⇒ Matplotlib을 이용할 때는 RGB가 아닌 BRG로 입력이 되서 수정해줘야함!

  • 코드
    import matplotlib.pyplot as plt
    import cv2
    
    # 컬러 영상 출력
    imgBGR = cv2.imread('cat.bmp')
    imgRGB = cv2.cvtColor(imgBGR, cv2.COLOR_BGR2RGB)
    
    plt.axis('off')
    plt.imshow(imgRGB)
    plt.show()
    
    plt.imshow(imgBGR)
    plt.show()
    
    imgGray = cv2.imread('cat.bmp', cv2.IMREAD_GRAYSCALE)
    plt.axis('off')
    plt.imshow(imgGray, cmap='gray')
    plt.show()
    
    plt.subplot(121), plt.axis('off'), plt.imshow(imgRGB)
    plt.subplot(122), plt.axis('off'), plt.imshow(imgGray, cmap='gray')
    plt.show()
  • 결과
    • imgRGB
    • imgBRG
    • imgGray
    • imgRGB, imgGray

2. 비디오 불러와서 출력하기

기본 함수

  • 동영상, 정지 영상 시퀀스, 비디오 스트림 열기
    cv2.VideoCapture(filename, apiPreference=None)
    1. filename :

      • 비디오 파일 이름 (e.g. 'video.avi')
      • 정지 영상 시퀀스 (e.g. 'img_%02d.jpg')
      • 비디오 스트림 URL (e.g. 'protocol://host:port/script?params|auth')
    2. apiPreference: 선호하는 동영상 처리 방법을 지정

      cv2.VideoCapture.open(filename, apiPreference=None)
  • 카메라 열기
    cv2.VideoCapture(index, apiPreference=None)
    1. index : cameraid + domain_offset (CAP*) id

      • camera_id == 0 이면 시스템 기본 카메라
      • domain_offset == 0 이면 auto detect.
      • 기본 카메라를 기본 방법으로 열려면 index에 0을 전달.
    2. apiPreference: 선호하는 카메라 처리 방법을 지정

      cv2.VideoCapture.open(index, apiPreference=None)
  • 준비 확인
    cv2.VideoCapture.isOpened()
  • 프레임 받아오기
    cv2.VideoCapture.read(image=None)

실습

  • 코드
    cap = cv2.VideoCapture('vtest.avi')
    
    if not cap.isOpened():
        print('Camera open Failed')
        sys.exit()
    
    while True:
        ret, frame = cap.read()
        
        print('Frame width:', round(cap.get(cv2.CAP_PROP_FRAME_WIDTH)))
        print('Frame height:', round(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
        
        if not ret:
            break
    
        edge = cv2.Canny(frame, 50, 150)
        cv2.imshow('frame', frame)
        cv2.imshow('edge', edge)
        if cv2.waitKey(30) == 27:
            break
        
    cap.release()
    cv2.destroyAllWindows()
  • 결과

0개의 댓글