OpenCV with C++ 프로젝트

3 minutes to read


기본

경로

  • "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단위 접근을 할 수 있다. ※

      image-20210927234133991image-20210927234549686

    • CV_8S (=1) : 8-bit signed integer: schar ( -128..127 )

      image-20210927234159040image-20210927234611358

    • CV_16U (=2) : 16-bit unsigned integer: ushort ( 0..65535 )

      ※ Vec3w(ushort) type으로 pixel단위 접근을 할 수 있다. ※

      image-20210927234213848image-20210927234630359

    • 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단위 접근을 할 수 있다. ※

      image-20210927234231565image-20210927234651138

    • CV_64F (=6) : 64-bit floating-point number: double ( -DBL_MAX..DBL_MAX, INF, NAN )

      ※ Vec3d(double) type으로 pixel단위 접근을 할 수 있다. ※

      image-20210927234249304image-20210927234708659

    ※ 이러한 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>)


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를 반환