본문 바로가기

IT/Python

【OpenCV 4】Day1_기초 사용법

 

OpenCV 공식 사이트 주소https://opencv.org
 

Home - OpenCV

OpenCV provides a real-time optimized Computer Vision library, tools, and hardware. It also supports model execution for Machine Learning (ML) and Artificial Intelligence (AI).

opencv.org

https://github.com/sunkyoo/opencv4cvml/tree/master/python

 

GitHub - sunkyoo/opencv4cvml: "OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝" (길벗, 2019) 책 소스 코드입니

"OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝" (길벗, 2019) 책 소스 코드입니다. - GitHub - sunkyoo/opencv4cvml: "OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝" (길벗, 2019) 책 소스 코드입니다.

github.com

https://sunkyoo.github.io/opencv4cvml/

 

『OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝』

예제 소스 코드는 아래 링크를 참고하세요

sunkyoo.github.io

기초 사용법

%pwd
--> Out :  %pwd %pwd 'C:\\Users\\____\\Python_jupyter\\Untitled Folder'

 

BMP  파일 영상을 화면에 출력하는 소스코드

import cv2

img = cv2.imread('./data/lenna.bmp')
print(img.shape)

cv2.namedWindow("image")
cv2.imshow("image", img)

## 종료조건
cv2.waitKey()
cv2.destroyAllWindows()
--> Out : 

결과 이미지

영상 파일 읽기 및 화면 표시

  1. './data/lena.jpg'파일을 읽어 들여서 컬러로 화면에 표시하고 키보드에서 아무 키나 누르면 윈도우가 사라지도록 하라
  2. './data/lena.jpg' 파일을 읽어 들여서 흑백으로 화면에 표시하고 키보드에서 아무 키나 누르면 윈도우가 사라지도록 하라
import cv2

imgFile = './data/lena.jpg'
# OpenCV의 imread() 함수를 사용하여 lenna.bmp파일을 읽어와서 img 변수에 저장
imgColor = cv2.imread(imgFile, cv2.IMREAD_COLOR)
imgGray  = cv2.imread(imgFile, cv2.IMREAD_GRAYSCALE)

cv2.imshow("Lene Color", imgColor)
cv2.imshow("Lene Gray", imgGray)
# imshow() 함수는 영상보여주기를 의미합니다


## 종료조건
cv2.waitKey() # waitKey() 함수는 키보드의 입력을 기다리는 함수
cv2.destroyAllWindows()
--> Out : 

 

 


주요 함수

imread(const String& filename, int flags = IMREAD_COLOR)
영상 파일을 불러올때 사용
・filename - 불러올 영상 파일이름
・flags - 영상 파일 불러오기 옵션 플래그, ImreadModes 열거형 상수를 지정합니다.
・반환값 - 불러온 영상데이터

ImreadModes 상수
・IMREAD_UNCHANGED - 입력 파일에 지정된 그대로의 컬러 속성을 사용합니다.
투명한 PNG 또는 TIFF파일의 경우, 알파 채널까지 이용하여 4채널 영상으로 불러 옵니다.
・ IMREAD_GRAYSCALE - 1채널 그레이스케일 영상으로 변환
・ IMREAD_COLOR - 3채널 BGR 컬러 영상으로 변환
・ IMREAD_REDUCED_GRAYSCALE_2 - 크기를 1/2로 줄인 1채널 그래이스케일 영상으로 변환
・ IMREAD_REDUCED_COLOR_2 - 크기를 1/2로 줄인 3채널 BGR영상으로 변환
・ IMREAD_IGNORE_ORIENTATION - EXIF에 저장된 방향 정보를 사용하지 않습니다

bool imwrite(const String & filename, inputArray img, const std::vector<int>& params = std::vector<int>());
객체에 저장되어있는 영사아데이터를 파일로 저장
・filename - 불러올 영상 파일이름
・img - 저장할 영상 데이터
・params - 저장할 영상파일 형식에 의존적인 파라미터
・반환값 -  정상적으로 저장하면 true, 실패하면 false를 반환

