Chapter 03 基本数据类型
基本类型
cv::Mat,可以表示任意维度的矩阵,大数组表示;
cv::Vec<> Vector模板,常用别名 cv::Vec{2,3,4,6}{b,w,s,i,f,d},以上组合都是有效的;继承自 cv::Matx<>
- 元素访问
[i]
、(i)
; - 叉积
v3f.cross(u3f)
。
cv::Matx<> 区别于Mat,用于处理特定的小矩阵,固定大小的矩阵别名 cv::Matx{1,2,3,4,6}{1,2,3,4,6}{f,d};
- 矩阵的创建初始化:1.构造函数,2.静态函数
all(x)
、zeros()
、ones()
、eye()
; - 创建一个表示对角线的矩阵
diag()
,例如m31f = cv::Matx33f::diag()
创建一个3x1矩阵; - 创建服从均匀分布的矩阵
randu(min, max)
,例如m33f = cv::Matx33f::randu(min, max)
; - 正态分布
nrand(mean, variance)
; - 元素访问
m(i,j)
; 可以直接进行矩阵运算和比较;类型转换; - 点积
m1.dot(m2)
、m1.ddot(m2)
; 改变维度m91f = m33f.reshape<9,1>()
; - 获得子向量,行,列,对角线
get_minor<2,2>(i,j)
,row(i)
,col(j)
,diag()
; - 转置
t()
, 求逆inv(method) // cv::DECOMP_LU
, 元素积m1.mul(m2)
; - 求解线性方程组
solve()
。
点类,cv::Point2i, cv::Point2f, and cv::Point2d, or cv::Point3i, cv::Point3f, cv::Point3d. 即 cv::Point{2,3}{i,f,d};
- 点可以直接转化为对应的向量
(cv::Vec3f) p
; - 点积(
dot()
,ddot()
)、叉积(cross()
)、是否在矩形内p.inside(r)
cv::Scalar 四维双精度向量,继承自cv::Vec<double,4>
- 元素积
s1.mul(s2)
; - 四元共轭
s.conj()
, 返回cv::Scalar(s0, -s1, -s2, -s2)
; - 实数检测
s.isReal
, 当s1 == s2 == s3 == 0
时返回真。
cv::Size,有成员变量width和height,是 cv::Size2i 的别名, cv::Size2f 表示浮点数;
- 计算面积
sz.area()
。
cv::Rect,cv::Point和cv::Size的结合,表示整型数据;
- 面积
r.area()
, 左上角r.tl()
,右下角r.br()
; - 是否包含某个点
r.contains(p)
。
cv::RotatedRect 表示一个非轴对称的矩形,包含了一个cv::Point2f表示的中心,一个cv::Size2f表示的大小,和一个float的角度;非模板类;
- 返回角点列表
rr.points(pts[4])
。
复数类 cv::Complexf、cv::Complexd,标准的STL中也有实现,二者的主要区别在于成员访问方式,STL中使用 real()
和 imag()
;
- 成员访问:公有变量
z1.re
z1.im
; - 复共轭
z2 = z1.conj()
。
b = unsigned char, w = unsigned short, s = short, i = int, f = float, d = double
帮助对象
cv::TermCriteria,算法在什么时候停止;
- 包含三个公开成员变量
type
、maxCount
、epsilon
,可以通过构造函数设置初始值; type
可以是cv::TermCriteria::COUNT
、cv::TermCriteria::EPS
或者二者并;cv::TermCriteria::COUNT
等同于cv::TermCriteria::MAX_ITER
。
cv::Range,定义一个连续的整数序列,序列中包含了开始元素,但不包含结束元素;
- 2个元素,
start
和end
,构造函数初始化; - 元素个数
size()
,是否为空empty()
; - 在任何地方使用
cv::Range::all()
声明对象的可用范围。
cv::Ptr,智能指针模板,自动进行引用计数,当计数为0时自动释放内存;
cv::Ptr<cv::Matx33f>() p(new cv::Matx33f)
或者cv::Ptr<Matx33f> p = makePtr<cv::Matx33f>()
;- 支持
*
和->
指针操作; - 是否指向了对象
p.empty()
; - 释放对象,自动调用
delete_obj()
,一般来说该方法不做任何事,需要重载。
异常处理,cv::Exception继承自标准库中的std::exception;
- 成员变量:
(int)code
、(string)err
、(s)func
、(s)file
、(i)line
; - 生成异常
CV_Error(errorcode, description)
、CV_Error_(errorcode, printf_fmt_str, [printf-args])
CV_Assert(condition)
测试条件并在不符合时抛出异常;CV_DbgAssert(condition)
, 仅在Debug时生效;
cv::DataType<>模板,OpenCV库函数需要传递特定的数据类型概念时使用;
不懂
cv::InputArray 和 cv::OutputArray类
- OpenCV的基本数据类型中,多是array类型,InputArray和OutputArray则指代以上大部分基础数据类型;
- InputArray和OutputArray的最大区别是,前者是只读的;
cv::noArray()
返回cv::InputArray
,有特殊的用途。
工具函数
包含了数学操作、测试、错误生成、内存和线程处理、优化等函数。
函数 | 描述 |
---|---|
cv::alignPtr() | 对齐指针到给定的位数 |
cv::alignSize() | 对齐缓冲区大小到给定的位数 |
cv::cubeRoot() | 计算立方根 |
cv::CV_Assert() | 在给定条件不满足时抛出异常 |
CV_Error() | 创建cv::Exception异常并抛出,固定字符串 |
CV_Error_() | 创建cv::Exception并抛出,格式字符串 |
cv::allocate() | 分配C风格的对象数组 |
cv::deallocate() | 释放C风格的对象数组 |
cv::error() | 指明一个错误并抛出异常 |
cv::fastAtan2() | 以度为单位计算向量的二维角度 |
cv::fastFree() | 释放一个内存缓冲区 |
cv::fastMalloc() | 分配一个对齐的内存缓冲区 |
cv::format() | 使用类似sprintf格式创建STL字符串 |
cv::getCPUTickCount() | 从内部CPU计时器获取计数 |
cv::getTickCount() | 从系统获取计数 |
cv::getTickFrequency() | 获取每秒的计数 |
cv::getNumThreads() | 计算当前OpenCV使用的线程数量 |
cv::setNumThreads() | 设置被OpenCV使用的线程数量 |
cv::getThreadNum() | 获取当前的线程下标index |
cv::getOptimalDETSize() | 计算计划传递给cv :: DFT()的数组的最佳大小 |
cvIsInf() | 检查浮点数x是否为无穷大 |
cvIsNaN() | 检查浮点数x是否为NaN |
cvRound() | 取浮点数x到最接近的整数 |
cvCeil() | 对浮点数x进行上取整 |
cvFloor() | 对浮点数x下取整 |
cv::setUseOptimized() | 启用或禁用优化代码的使用(SSE2等) |
cv::useOptimized() | 指示优化代码启用的状态 |
模板结构
和STL、Boost一样,OpenCV的很多功能基于模板实现;
函数 | 功能 |
---|---|
cv::Point_<Type T> | 由一对类型为T的对象组成的点 |
cv::Rect_<Type T> | 类型为T的位置,宽度和高度 |
cv::Vec<Type T, int H> | H个类型为T的对象的集合 |
cv::Matx<Type T, int H, int W> | H*W个类型为T的对象的集合 |
cv::Scalar_<Type T> | 4个类型为T的对象的集合(cv::Vec<T,4> ) |