OpenCV with C++ 프로젝트
기본
경로
"filename.type"
: 코드가 위치한 곳"/filename.type"
: 코드가 위치한 프로젝트 기준
OpenCV
Mat
Generate
Mat()
Mat(int rows, int cols, int type)
Mat(Size size, int type)
Mat (int rows, int cols, int type, const Scalar &s)
Mat (Size size, int type, const Scalar &s)
Mat (const Mat &m)
-
Type
-
CV_8U (=0) : 8-bit unsigned integer: uchar ( 0..255 )
※ 일반적인 .JPG 파일의 type은 CV_8UC3이다. ※
※ Vec3b(uchar) type으로 pixel단위 접근을 할 수 있다. ※ -
CV_8S (=1) : 8-bit signed integer: schar ( -128..127 )
-
CV_16U (=2) : 16-bit unsigned integer: ushort ( 0..65535 )
※ Vec3w(ushort) type으로 pixel단위 접근을 할 수 있다. ※
-
CV_16S (=3) : 16-bit signed integer: short ( -32768..32767 )
※ Vec3s(short) type으로 pixel단위 접근을 할 수 있다. ※
-
CV_32S (=4) : 32-bit signed integer: int ( -2147483648..2147483647 )
※ Vec3i(int) type으로 pixel단위 접근을 할 수 있다. ※
-
CV_32F (=5) : 32-bit floating-point number: float ( -FLT_MAX..FLT_MAX, INF, NAN )
※ Vec3f(float) type으로 pixel단위 접근을 할 수 있다. ※
-
CV_64F (=6) : 64-bit floating-point number: double ( -DBL_MAX..DBL_MAX, INF, NAN )
※ Vec3d(double) type으로 pixel단위 접근을 할 수 있다. ※
※ 이러한 type 뒤에 channel의 개수를 붙여서 사용하기도 함 (e.g., CV_8UC1) ※
※ channel이 하나 증가할 때 마다 8씩 증가된다. ※ e.g., CV_8UC1=0, CV_8UC2=8, CV_8UC3=16; CV_8SC1=1, CV_8SC2=9, CV_8SC3=17; -
Read
Mat img = imread("img.jpg");
Write
int i=0;
string title = "img";
imwrite(title+to_string(i), img);
※ 이때, 저장할 경로의 directory가 이미 존재해야한다. 없을 경우 저장되지 않음. ※
Show
imshow("title", Mat img);
waitKey(0);
destroyAllWindows();
Approach
each pixel
Mat::at(int row, int col)
Mat::at(int i0, int i1, int i2) // in: Index along the dimension n
Mat::at(const int *idx) // idx: Array of Mat::dims indices
Mat::at(const Vec<int,n> &idx)
Mat::at(Point pt) // pt: Element position specified as Point(j,i).
img.at<uchar>(y,x) = 255;
img.at<Vec3b>(y,x)[c] = 255;
-
type
- Mat1b (=Mat<uchar>)
Mat2b (=Mat<Vec2b>)
Mat3b (=Mat<Vec3b>)
Mat4b (=Mat<Vec4b>)
Vec2b (=Vec<uchar, 2>)
Vec3b (=Vec<uchar, 3>)
Vec4b (=Vec<uchar, 4>) - Mat1w (=Mat<ushort>)
Mat2w (=Mat<Vec2w>)
Mat3w (=Mat<Vec3w>)
Mat4w (=Mat<Vec4w>)
Vec2w (=Vec<ushort, 2>)
Vec3w (=Vec<ushort, 3>)
Vec4w (=Vec<ushort, 4>) - Mat1s (=Mat<short>)
Mat2s (=Mat<Vec2s>)
Mat3s (=Mat<Vec3s>)
Mat4s (=Mat<Vec4s>)
Vec2s (=Vec<short, 2>)
Vec3s (=Vec<short, 3>)
Vec4s (=Vec<short, 4>) - Mat1i (=Mat<int>)
Mat2i (=Mat<Vec2i>)
Mat3i (=Mat<Vec3i>)
Mat4i (=Mat<Vec4i>)
Vec2i (=Vec<int, 2>)
Vec3i (=Vec<int, 3>)
Vec4i (=Vec<int, 4>)
Vec6i (=Vec<int, 6>)
Vec8i (=Vec<int, 8>) -
Mat1f (=Mat<float>)
Mat2f (=Mat<Vec2f>)
Mat3f (=Mat<Vec3f>)
Mat4f (=Mat<Vec4f>)
Vec2f (=Vec<float, 2>)
Vec3f (=Vec<float, 3>)
Vec4f (=Vec<float, 4>)
Vec6f (=Vec<float, 6>) - Mat1d (=Mat<double>)
Mat2d (=Mat<Vec2d>
Mat3d (=Mat<Vec3d>
Mat4d (=Mat<Vec4d>
Vec2d (=Vec<double, 2>)
Vec3d (=Vec<double, 3>)
Vec4d (=Vec<double, 4>)
Vec6d (=Vec<double, 6>)
- Mat1b (=Mat<uchar>)
Range
\[\text{Mat M } = \begin{bmatrix} 1&2&3\\ 4&5&6\\ 7&8&9 \end{bmatrix}\]일 때,
Mat M_(행,열) = M(행의 범위, 열의 범위)
Example :
Mat M_0x = M(Range(0,1), Range(0,3)); // [1,2,3]
Mat M_1x = M(Range(1,2), Range(0,3)); // [4,5,6]
Mat M_2x = M(Range(2,3), Range(0,3)); // [7,8,9]
Mat M_x0 = M(Range(0,3), Range(0,1)); // [1;4;7;]
Mat M_x1 = M(Range(0,3), Range(1,2)); // [2;5;8;]
Mat M_x2 = M(Range(0,3), Range(2,3)); // [3;6;9;]
Mat M__ = M(Range(0,2), Range(1,3)); // [2,3; 5,6;]
Circle
circle(img, Point2f, 3, Scalar(0, 255, 0), 3);
Resize
Mat::resize(size_t sz) // sz: New number of rows
Mat::resize(size_t sz, const Scalar &s) // s: Value assigned to the newly added elements
resize(src, dst, Size(width, height));
Convert Type
Mat::convertTo(OutputArray m, int rtype, double alpha=1, double beta=0)
src.convertTo(dst, CV_8UC3);
C++
min/max
int minVal = min({1,2,3,4}); // 1
int maxVal = max({1,2,3,4}); // 4
이런식으로 중괄호를 통해 여러 값에 대해 최소/최대값을 구할 수 있다.
Vector
array와 달리 동적으로 원소를 추가할 수 있으며 크기가 자동으로 늘어난다.
생성
vector<int> v;
추가 & 삭제
v.push_back(1); // vector의 back에 원소를 추가
v.pop_back(); // vector의 back에 원소를 삭제
접근
int v1 = v[i]; // i번째 원소를 반환
int v1 = v[i]; // i번째 원소를 반환
int v_front = v.front(); // front([0]) 원소를 반환
int v_back = v.back(); // back([size-1]) 원소를 반환
기타
bool isEmpty = v.empty(); // vector가 비었으면 true를 반환
int size = v.size(); // vector의 원소 개수를 반환
Queue
생성
queue<int> q;
추가 & 삭제
q.push(1); // queue의 back에 원소 추가
q.pop(); // queue의 front쪽 원소를 삭제
탐색
int front = q.front(); // queue의 front쪽 원소를 반환
int back = q.back(); // queue의 back쪽 원소를 반환
기타
bool isEmpty = q.empty(); // queue가 비었으면 true를 반환
int size = q.size(); // queue의 size를 반환