void namedWindow(const String& winname, int flags = WINDOW_AUTOSIZE);
클래스 객체에 저장되어 있는 영상 데이터를 화면에 나타나기 위해서는 먼저 영상 출력을 위한 빈 창을 생성
・winname - 영상 출력 창 상단에 출력되는 창 고유의 이름
・flags - 생성되는 창의 속성을 지정하는 플래그, WindowFlags 열거형 상수를 지정

WindowFlags 상수
WINDOW_NORMAL -  영상 출력 창의 크기에 맞게 영상크기가 변경되어 출력, 사용자가 자유롭게 창크기를 변경가능
WINDOW_AUTOSIZE - 출력하는 영상크기에 맞게 창 크기가 자동으로 변경, 사용자가 임으로 창크기를 변경할 수 없다.
WINDOW_OPENGL - OpenGL을 지원

void destroyWIndow(const String& winname);
하나의 창을 닫을 경우에 사용
・winname - 소멸시킬 창이름

void destroyAllWIndows();
열려있는 모든 창을 닫을 경우에 사용.

void moveWindow(const String& winname, int x, int y);
영상 출력 창과 관련된 함수 중에는 창크기를 변경하거나 위치를 바꿀 수 있는 함수
・winname - 위치를 이동할 창 이름
・x - 창의 가로 크기
・y - 창의 세로 크기

void resizeWindow(const String& winname, int width, int height);
프로그램 동작 중에 영상 출력 창크기를 변경
・winname - 크기를 변경할 창 이름
・width - 창의 가로 크기
・height - 창의 세로 크기

void imshow(const String& winname, InputArray mat);
Mat 클래스 객체에 저장된 영상 데이터를 화면에 출력
・winname - 영상을 출력할 대상 창 이름
・mat - 출력할 영상데이터(Mat 객체)

int waitKey(int delay = 0);
・delay -  키 입력을 기다릴 시간(밀리초 단위). delay ≦ 0 이면 무한히 기다립니다.
・반환값 -  눌린 키 값. 지정한 시간 동안 키가 눌리지 않았으면 -1을 반환

영상 파일 저장

  1. './data/lena.jpg'파일을 읽어 들여서 bmp 파일 형식의'./out/Lena.bmp'로 저장하라
  2. './data/lena.jpg'파일을 읽어 들여서 png 파일 형식의'./out/Lena.png'로 저장하라
  3. './data/lena.jpg'파일을 읽어 들여서 png 파일 형식의'./out/Lena2.png'로 저장하되 압축률 90%를 적용하라
  4. './data/lena.jpg'파일을 읽어 들여서 jpg 파일 형식의'./out/Lena2.jpg'로 저장하되 압축률 50%를 적용하라
import cv2

imgFile = './data/lena.jpg'
imgColor = cv2.imread(imgFile, cv2.IMREAD_COLOR)

cv2.imwrite('./out/Lena.bmp', imgColor)
cv2.imwrite('./out/Lena.png', imgColor)

cv2.imwrite('./out/Lena2.png', imgColor, [cv2.IMWRITE_PNG_COMPRESSION, 9]) #0~9
cv2.imwrite('./out/Lena2.jpg', imgColor, [cv2.IMWRITE_JPEG_QUALITY, 90]) #0~100
--> Out : TRUE
'out'폴더에 그림들이 생성됨을 확인할수있다.

matplotlib 1 컬러영상 표시

  1. openCV를 이용해 './data/lena.jpg' 파일을 읽어 들인 후 matplotlib.pyplot의 imshow() 함수를 사용해 화면에 표시하라.
  • 결과 확인
import cv2
import matplotlib.pyplot as plt
imgFile = './data/lena.jpg'
img = cv2.imread(imgFile)

plt.imshow(img)
--> Out : <matplotlib.image.AxesImage at 0x10aa152e4c0>

