'./data/lena.jpg'파일을 읽어 들여서 컬러로 화면에 표시하고 키보드에서 아무 키나 누르면 윈도우가 사라지도록 하라
'./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을 반환
영상 파일 저장
'./data/lena.jpg'파일을 읽어 들여서 bmp 파일 형식의'./out/Lena.bmp'로 저장하라
'./data/lena.jpg'파일을 읽어 들여서 png 파일 형식의'./out/Lena.png'로 저장하라
'./data/lena.jpg'파일을 읽어 들여서 png 파일 형식의'./out/Lena2.png'로 저장하되 압축률 90%를 적용하라
'./data/lena.jpg'파일을 읽어 들여서 jpg 파일 형식의'./out/Lena2.jpg'로 저장하되 압축률 50%를 적용하라
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을 사용하면 패딩 바이트가 없다고 간주 합니다.
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>같은 타입의 객체로 부터 생성가능.