多语言展示
当前在线:522今日阅读:103今日分享:49

OpenCV:基本数据结构

绪:OpenCV非常强大,其在基本数据结构的设计比较好;本文主要介绍OpenCV的基本数据结构:二维点Point_;三维点Point3_;尺寸Size_;矩形区域Rect_;小矩形Matx_;短向量Vec;四维向量Scalar_;范围Range;矩阵结构Mat;
工具/原料

C++ 11

方法/步骤
1

二维点Point_:x,y二维点对Point_,是一个模板类;可直接访问数据成员x,y;具有+、-、==、!=这4个基本的操作,和点乘、叉乘等操作;提供了inside函数来判断一个点是否在矩形区域内;为方便使用,opencv对常用类型进行了定义:typedef Point_ Point2i;typedef Point2i Point;typedef Point_ Point2f;typedef Point_ Point2d;

2

三维点Point3_:x,y,z常用类型为:typedef Point3_ Point3i;typedef Point3_ Point3f;typedef Point3_ Point3d;

3

尺寸Size_;height,widthSize可访问的成员变量是height和width。还定义area函数来求面积。常用类型为:typedef Size_ Size2i;typedef Size2i Size;typedef Size_ Size2f

4

矩形区域Rect_:左上角,长,宽rect = rect ± point //矩形偏移rect = rect ± size //改变大小rect += point, rect -= point, rect += size, rect -= size //(augmenting operations)rect = rect1 & rect2 //矩形交集rect = rect1 | rect2 //包含r1r2的最小矩形 RotatedRect旋转矩形由中心、边长、旋转角度决定的;RotatedRect::RotatedRect(const Point2f& center, const Size2f& size, float angle)// 中心点(不是左上角坐标),尺寸,旋转角度RotatedRect rRect = RotatedRect(Point2f(100,100), Size2f(100,50), 30);示例:int main(void) { Mat bg(200,200,CV_8UC3,Scalar(0));        imshow('',bg);        RotatedRect rRect(Point2f(100,100),Size(100,100),40);         Point2f vertices[4];        rRect.points(vertices);        for(int i = 0; i < 4;++i)           line(bg,vertices[i],vertices[(i+1)%4],Scalar(0,255,0));        Rect brect = rRect.boundingRect(); rectangle(bg,brect,Scalar(255,0,0));        imshow('',bg);  waitKey();        return 0; }

5

小矩形Matx:用来记录一些小的矩形;且这些矩形在编译前大小就固定了;typedef Matx Matx12f;typedef Matx Matx12d;typedef Matx Matx16f;typedef Matx Matx16d;typedef Matx Matx21f;typedef Matx Matx21d;typedef Matx Matx61f;typedef Matx Matx61d;typedef Matx Matx22f;typedef Matx Matx22d;typedef Matx Matx66f;typedef Matx Matx66d;【注】:如果要使用灵活的矩形,还是用Mat。

6

短向量Vec:其实是元素较少的向量。typedef Vec Vec2b;typedef Vec Vec3b;typedef Vec Vec4b;typedef Vec Vec2s;typedef Vec Vec4s;typedef Vec Vec2i;typedef Vec Vec4i;typedef Vec Vec2f;typedef Vec Vec4f;typedef Vec Vec2d;typedef Vec Vec6d;支持加、减、数乘、相等、不等、求范数等运算

7

四维向量Scalar_;Scalar_类其实是用Vec派生下来的,也就是说,它是一个4元组:typedef Scalar_ Scalar;通常用来传递像素。template class Scalar_: public Vec<_Tp, 4> { ... };typedef Scalar_ Scalar;

8

范围Range:(start, end)Range类用来指定连续的子序列;class CV_EXPORTS Range { public: Range(); Range(int _start, int _end); Range(const CvSlice& slice); int size() const; bool empty() const; static Range all(); operator CvSlice() const; int start, end; };

9

矩阵结构Mat:既可以储存二维矩阵,也可以储存高维矩阵;多维情况:       int main(void)        {            int sz[]={4,5,6};            Mat img(3,sz,CV_8U);//3维数组            cout<

注意事项
1

小矩形Matx;

2

短向量Vec: 其实是元素较少的向量。 typedef Vec Vec2b;

3

四维向量Scalar_; Scalar_类其实是用Vec派生下来的,

推荐信息