결과 이미지

  1. openCV를 이용해 './data/lena.jpg' 파일을 읽어 들인 후 matplotlib.pyplot의 imshow() 함수를 사용해 화면에 표시하라.
  • 표시된 결과가 원본과 동일한 색조가 되도록 변환 후 화면에 표시
import cv2
import matplotlib.pyplot as plt
imgFile = './data/lena.jpg'
img = cv2.imread(imgFile)

imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(imgRGB)
--> Out : <matplotlib.image.AxesImage at 0x10aa1cd81f0>

 

  1. openCV를 이용해 './data/lena.jpg' 파일을 읽어 들인 후 matplotlib.pyplot의 imshow() 함수를 사용해 화면에 표시하라.
  • numpy ndarray의 색인 문법으로 컬러 채널의 순서를 변경
import cv2
import matplotlib.pyplot as plt
import numpy as np
imgFile = './data/lena.jpg'
img = cv2.imread(imgFile)

imgRGB = np.zeros(img.shape, dtype='uint8')
print(imgRGB.dtype)

imgRGB[:, :, 2] = img[:, :, 0] #blue channel
imgRGB[:, :, 1] = img[:, :, 1] #green channel
imgRGB[:, :, 0] = img[:, :, 2] #red channel

plt.imshow(imgRGB)
--> Out : <matplotlib.image.AxesImage at 0x10aa2eca9a0>

import cv2
import matplotlib.pyplot as plt
import numpy as np
imgFile = './data/lena.jpg'
img = cv2.imread(imgFile)

imgRGB = np.zeros(img.shape)
print(imgRGB.dtype)

imgRGB[:, :, 2] = img[:, :, 0] #blue channel
imgRGB[:, :, 1] = img[:, :, 1] #green channel
imgRGB[:, :, 0] = img[:, :, 2] #red channel

imgRGB= imgRGB/255.0 #0~1

plt.imshow(imgRGB)
--> Out : <matplotlib.image.AxesImage at 0x10aa2e69610> 


행렬 연산

행렬 : numpy ndarray

import cv2
import sys

img = cv2.imread('./data/cat.bmp', cv2.IMREAD_GRAYSCALE)

if img is None:
    print("Image load failed!!!")
    sys.exit()
    
print("type(img) : ", type(img))
print("shape(img) : ", img.shape)

cv2.imshow("img", img)
cv2.waitKey()
cv2.destroyAllWindows()
--> Out : type(img) : <class 'numpy.ndarray'> shape(img) : (480, 640)

행렬의 생성과 초기화

import cv2
import sys
import numpy as np

img = cv2.imread('./data/cat.bmp', cv2.IMREAD_GRAYSCALE)

if img is None:
    print("Image load failed!!!")
    sys.exit()
    

img1 = np.empty((480, 640), np.uint8)
img2 = np.zeros((480, 640), np.uint8)
img3 = np.ones((480, 640), np.uint8)

img4 = np.full((480, 640), 0, np.float32)
print(type(img1), type(img2), type(img3), type(img4))
--> Out :  <class 'numpy.ndarray'> <class 'numpy.ndarray'> <class 'numpy.ndarray'> <class 'numpy.ndarray'>

 

import cv2
import sys
import numpy as np

img = cv2.imread('./data/cat.bmp', cv2.IMREAD_GRAYSCALE)

if img is None:
    print("Image load failed!!!")
    sys.exit()
    
l = [[1, 2, 3, 4],
     [5, 6, 7, 8],
     [9, 10, 11, 12]] #python list

