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" 转载请保留原文链接及作者。