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(): 행렬의 채널 수를 반환