OpenCV中的基本类型表示

OpenCV中的基本类型表示

在使用OpenCV过程中,有许多自定义的类型,对于新手来说(没错,说的就是我)比较难以理解。希望记录一下,帮助理解。

图像有一个或多个通道,基本数据类型也有数个。
下面我就讲一讲基本的对应关系(这个很重要)

  • int64 -> l
  • float -> f
  • double -> d
  • unchar -> u
  • 1通道 -> 1
  • 2通道 -> 2
  • 3通道 -> 3
    ……

1.点的表示

  // ​定义
typedef Point_<int> Point2i;
typedef Point_<int64> Point2l;
typedef Point_<float> Point2f;
typedef Point_<double> Point2d;
typedef Point2i Point;

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

//成员函数
//点积(数量积) x1*x1+y1*y2
_Tp dot(const Point_& pt) const;
//双精度点积
double ddot(const Point_& pt) const;
//叉乘(向量积)x1*y2-y1*x2
double cross(const Point_& pt) const;
//检查该点是否在指定矩形内
bool inside(const Rect_<_Tp>& r) const;

2.尺寸的表示

​//定义
typedef Size_<int> Size2i;
typedef Size_<int64> Size2l;
typedef Size_<float> Size2f;
typedef Size_<double> Size2d;
typedef Size2i Size;
//成员函数
//面积(width*height)
_Tp area() const;
//面积是否为0
bool empty() const;

3.Vec类:描述多通道Mat的像素

一般在访问像素点时经常使用,我反正是被虐了o( ̄▽ ̄)o

typedef Vec<int, 2> Vec2i;
typedef Vec<int, 3> Vec3i;
typedef Vec<int, 4> Vec4i;
typedef Vec<int, 6> Vec6i;
typedef Vec<int, 8> Vec8i;

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;
//
cv::Mat Img(10, 10, CV_8UC3,Scalar(255,255,255));
uchar pixel = Img.at<Vec3b>(9, 9)[0];

4.Matx:已知尺寸的小Mat模板

这个我几乎没有用到过

typedef Matx<float, 1, 2> Matx12f;
typedef Matx<double, 1, 2> Matx12d;
typedef Matx<float, 1, 3> Matx13f;
typedef Matx<double, 1, 3> Matx13d;
typedef Matx<float, 1, 4> Matx14f;
typedef Matx<double, 1, 4> Matx14d;
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, 3, 1> Matx31f;
typedef Matx<double, 3, 1> Matx31d;
typedef Matx<float, 4, 1> Matx41f;
typedef Matx<double, 4, 1> Matx41d;
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, 2, 3> Matx23f;
typedef Matx<double, 2, 3> Matx23d;
typedef Matx<float, 3, 2> Matx32f;
typedef Matx<double, 3, 2> Matx32d;

typedef Matx<float, 3, 3> Matx33f;
typedef Matx<double, 3, 3> Matx33d;

typedef Matx<float, 3, 4> Matx34f;
typedef Matx<double, 3, 4> Matx34d;
typedef Matx<float, 4, 3> Matx43f;
typedef Matx<double, 4, 3> Matx43d;

typedef Matx<float, 4, 4> Matx44f;
typedef Matx<double, 4, 4> Matx44d;
typedef Matx<float, 6, 6> Matx66f;
typedef Matx<double, 6, 6> Matx66d;

5.颜色类Scalar

含有4个元素的数组,在OpenCV中被用来传递像素值,RGB三个像素值,如用不到第四个,则不用写出来。

template<typename _Tp> class Scalar_ : public Vec<_Tp, 4>
typedef Scalar_<double> Scalar;

6.Rect:矩形表示类

​//定义
typedef Rect_<int> Rect2i;
typedef Rect_<float> Rect2f;
typedef Rect_<double> Rect2d;
typedef Rect2i Rect;
//成员函数
//返回左上角坐标
Point_<_Tp> tl() const;
//返回右下角坐标
Point_<_Tp> br() const;
//返回矩形框的宽与高
Size_<_Tp> size() const;
//面积
_Tp area() const;
//面积是否为0
bool empty() const;
//判断点是否在矩形内
bool contains(const Point_<_Tp>& pt) const;

7.Range类

用来指定Mat中的连续的行或者列,Range(a, b)表示范围从a到b的前闭后开空间[a, b)

//定义
class CV_EXPORTS Range
{
public:
Range();
Range(int _start, int _end);
Range(const CvSlice& slice);
//return end - start
int size() const;
//是否为空:start==end
bool empty() const;
static Range all();
operator CvSlice() const;
int start, end;
};
//应用举例:
cv::Mat Img(10, 10, CV_8UC3,Scalar(255));
//dst提取Img的第1列到第4列,,Mat(行,列)
cv::Mat dst = Img(Range::all(), Range(1,5));

8.Mat::type()的返回值

这个函数比较有意思,它不会直接返回一个类型,它是直接返回int型的数字。

这个函数好坑,我被它玩弄了一个下午( ̄▽ ̄)”

对应关系

  C1 C2 C3 C4
CV_8U 0 8 16 24
CV_8S 1 9 17 25
CV_16U 2 10 18 16
CV_16S 3 11 19 17
CV_32S 4 12 20 28
CV_32F 5 13 21 29
CV_64F 6 14 22 30

参考资料

1、opencv基本数据类型
2、OpenCV cv::Mat::type()返回值


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 525244039@qq.com

文章标题:OpenCV中的基本类型表示

文章字数:1.1k

本文作者:Zikun

发布时间:2019-11-23, 09:31:20

最后更新:2019-11-23, 09:31:20

原始链接:http://zikun97.github.io/2019/11/23/OpenCV%E4%B8%AD%E7%9A%84%E7%B1%BB%E5%9E%8B%E8%A1%A8%E7%A4%BA/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