OpenCV basic data structure

DataType  : Convert the C++ data type to the corresponding opencv data type

enum { CV_8U= 0 , CV_8S= 1 , CV_16U= 2 , CV_16S= 3 , CV_32S= 4 , CV_32F= 5 , CV_64F= 6 };
// allocates a 30x40 floating-point matrix  // CV_32F
Mat A(30, 40, DataType<float>::type);
Mat B = Mat_<std::complex<double> >(3, 3);
// the statement below will print 6, 2 /*, that is depth == CV_64F, channels == 2*/  CV_64FC2
cout << B.depth() << ", " << B.channels() << endl;

Point_2D   point coordinates (x,y)

typedef Point_<int> Point2i;
typedef Point2i Point;
typedef Point_<float> Point2f;
typedef Point_<double> Point2d;

Point3_  3-dimensional point coordinates (x, y, z)

typedef Point3_<int> Point3i;
typedef Point3_<float> Point3f;
typedef Point3_<double> Point3d;

Size_size   (width, height)

typedef Size_<int> Size2i;
typedef Size2i Size;
typedef Size_<float> Size2f;

Rect_rectangular   area (x,y,width,height), (x,y) upper left corner coordinates, range [x, x + width), [y, y + height)

copy code
rect = rect ± point //矩形偏移(shifting a rectangle by a certain offset)
rect = rect ± size //改变大小(expanding or shrinking a rectangle by a certain amount)
rect += point, rect -= point, rect += size, rect -= size //(augmenting operations)
rect = rect1 & rect2 //矩形交集(rectangle intersection)
rect = rect1 | rect2 //包含r1r2的最小矩形(minimum area rectangle containing rect2 and rect3 )
rect &= rect1, rect |= rect1 //(and the corresponding augmenting operations)
rect == rect1, rect != rect1 //(rectangle comparison)
copy code

RotatedRect   rotated rectangle

RotatedRect::RotatedRect(const Point2f& center, const Size2f& size, float angle)// 中心点(不是左上角坐标),尺寸,旋转角度
RotatedRect rRect = RotatedRect(Point2f(100,100), Size2f(100,50), 30);

Matx 小矩阵

copy code
template<typename_Tp, int m, int n> class Matx {...};
typedef Matx<float, 1, 2> Matx12f;
typedef Matx<double, 1, 2> Matx12d;
...
typedef Matx<float, 1, 6> Matx16f;
typedef Matx<double, 1, 6> Matx16d;
typedef Matx<float, 2, 1> Matx21f;
typedef Matx<double, 2, 1> Matx21d;
...
typedef Matx<float, 6, 1> Matx61f;
typedef Matx<double, 6, 1> Matx61d;
typedef Matx<float, 2, 2> Matx22f;
typedef Matx<double, 2, 2> Matx22d;
...
typedef Matx<float, 6, 6> Matx66f;
typedef Matx<double, 6, 6> Matx66d;

Matx33f m(1, 2, 3,
4, 5, 6,
7, 8, 9);
cout << sum(Mat(m*m.t())) << endl;//Matx转化为Mat
copy code

Vec  短向量,基于Matx

copy code
template<typename_Tp, int n> class Vec : public Matx<_Tp, n, 1> {...};
typedef Vec<uchar, 2> Vec2b;
typedef Vec<uchar, 3> Vec3b;
typedef Vec<uchar, 4> Vec4b;
typedef Vec<short, 2> Vec2s;
typedef Vec<short, 3> Vec3s;
typedef Vec<short, 4> Vec4s;
typedef Vec<int, 2> Vec2i;
typedef Vec<int, 3> Vec3i;
typedef Vec<int, 4> Vec4i;
typedef Vec<float, 2> Vec2f;
typedef Vec<float, 3> Vec3f;
typedef Vec<float, 4> Vec4f;
typedef Vec<float, 6> Vec6f;
typedef Vec<double, 2> Vec2d;
typedef Vec<double, 3> Vec3d;
typedef Vec<double, 4> Vec4d;
typedef Vec<double, 6> Vec6d;
copy code

Scalar_  四维向量

template<typename_Tp> class Scalar_: public Vec<_Tp, 4> { ... };
typedef Scalar_<double> Scalar;

Range 范围,(start, end)

Mat m(300,300,CV32F);
Mat part = m(Range::all(), Range(20, 200)); // 相当于matlab的m(:, 20 : 199)

对于自定义的函数,可以用如下方法来支持Range

copy code
void my_function(..., const Range& r, ....)
{
  if(r == Range::all()) { 
  // process all the data, 使用全部数据
  }
  else {
  // process [r.start, r.end),根据r中定义, 处理数据 start : end - 1 
  }
}
copy code

 Mat 矩阵结构

  • M.data  数据区域的指针
  • M.dims  矩阵维度
  • M.sizes  维度
  • M.elemSize()  每个元素占的字节空间大小,与元素类型相关,如CV_8U
  • M.step[]  用来计算元素地址, M.step[i] 表示所有比i大的维度所占空间大小
M.step[i] >= M.step[i+1]*M.sizes[i+1]; //这里大于是因为数据空间可能有空白
  • 2-dimensional matrices are stored row-by-row
  • 3-dimensional matrices are stored plane-by-plane
addr(M(i(0),...,i(M.dims−1))) = M.data + M.step[0] ∗ i(0)+ M.step[1] ∗ i(1)+ ... + M.step[M.dims − 1] ∗ i(M.dims−1)

创建数组:

copy code
// make a 7x7 complex matrix filled with 1+3j.
Mat M(7,7,CV_32FC2,Scalar(1,3));
// and now turn M to a 100x60 15-channel 8-bit matrix.
// The old content will be deallocated
M.create(100,60,CV_8UC(15));
// create a 100x100x100 8-bit array
int sz[] = {100, 100, 100};
Mat bigCube(3, sz, CV_8U, Scalar::all(0));
copy code

创建特殊矩阵:

  • diag
  • ones
  • zeros 
  • eye

属性相关:

  • rows
  • cols
  • begin
  • end
  • at
  • size
  • depth
  • type
  • elemSize
  • total

矩阵操作:

  • t
  • inv
  • mul
  • cross
  • dot
  • reshape
  • resize
  • reserve
  • push_back
  • pop_back

Assignment related:

  • clone
  • copyTo
  • convertTo
  • assignTo
  • setTo

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324650076&siteId=291194637