• opencv 基本数据结构


     


    DataType : 将C++数据类型转换为对应的opencv数据类型

    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_  二维点坐标(x,y)

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

    Point3_ 3维点坐标(x,y,z)

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

    Size_  尺寸(width, height)

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

    Rect_  矩形区域(x,y,width,height) ,(x,y)左上角坐标, 范围[x, x + width), [y, y + height)

    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)

    RotatedRect  旋转矩形

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

    Matx 小矩阵

    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

    Vec  短向量,基于Matx

    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;

    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

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

     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)

    创建数组:

    // 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));

    创建特殊矩阵:

    • 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

    赋值相关:

    • clone
    • copyTo
    • convertTo
    • assignTo
    • setTo

    InputArray
    OutputArray

    //Do not explicitly create InputArray, OutputArray instances
    void myAffineTransform(InputArray_src, OutputArray_dst, InputArray_m) {   // get Mat headers for input arrays. This is O(1) operation,   // unless_src and/or_m are matrix expressions.   Mat src =_src.getMat(), m =_m.getMat();   CV_Assert( src.type() == CV_32FC2 && m.type() == CV_32F && m.size() == Size(3, 2) );   // [re]create the output array so that it has the proper size and type.   // In case of Mat it calls Mat::create, in case of STL vector it calls vector::resize.   _dst.create(src.size(), src.type());   Mat dst =_dst.getMat();   for( int i = 0; i < src.rows; i++ )   for( int j = 0; j < src.cols; j++ )   {     Point2f pt = src.at<Point2f>(i, j);     dst.at<Point2f>(i, j) = Point2f(m.at<float>(0, 0)*pt.x +     m.at<float>(0, 1)*pt.y +     m.at<float>(0, 2),     m.at<float>(1, 0)*pt.x +     m.at<float>(1, 1)*pt.y +     m.at<float>(1, 2));   } }
  • 相关阅读:
    CF Round #569 Div2(contest1180)
    HY中考游记
    Luogu P2309 loidc,卖卖萌
    点击按钮使用window.open打开页面后,再次点击按钮会再打开一个页面,如何解决?
    line-height:150%/1.5em与line-height:1.5的区别
    table使用display:block时会多出一条边框
    让360双核浏览器默认极速模式,避免采用兼容模式
    使用nodejs安装http-server
    行内元素内边距对左右下起作用,外边距只对左右起作用
    微信小程序示例
  • 原文地址:https://www.cnblogs.com/zengcv/p/6283095.html
Copyright © 2020-2023  润新知