1、OpenCV的数据类型
- 根据组织结构,OpenCV的数据类型主页分成三类:直接从C=++原语中继承的基本数据类型,如int、float、数组、矩阵等;辅助对象,如垃圾收集指针类、用于数据切片的范围对象、抽象的终止条件等;大型数组类型,如cv::Mat、cv::SparseMat。
- 基本数据类型:cv::Point、cv::Size、cv::Rect、cv::RotateRect、固定矩形类cv::Matx、固定向量类cv::Vec、cv::Scalar。
- 访问成员:cv::Point、cv::Size、cv::Rect、cv::RotateRect通过变量名访问,如p.x、p.y等;固定向量类cv::Vec、cv::Scalar、固定矩形类cv::Matx通过下标访问,如myvec[0]、myscalar[2]。
- 类型别名中的原语:b(unsigned int)、w(unsigned short int)、s(short int)、i(int)、f(float)、d(double)。
2、基本数据类型
基本数据类型 | 别名格式 |
---|---|
cv::Point | cv::Point{2,3}{i,f,d} |
cv::Size | cv::Size2{i,f} |
cv::Rect | cv::Rect |
cv::RotateRect | cv::RotateRect |
cv::Complex | cv::Complex{f,d} |
cv::Matx | cv::Matx{1,2,3,4,6}{f,d} |
cv::Vec | cv::cv::Vec{2,3,4,6}{b,s,w,i,f,d} |
cv::Scalar | cv::Scalar |
cv::Point类支持的操作 | 示例 |
---|---|
默认构造函数 |
cv::Point2i p cv::Point3i p
|
复制构造函数 | cv::Point3f p2(p1) |
值构造函数 |
cv::Pointf2i p(x0,x1) cv::Pointf3d p(x0,x1,x2)
|
构造成固定向量类 | (cv::Vec3f) p |
成员访问 | p.x p.y p.z |
点乘 |
float x = p1.dot(p2) double x = p1.ddot(p2)
|
叉乘 | p1.cross(p2) |
判断一个点是否在矩形r内 | p.inside(r) |
cv::Size类支持的操作 | 示例 |
---|---|
默认构造函数 |
cv::Size sz cv::Size2i sz cv::Size2f sz
|
复制构造函数 | cv::Size sz2(sz1) |
值构造函数 | cv::Size2f sz(w,h) |
成员访问 | sz.width sz.height |
计算面积 | sz.area() |
cv::Rect类支持的操作 | 示例 |
---|---|
默认构造函数 | cv::Rect r |
复制构造函数 | cv::Rect r2(r1) |
值构造函数 | cv::Rect r(x,y,w,h) |
由起始点和大小构造 | cv::Rect r(p,sz) |
由两个对角构造 | cv::Rect r(p1,p2) |
成员访问 | r.x r.y r.width r.height |
计算面积 | r.area() |
提取左上角 | r.tl() |
提取右下角 | r.bl() |
判断点p是否在矩形r内 | r.contains(p) |
cv::Rect类的覆写操作符 | 示例 |
---|---|
矩形r1和矩形r2的交集 |
cv::Rect r3 = r1 & r2 r1 &= r2
|
同时包含矩形r1和矩形r2的最小面积矩形 |
cv::Rect r3 = r1 | r2 r1 |= r2
|
矩形r平移x |
cv::Rect r2 = r1 + x r1 += x
|
矩形r扩大s |
cv::Rect r2 = r1 + s r1 += s
|
比较矩形r1和矩形r2是否相等 | bool eq = (r1 == r2) |
比较矩形r1和矩形r2是否不相等 | bool ne = (r1 != r2) |
cv::RotateRect类支持的操作 | 示例 |
---|---|
默认构造函数 | cv::RotateRect rr() |
复制构造函数 | cv::RotateRect rr2(rr1) |
由两个点构造 | cv::RotateRect rr(p1,p2) |
值构造函数 | cv::Rect rr(p,sz,theta) |
成员访问 | rr.center rr.size rr.angle |
返回四个角的列表 | rr.points(pts[4]) |
cv::Complex类支持的操作 | 示例 |
---|---|
默认构造函数 |
cv::Complex z1 cv::Complexd z2
|
复制构造函数 | cv::Complex z2(z1) |
值构造函数 |
cv::Complexd z(re) cv::Complexd z(re,im)
|
成员访问 | z.re z.im |
复共轭 | z2 = z1.conj() |
cv::Matx类支持的操作 | 示例 |
---|---|
默认构造函数 |
cv::Matx33f m33f cv::Matx43d m43d
|
复制构造函数 | cv::Matx22d m22d(n22d) |
值构造函数 |
cv::Matx21f m(x0,x1) cv::Matx23f m(x0,x1,x2,x3,x4,x5) //2行3列,从左到右,从上到下
|
含相同元素的矩阵 | m33f = cv::Matx33f::all(x) |
全零矩阵 | m23d = cv::Matx23d::zeros() |
全一矩阵 | m16f = cv::Matx16f::ones() |
单位矩阵 | m33f = cv::Matx33f::eye() |
创建可容纳另一个矩阵对角线的矩阵 | m31f = cv::Matx33f::diag() |
创建一个均匀分布的矩阵 | m33f = cv::Matx33f::randu(min,max) |
创建一个正态分布的矩阵 | m33f = cv::Matx33f::nrandn(mean,variance) |
成员访问 | m(i,j) m(i) |
矩阵代数运算 | m1=m0 m0*m1 m0+m1 m0-m1 |
singleton代数 | m*a a*m m/a |
比较 | m1==m2 m1!=m2 |
点积 |
m1.dot(m2) m1.ddot(m2)
|
改变矩阵形状 | m91f = m33f.reshape<9,1>() |
变换操作符 | m44f = (cv::Matx44f) m44d |
提取(i,j)处2*2的子矩阵 | m44f.get_minor<2,2>(i,j) |
提取第i行 | m14f = m44f.row(i) |
提取第j列 | m41f = m44f.col(j) |
提取矩阵对角线 | m41f = m44f.diag() |
计算转置 | n44f = m44f.t() |
逆矩阵 | n44f = m44f.inv(method) |
解线性系统 |
m31f = m33f.solve(rhs31f,method) m32f = m33f.solve<2>(rhs32f,method)
|
每个元素的乘法 | m1.mul(m2) |
cv::Vec类支持的操作 | 示例 |
---|---|
默认构造函数 |
cv::Vec2s v2s cv::Vec6f v6f
|
复制构造函数 | cv::Vec3f u3f(v3f) |
值构造函数 |
cv::Vec2f v2f(x0,x1) cv::Vec6d v6d(x0,x1,x2,x3,x4,x5)
|
成员访问 | v4f[i] v3w[j] |
向量叉乘 | v3f.cross(u3f) |
cv::Scalar类支持的操作 | 示例 |
---|---|
默认构造函数 | cv::Scalar s |
复制构造函数 | cv::Scalar s2(s1) |
值构造函数 |
cv::Scalar s(x0) cv::Scalar s(x,0,x1,x2,x3)
|
元素相乘 | s1.mul(s2) |
四元数共轭 | s.conj() |
四元数真值测试 | s.isReal() |
3、辅助对象
辅助对象 | 作用 |
---|---|
cv::TermCriteria |
cv::TermCriteria(int type, int maxCount, double epsilon) 终止条件以确定何时退出 |
cv::Range |
cv::Range(int start, int end) 确定一个连续的整数序列 |
cv::Ptr |
cv::Ptr<Matx33f> p(new cv::Matx33f) cv::Ptr<Matx33f> p = makePtr<cv::Matx33f>() 智能指针 |
cv::Exception |
CV_Error(errorcode, description) CV_Error_(errorcode, printf_mt_str, [printf-args]) CV_Assert(condition) CV_DbgAssert(condition) 抛出异常,处理错误 |
cv::DataType<> | 传输特定数据类型 |
cv::InputArray cv::OutputArray cv::InputOutputArray cv::noArray |
常用于形参,可接受任意数组类型(如cv::Vec,cv::Mat等)作为初始值 |
4、工具函数
工具函数和系统函数 | 描述 |
---|---|
cvCeil(x) | 对浮点数向上取整 |
cvFloor(x) | 对浮点数向下取整 |
cvRound(x) | 计算与浮点数最接近的整数 |
cvIsInf(x) | 判断浮点数是否是正负无穷 |
cvIsNan(x) | 判断浮点数是否不是一个数 |
cv::fastAtan2(y,x) | 计算向量的二维角度(0~360) |
cv::cubeRoot(x) | 计算立方根 |
cv::format(fmt, ...) | 以sprintf类似,创建一个STL字符串 |
cv::getOptimalDFTSize(n) | 计算传递给cv::dft()的数组的最适宜大小 |
cv::alignPtr(ptr,n) | 对齐指针到给定字节数 |
cv::alignSize(sz,n) | 将缓冲区大小与给定的字节数对齐 |
cv::allocate(sz) | 与new类似,分配一个C风格的数组对象 |
cv::deallocate(ptr, sz) | 与delete类似,释放一个C风格的数组对象 |
cv::fastMalloc(size) | 与malloc类似,分配一个对齐的内存缓冲区 |
cv::fastFree(ptr) | 与free类似,释放一个cv::fastMalloc()分配的内存 |
cv::getCPUTickCount() | 获取CPU的tick数 |
cv::getTickCount() | 获取系统的tick数 |
cv::getTickFrequency() | 每秒的tick数 |
cv::setNumThreads(nthreads) | 设置使用的线程数 |
cv::getNumThreads() | 获取当前使用的线程数 |
cv::getThreadNum() | 获取当前执行的线程的索引 |
cv::setUseOptimized(on_off) | 开启或关闭代码优化功能 |
cv::useOptimized() | 判断是否开启代码优化 |
cv::CV_Assert(expt) cv::CV_DbgAssert(expt) |
判断expt,若为false则抛出异常 |
cv::CV_Error(ecode, estring) cv::CV_Error_(ecode, fmt, ...) |
构造cv::Exception并抛出一个异常 |
cv::error(ex) | 提示错误并抛出异常 |
5、模板结构
通用的固定长度模板 | 描述 |
---|---|
cv::Point_<Type T> | 包含两个对象的点,对象类型为T |
cv::Rect_<Type T> | 位置和宽高的类型均为T |
cv::Vec<Type T, int H> | 一个集合,元素的类型为T |
cv::Matx<Type T, int H, int W> | 一个H*W的矩阵,元素的类型为T |
cv::Scalar_<Type T> | 一个包含四个对象的集合(和cv::Vec<T,4>类似),对象类型为T |