mat = np.array(l)
print(type(mat), '\n', mat)
--> Out : 
<class 'numpy.ndarray'> 
 [[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]​
import cv2
import sys
import numpy as np

img = cv2.imread('./data/cat.bmp', cv2.IMREAD_GRAYSCALE)

if img is None:
    print("Image load failed!!!")
    sys.exit()
    
l = [[1, 2, 3, 4],
     [5, 6, 7, 8],
     [9, 10, 11, 12]] #python list

mat = np.array(l)
print(type(mat), '\n', mat)


mat[0, 1] = 100
mat
--> Out :
array([[  1, 100,   3,   4],
       [  5,   6,   7,   8],
       [  9,  10,  11,  12]])​

행렬의 생성과 초기화

Mat::Mat(int rows, int cols, int type);
행렬 객체 생성
・ rows - 새로 만들 행렬의 행 갯수(영상의 세로 크기)
・ cols - 새로 만들 행열의 열 개수(영상의 가로 크기)
・ type - 새로 만들 행렬의 타입

Mat::Mat(Size size, int type);
Mat 클래스 생성자에성 행렬의 크기를 지정할 때 Size클래스 사용
・ size - 새로 만들 행렬의 크기, Size(cols, rows) 또는 Size(width, height)
・ type - 새로 만들 행렬의 타입

Mat::Mat(int rows, int cols, int type, const Scalar& s);
Mat::Mat(Size size, int type, const Scalar& s);
Mat 행렬의 모든 원소는 임의의 쓰레기 값으로 채워져 있으므로, Mat 객체를 생성함과 동시에 모든 원소 값을 트정값으로 초기화를 하는 데 위와 같은 형태의 생성자를 사용
・ rows - 새로 만들 행렬의 행 갯수(영상의 세로 크기)
・ cols - 새로 만들 행열의 열 개수(영상의 가로 크기)
・ size - 새로 만들 행렬의 크기, Size(cols, rows) 또는 Size(width, height)
・ type - 새로 만들 행렬의 타입
・ s - 행렬 원소 초깃값

static MatExpr Mat::zeros(int rows, int cols, int type);
static MatExpr Mat::zeros(Size size, int type);
새로운 행렬을 생성할 때 모든 원소값을 0으로 초기화 하는 경우가 많기에, 이처럼 행렬 원소가 0으로 초기화된 zeros() 함수를 별도로 제공
・ rows - 새로 만들 행렬의 행 갯수(영상의 세로 크기)
・ cols - 새로 만들 행열의 열 개수(영상의 가로 크기)
・ size - 새로 만들 행렬의 크기, Size(cols, rows) 또는 Size(width, height)
・ type - 새로 만들 행렬의 타입
・ 반환값 - 모든 원소가 0으로 초기화된 행렬 표현식

Mat mat1 = Mat::zeros(3, 3, CV_32SC1);
 

static  MatExpr Mat::ones(int rows, int cols, int type);
static MatExpr Mat::ones(Size size, int type);
행렬의 원소가 1로 초기화된 행렬
・ rows - 새로 만들 행렬의 행 갯수(영상의 세로 크기)
・ cols - 새로 만들 행열의 열 개수(영상의 가로 크기)
・ size - 새로 만들 행렬의 크기
・ type - 새로 만들 행렬의 타입
・ 반환값 - 모든 원소가 1으로 초기화된 행렬 표현식

Mat mat2 = Mat::ones(3, 3, CV_32SC1);

static MatExpr Mat::eye(int rows, int cols, int type);
static MatExpr Mat::eye(Size size, int type);
행렬 연산에서 자주 사용되는 단위 행렬
・ rows - 새로 만들 행렬의 행 갯수(영상의 세로 크기)
・ cols - 새로 만들 행열의 열 개수(영상의 가로 크기)
・ size - 새로 만들 행렬의 크기
・ type - 새로 만들 행렬의 타입
・ 반환값 - 단위 행렬을 표현하는 행렬 표현식
Mat mat3 = Mat::ones(3, 3, CV_32SC1);

Mat::Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP);
Mat::Mat(Size size, int type, void* data, size_t step=AUTO_STEP);
기존에 이미 할당되어 있는 메모리 공간의 데이터를 행렬 원소 값으로 사용할 수  있는데, 외부 메모리 공간을 활용하여 Mat객체를 생성한다는 것은 자체적인 메모리 할당을 수행하지 않고 외부 메모리를 참조 하는 방식
・ rows - 새로 만들 행렬의 행 갯수(영상의 세로 크기)
・ cols - 새로 만들 행열의 열 개수(영상의 가로 크기)
・ size - 새로 만들 행렬의 크기
・ type - 새로 만들 행렬의 타입
・ data - 사용할 행렬 데이터의 주소, 외부 데이터를 사용하여 Mat객체를 생성할 경우, 생설자에서 원소 데이터저장을 위한 메모리 공간을 동적으로 할당하지 않습니다.
・ step - 행렬 데이터에서 한 행이 차지하는 바이트 수, 만약 외부 행렬 데이터의 각 행에 여분의 패딩 바이트가 존재한다면 명시적으로 지정해야합니다. 만약 기본값 AUTO_STEP을 사용하면 패딩 바이트가 없다고 간주 합니다.
loat data[] = {1, 2, 3, 4, 5, 6};
Mat mat4(2, 3, CV_32FC1, data);


