OpenCV_1) OpenCV와 Mat클래스

한우진·2023년 4월 26일
0

OpenCV

목록 보기
1/1
post-thumbnail

OpenCV

  • 영상 처리와 컴퓨터 비전을 위한 오픈 소스 라이브러리(BSD 라이선스)
  • C, C++, Python, Java 등 여러 언어에서 사용 가능
  • 대부분의 운영체제 지원(Linux, Windows, Mac OS, Android)
  • 이미지와 비디오 처리, 객체 추적, 얼굴 인식, 모션 감지 등의 다양한 기능을 제공
  • 자율 주행 분야에서도 카메라를 이용한 차선 인식, 신호 인식, 장애물 탐지 등에 사용
  • 머신러닝 모델과 연동해 이미지 분류, 객체 인식, 얼굴 인식 등의 작업 수행

OpenCV 버전

1.x

  • OpenCV의 초기 버전으로, 2000년대 초반에 개발
  • C 라이브러리로 구현되어 있으며, 기본적인 영상 처리 기능을 제공

2.x

  • 2010년대 초반에 출시
  • C++로 구현, 다양한 기능 추가 Python, Java 등의 언어도 지원

3.x

  • 2010년대 후반에 출시
  • OpenCL, CUDA 등의 기술을 활용하여 GPU 가속화를 지원
  • 특징점 추출 알고리즘과 관련 기능이 보강 및 추가 됨

4.x

  • 2019년에 출시된 최신 버전
  • C++11 및 C++14 표준을 지원
  • 이전 버전에 비해 빠른 속도와 개선된 딥러닝 모듈, 향상된 성능, Python과의 연동성 등이 강화
  • 딥러닝 모델과의 통합이 가능(Yolo 등)

기본 자료구조 및 픽셀 접근

MAT

  • 영상 및 이미지 데이터를 저장하는 행렬(Matrix) 클래스
  • 여러 차원의 배열로 이루어져 있으며 한 픽셀 당 여러 채널(RGB, BGR, Grayscale 등)의 정보를 가지고 있음
  • C++로 구현되어 있으며 이미지 및 비디오 데이터를 처리할 때 매우 편리하게 사용 가능
  • 행렬 연산, 원하는 채널의 추출 및 변경, ROI(Region of Interest = 관심영역)의 추출 등 다양한 기능을 제공
  • 메모리 자동으로 할당하며 생성 시 크기, 데이터 타입, 초기화 값 등을 설정할 수 있다
  • 이미지 파일에서 데이터를 읽어와 Mat 형태로 편환하거나 Mat 형태의 데이터를 이미지 파일로 저장할 수 있음
  • 영상을 흑백 이미지로 변환하거나 이미지에서 특정 색상의 물체를 검출하는 작업에서 사용

픽셀 타입

  • BGR(default)
  • GRAYSCALE
  • HSV
  • YUV ..

데이터 선언 방법

Mat M;
Mat M(rows, colums, pixel_type);
Mat M(rows, colums, pixel_type, initial_value);
Mat M(Size(width, height), pixel_type, initial_value);

예시

Mat data(1, 3, CV_32FC1);

3개의 요소를 가진 1차원 행렬 데이터 타입은 32비트 실수형(Float)

Mat img(240, 320, CV_8UC1);

320x240 크기의 흑백 이미지를 저장하기 위한 1채널 Grayscale 데이터 타입의 Mat 객체를 생성

Mat img(240, 320, CV_8UC3); 

320x240 크기의 컬러 이미지를 저장하기 위한 3채널 BGR 데이터 타입의 Mat 객체를 생성

Mat video(240, 320, CV_8UC3, Scalar(0, 0, 0));

320x240 크기의 3채널(BGR) 동영상을 저장하기 위한 Mat 객체를 생성
Scalar(0, 0, 0)은 초기화 값으로 검은색을 지정, video.at(i, j)[0]은 i번째 프레임에서 j행 j열의 Blue 채널 픽셀 값

위 이미지 처럼 Mat 데이터를 선언하고 초기화해서 값을 지정해줄 수 있다. 픽셀의 사이즈를 설정해주고 컬러의 데이터 타입을 지정하며 1채널이면 1개의 Scale 값을 3채널이면 3종류의 Scale 값을 설정해서 원하는 크기 원하는 색상을 설정할 수 있다


함수 정리

생성자 함수

  • Mat() : 빈 Mat 객체를 생성
  • Mat(int rows, int cols, int type): rows x cols 크기의 type 데이터 타입 행렬을 생성
  • Mat(Size size, int type): size 크기의 type 데이터 타입 행렬을 생성
  • Mat(int ndims, const int* sizes, int type): ndims 차원을 가진 sizes 배열 크기의 type 데이터 타입 행렬을 생성

초기화 함수

  • zeros(Size size, int type): 모든 요소를 0으로 초기화하는 size 크기의 type 데이터 타입 행렬을 생성
  • ones(Size size, int type): 모든 요소를 1로 초기화하는 size 크기의 type 데이터 타입 행렬을 생성
  • eye(int rows, int cols, int type): 대각 요소를 1로 초기화하고 나머지 요소를 0으로 초기화하는 rows x cols 크기의 type 데이터 타입 행렬을 생성

그리기 함수

  • rectangle(Mat& img, Point pt1, Point pt2, const Scalar& color, int thickness, int lineType, int shift=0): pt1, pt2 좌표를 꼭짓점으로 하는 사각형을 img Mat 객체에 그림
    • thickness : 선의 두께
    • color : 사각형 색상
    • lineType : 선의 타입(LINE_4, LINE_8, LINE_AA 등)
    • shift : 좌표 비트 시프트
img = cv2.rectangle(img, (100, 100), (300, 500), (0, 255, 0), 3) 
  • circle(Mat& img, Point center, int radius, const Scalar& color, int thickness, int lineType, int shift=0): center 좌표를 중심으로 하고 radius 크기의 원을 img Mat 객체에 그림
img = cv2.circle(img, (300, 400), 100, (0, 0, 255), 2) 
  • line(Mat& img, Point pt1, Point pt2, const Scalar& color, int thickness, int lineType, int shift=0): pt1에서 pt2까지의 직선을 img Mat 객체에 그림
img = cv2.line(img, (511, 511), (255, 0, 0), 5) 
  • putText(Mat& img, const String& text, Point org, int fontFace, double fontScale, const Scalar& color, int thickness, int lineType, bool bottomLeftOrigin=false): org 좌표에서 시작하여 text 문자열을 img Mat 객체에 출력
    • fontFace : 글꼴 타입
    • bottomLeftOrigin : true로 하면 org 좌표를 문자열 왼쪽 아래로 지정
img = cv2.putText(img, 'Test,(10, 50), cv2.FONT_HERSHEY_SIMPLEX, 4, (255, 255, 255))

기타 함수

  • at(): 지정된 위치의 요소에 대한 참조를 반환
  • size(): 행렬의 크기를 반환
  • resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR); : 원본 이미지를 새로운 크기로 변환하여 반환, 변환된 이미지는 새로운 Mat 객체에 저장
  • type(): 행렬의 데이터 타입을 반환
  • channels(): 행렬의 채널 수를 반환

0개의 댓글