#03-1. OpenCV

OpenCV 개요

  • 오픈소스로 개발되고 있는 CV및 ML 라이브러리 → KNN, SVM, DNN 등 포함
  • Open Source Computer Vision Library
  • 기본적인 영상 파일 입출력, 영상 화질 향상, 객체 검출 및 인식, 추적, 3차원 비전 문제 해결 등 기능 제공
  • 기본적으로 C/C++ 언어로 작성 + Python, Java, Matlab, JS 인터페이스 제공
  • 다양한 운영체제, 모바일 환경도 지원
  • 대부분의 기능은 병렬 처리로 동작 → CPU 특화 명령어(MMX, SSE, AVX, NEON) 지원 → CUDA, OpenCL을 통한 GPU 활용 지원
  • BSD License 를 따르고 있음 → 학계 연구용, 상업용 자유롭게 사용 가능
  • OpenCV 소스코드 일부 사용하여 프로그램 개발 가능

OpenCV 역사

  • 1999년 인텔에서 개발된 IPL 기반으로 시작
  • 2000년 일반에 공개되어 오픈소스로서 개발이 진행
  • 2006년 OpenCV 1.0버전 정식 배포
    • 많은 비전 알고리즘이 주로 구조체와 함수로 구현
    • 영상은 IplImage(IPLIMAGE)라는 이름의 구조체를 이용하여 표현
    • C언어 기반으로 구현
  • 2009년 OpenCV 2.0 발표
    • C언어 대신 C++ 인터페이스 채택
    • Mat라는 이름의 클래스 사용 → 영상 데이터 표현 시작
    • C++ 클래스 사용 → 메모리 관리 수월, 소스코드 작성 편리
  • 2015년 6월 OpenCV 3.0 발표
    • OpenCL 사용성 크게 확대한 T_API 지원
    • 유료로 사용해야했던 인텔 IPP 라이브러리 일부를 OpenCV에서 무료로 사용 가능
  • 2017년 8월 OpenCV 3.3 발표
    • 최신 C++11 문법 지원
    • 심층 신경망 지원하는 DNN 모듈이 기본 소스에 포함되기 시작
  • 2018년 11월 OpenCV 4.0 발표
    • DNN 모듈 기능 강화 : AlexNet, Inception v2
    • C++ 11/14/17 지원

OpenCV 모듈

  • OpenCV 라이브러리 : 다수의 module로 구성 → 다양한 클래스와 함수를 기능과 성격에 따라 모아서 만들어놓은 부분 라이브러리
  • 문제해결 과정
    1. 영상 입출력

      core, videoio, imgcodecs

    2. 전처리

      imgproc, photo

    3. 특징 추출

      imgproc, features2d

    4. 객체 검출, 영상 분할

      imgproc, objdetect

    5. 분석 : 객체 인식, 포즈 추정, 움직임 분석, 3D 재구성

      calib3d, video, stitching, ml, dnn

    6. 화면 출력, 최종 판단

      highgui, ml, dnn

  • 하위호환성 제공 X
  • 질문/답변 포럼 : http://answers.opencv.org/questions/

이미지 불러오기

  • imread() 함수
    import cv2 as cv
    img = cv.imread('lenna.bmp')   # 배열
    if img is None:
    		print('Image load failed!')
    		exit()
    cv.imshow('image', img)
    cv.waitKey()   # 결과물을 보여주고 자동적으로 창 닫지 않음
  • Mat imread(const String& filename, int flags = IMREAD_COLOR);
    • flags : 영상 파일을 불러올 때 사용할 컬러모드와 영상 크기 지정
    • EXIF에 저장된 방향 정보 : 가로로 찍었는지 세로로 찍었는데

OpenCV 주요 함수

  • bool imwrite(const String&

#03-2. Matrix 연산

이미지 타입 확인하기

  • 이미지 불러오기
    img1 = cv.imread('cat.bmp', cv.IMREAD_GRAYSCALE)
    //옵션없으면 원본 그대로
  • 타입 확인하기
    print('type(img):', type(img))
    # type(img1): <class 'numpy.ndarray'>
    print('img.shape : ', img.shape)
    # img1.shape :  (1666, 1666)
    
    if len(img.shape) == 2:   # 영상 타입 확인
        print('grayscale image')

부분 행렬 추출

  • 색상 반전 : 255-원래값
    img2 = 255 - img2   # reassign 원본 변경 X
    img2[:, :] = 255 - img2   # 참조해주는 곳에 할당, 원본 변경 O
img2 = img[200:400, 200:400]   # shallow copy
img3 = img[200:400, 200:400].copy()   # deep copy
img2 += 20   #Broadcasting
cv.imshow('img', img)   # 밝아짐
cv.imshow('img2', img2)   # 부분 밝아짐
cv.imshow('img3', img3)   # 원본
profile
숭실대학교 컴퓨터학부 21

0개의 댓글