Mat mat5 = (Mat_<float>(2,3) <<1, 2, 3, ,4 5, 6);



void Mat::create(int rows, int cols, int type);
void Mat::create(Size size, int type);
비어 있는 Mat 객체 또는 이미 생성된 Mat 객체에 새로운 행렬을 할당하는 create()멤버 함수
・ rows - 새로 만들 행렬의 행 갯수(영상의 세로 크기)
・ cols - 새로 만들 행열의 열 개수(영상의 가로 크기)
・ size - 새로 만들 행렬의 크기
・ type - 새로 만들 행렬의 타입

Mat& mat::operator = (const Scalar& s);
・ s - 행렬 원소에 설정할 값
・ 반환값 -  값이 설정된 Mat객체의 참조 

파이썬에서는 없는듯?!
Mat& Mat::setTo(InputArray value, InputArray mask = noArray());
행렬 전체 원소 값을 한꺼번에 설정할 수 있다. setTo() 함수는 두 개 인자을 가지고 있지만 두번째 인자 mask는 기본 값을 가지고 있으므로 생략가능
・ value - 행렬 원소에 설정할 값
・ mask - 마스크 행렬, 마스크 행렬의 원소가 0이 아닌 우치에서만 value 값이 설정된다. 행렬 전체 원소 값을 설정하려면 noArray() 또는 Mat()을 지정합니다.
・ 반환값 - Mat객체의 참조

행렬의 복사

Mat Mat::clone() const;
clone()함수는 자기 자신과 동일한 Mat 객체를 완전히 새로 만들어서 반환
・ 반환값 - *this 행렬의 복사본

void Mat:: copyTo(OutputArray m) const;
void Mat:: copyTo(OutputArray m, InputArray mask) const;
copyTo() 함수는 인자로 전달된 m 행렬에 자기 자신으로 복사, 인자로 전달된 m행렬이 서로 크기와 타입이 같으면 원소 값 복사만 수행하지만 서로 크기 또는 타입이 다를 경우 copyTo()함수 내부에서 행렬 m을 새로 생정한 후 픽셀 값을 복사
・ m - 복사본이 저장될 행렬 만약 *this 행렬과 크기 및 타입이 다르면 메모리를 새로 할당한 후 픽셀 값을 복사
・ nask - 마스크 행렬, 마스크 행렬의 원소 값이 0이 아닌 좌표에서만 행렬 원소를 복사

부분 행렬 추출(영상에서 사각형 모양의 부분 영상을 추출하거나 참조)

Mat Mat::operator()(const Rect& roi) const;
Mat Mat::operator()(Range rowRange, Range colRange) const;
Mat 클래스에 정의된 행렬에서 특정 사각형 영역의 부분 행령을 추출
・ roi - 사각형 관심 영역
・ rowRange - 관심 행 범위
・ colRange - 관심 열 범위
・ 반환값 - 추출한 부분 행렬 또는 영상, 부분 영상의 픽셀 데이터를 서로 공유
Mat img1 = imread("cat.bmp")
Mat img2 = img1(Rect(220, 120, 340, 240))

Mat Mat::rowRange(int startrow, in tendrow) const;
Mat Mat::rowRange(const Range& r) const;
지정한 범위의 행으로 구성된 행렬으로 반환
・ startrow - 추출할 행 범위 시작번호(포함)
・ endrow - 추출할 행 범위 끝 번호(불포함)
・ r - 추출할 행 범위
・ 반환값 - 지정된 행 범위에 해당하는 행렬

Mat Mat::colRange(int startcol, int endcol) const;
Mat Mat::colRange(const Range& r) const;
지정한 범위의 열로 구성된 행렬으로 반환
・ startrow - 추출할 열 범위 시작번호(포함)
・ endrow - 추출할 열 범위 끝 번호(불포함)
・ r - 추출할 열 범위
・ 반환값 - 지정된 열 범위에 해당하는 행렬

Mat Mat::row(int y) const;
Mat Mat::col(int x) const;
Mat 행렬로부터 한나의 행 또는 열을 추출하여 1행 짜리 또는 1열짜리 행렬을 만들시에 사용.
・ y - 부분행렬로 추출할 행 번호
・ x - 부분행렬로 추출할 열 번호
・ 반환값 - 추출한 부분 행렬(얕은 복사)

행렬의 원소 값 참조

template<typename _Tp> _Tp& Mat::at(int y, int x)
at()함수는 보통행과 열을 나타내는 두 개의 정수를 인자로 받아 해당 위치의 행렬 원소 값을 참조형식으로 반환, at()함수는 템플릿을 사용하는 템플릿 함수로서 여러 가지 형태로 재정의 되어 있어 행렬 원소 자료형을 명시적으로 지정하여야 한다.
・ y - 참조할 행 번호
・ x - 참조할 열 번호
・ 반환값 - (_Tp& 타입으로 형 변환된)y번째 행, x번째 열의 원소 값(참조)
CV_8UC1 uchar
CV_32FC1 float

template<typename _Tp>
_Tp* Mat::ptr(int y)
ptr() 함수는 인자로 전달된 y번째 행의 시작 주소를 반환, ptr() 함수는 템플릿으로 정의 되어있는 함수로 정의 되어 있어서 자료형을 명시적으로 지정 하여야한다.
・ y - 참조할 행 번호
・ 반환값 - (_Tp& 타입으로 형 변환된)y번째 행의 시작 주소

행렬 정보 참조하기

Mat 클래스 멤버 함수 설명
int Mat::channels() const; 행렬의 채널 수를 반환합니다.
int Mat::depth() const; 행렬의 깊이를 반환 합니다.(예)CV_8U, CV_32F
size_t Mat::elemSize() const; 한 개의 원소가 차지하는 메모리 크기를 바이트 단위로 반환합니다.
(CV_32C3 타입 행렬의 경우 4 × 3 = 12를 반환)
size_t Mat::elemSize1() const; 하나의 채널에서 한개의 원소가 차지하는 메모리 크기를 바이트 단위로 반환 합니다. (CV_32SC3 타입 행렬의 경우 4를 반환)
bool Mat::empty() const; 비어 있는 행렬이면 true를 반환합니다.
bool Mat::isContinuous() const; 각 행의 원소가 연속적으로 저장되어 있으면 true를 반환합니다.
bool Mat::isSubmatrix() const; 행렬이 다른 행렬의 부분 행렬이면 true를 반환합니다.
Size Mat::size() const; 행렬 크기를 Size타입으로 반환합니다.
size_t Mat::total() const; 전체 원소 개수를 반환합니다.
int Mat::type() const; 행렬의 타입을 반환 합니다.(예. CV_32FC1, CV_8UC3)

 

크기 및 타입 변환 함수

void Mat::convertTo(OutputArray m, int rtype, double alpha=1, double beta=0) const;
Mat 클래스의 크기 또는 타입을 변화시킬 경우 사용
・ m - 출력 행렬, 만약 m 행렬이 적절한 크기와타입이 아닌 경우 행렬 원소 데이터를 새로 할당합니다.
・ rtype - 원하는 출력 행렬의 타입. 만약 rtype이 음수이면 출력 행렬은 입력행렬과 같은 타입을 갖습니다.
・ alpha -  추가적으로 곱할 값
・ beta - 추가적으로 더할 값

Mat Mat::reshape(int cn, int rows=0) const;
reshape()함수는 행렬 원소 데이터를 복사하여 새로운 행렬을 만드는 것이 아니라 하나의 행렬 원소 데이터를 같이 참조하는 행렬을 반환(행렬 원소 값을 변경하면 원본 행렬의 원소 값도 함께 바뀐다)
・ cn - 새로운 채널 수, 만약 이 값이 0이면 채널 수를 변경하지 않습니다.
・ rows - 새로운 채널 수, 만약 이 값이 0이면 행의 개수를 변경하지 않습니다.
・ 반환값 - 모양이 변경된 행렬을 반환 합니다.

void Mat::resize(size_t sz);
void Mat::resize(size_t sz, const Scalar& s);
resize()함수는 행렬의 행개수를 sz개로 변경하며, sz가 기존 행렬의 행 개수보다 작으면 아래쪽 행을 제거하고, 기존 행렬의 행 새수보다 크면 아래쪽에 행을 추가합니다. 이때 추가하는 행 원소의 초깃값으로 s를 지정가능
・ sz - 새로운 행 개수
・ s - 새로 추가되는 행 원소의 초기값

template<typename _Tp> void Mat::push_back(const _Tp& elem);
template<typename _Tp> void Mat::push_back(const Mat_<_Tp>& elem)
template<typename _Tp> void Mat::push_back(const std::vector<_Tp>& elem)
void Mat::push_back(const Mat& m);
이미 존재하는 행렬에 원소 데이터를 추가할때 사용
・ elem - 행열의 맨 마지막 행에 추가할 원소 데이터
・ m - 행렬의 맨 마지막 행에 추가할 행렬. *this와 타입과 열 개수가 같아야 합니다.

void Mat::pop_back(size_t nelems=1);
행렬에서 맨 아래에 있는 행을 제거시 사용
・ nelems - 제거할 행 개수. *this 행렬의 행 개수보다 크면 안됩니다.

Vec Scalar클래스

Vec 클래스 - 벡터는 같은 자료형을 가진 원소 몇 개로 구성된 데이터 형식

 

Scalar 클래스 - 4채널 이하의 영상에서 픽셀값을 표현하는 용도로 자주 사용, Scalar 클래스의 첫 번째 원소가 픽셀 밝기를 표현하고 나머지 세 개의 원소는 0으로 설정, B(파란), G(녹색), R(노란색) 색상 성분 값을 표현하고, 네번때 원소는 보통 0으로 설정된다.

Scalar(밝기)

Scalar(파란색, 녹색, 빨간색)

Scalar(파란색, 녹색, 빨간색, 투명도)


InputArray OutputArray 클래스

 

InputArray 클래스 - Mat, vector<T>등 다양한 타입을 표현할수 있는 인터페이스 클래스로서 OpenCV함수의 입력 인자 자료형으로 사용

Mat _ImputArray::getMat(int idx=-1) const;
・ idx - 참조할 행 번호, idx < 0이면 행렬 전체를 참조합니다
・ 반환값 - Mat 행렬객체

OutputArray 클래스 - 클래스 계층적으로 InputArray 클래스를 상속받아 만들어져 OutputArray클래스도 Mat또는 vector<T>같은 타입의 객체로 부터 생성가능.

반응형