OpenCV 数据结构

这篇博客详细介绍了OpenCV中的数据结构,重点关注矩阵类Mat的创建、数据类型、属性、操作及元素访问。此外,还提到了InputArray类的使用以及迭代算法的相关概念。内容包括Mat的创建矩阵、数据类型、属性、行/列切片、矩阵拼接、类型转换、区域选择(ROI)等操作,以及InputArray的创建和应用。
摘要由CSDN通过智能技术生成

OpenCV 数据结构

矩阵类

Mat

创建矩阵
  1. 行列方式:指明矩阵的维度和数据类型,并且赋值为常数。
  2. 拷贝创建方式:从其它矩阵拷贝、切片过来。可以利用 Rect(获取 ROI)、Range (在不同维度上切片)、void* data (给定数据的地址)得到。
  3. vectorarray得到
数据类型

CV_[bit](U|S|F)C[channels]: U——无符号数;S——有符号整形;F——浮点数。

属性
  • depth:每一个像素的精度,与 bit 数有关,与图像通道数无关。

这个可以在图像滤波中用到,函数中传入参数 ddepth 就指明输出矩阵的精度。

  • step:矩阵中每一行的字节数 / step1 :每一通道的字节数。

用作指针遍历矩阵时,跨行索引的标准。

操作
  1. 行、列切片:rowRange \ colRange
  2. 矩阵拼接:push_back
  3. 矩阵变形: reshape \ resize
  4. 类型转换: convertTo
  5. 重新分配空间:create 相当于重新声明一个新的大小和类型的矩阵,预先分配空间。
  6. 区域选择(ROI):一是在定义 Mat 变量时;二是用 iamge(Range(), Range())
  7. 赋统一数值:setTo
  8. 提取 ROI:参考 () 运算符 ,支持 Rect 类索引和 Range 类(行列范围)。
矩阵创建
  1. 创建一定维数的空矩阵
  2. 采用 void* data 浅拷贝创建矩阵
  3. 采用 Rect 选取 MatROI (见 Mat 构造函数)
  4. 采用 << 创建

第四种方法如下所示:
Mat a = (Mat_<double>(3, 3) << 0, 1, 2, 3, 4, 5, 6, 7, 8);
本质上是先使用
MatCommaInitializer_<T>& operator,(T2 v);创建 MatCommaInitializer_<T>
再重载 , 运算符 MatCommaInitializer_<T>& operator,(T2 v);
之后用这个来初始化 Mat

访问元素
  1. at 访问: 访问时需要指定类型。矩阵类型与 C 类型对应[关系](OpenCV: cv::Mat Class Reference) 。通道数与 Vec 的维数相同。
image.at<uchar>(j, i) = 255; // CV_8UC1 Image

image.at<Vec3b>(j, i)[0] = 255; // CV_8UC3 Image
image.at<Vec3b>(j, i)[1] = 255;
image.at<Vec3b>(j, i)[2] = 255;

at 需要指定类型原因在于编译时,不知道矩阵的实际类型。如果用 Mat_ 类实际指明,则不需要额外指明类型。

cv::Mat_<uchar> im2(image);
im2(j, i) = 255;
  1. 指针访问
uchar* data = image.ptr<uchar>(j); // acquire thr row j address
for(int i = 0; i < image.cols; i++)
    data[i] = ... // offset col j, 

data = image.data + j * image.step + i * image.elemSize(); // j row & i col offset

如果当矩阵数据在内存空间中是连续的(Mat::isContinuous() 函数返回 True)可以将矩阵看成一个一维的数组,直接用指针偏移访问。

InputArray

InputArray 类可以由 Mat, Mat_<T>, Matx<T, m, n>, std::vector<T>, std::vector<std::vector<T> >, std::vector<Mat>, std::vector<Mat_<T>>, UMat, std::vector<UMat> 或者 double创建。也可以传入 GPU 矩阵。

  1. 传入空矩阵可以用 cv::noArray() 或者 cv::Mat()
  2. 这个类仅是用来传递参数,不应该在实际运算中使用。
使用

使用 kind() 或者 is*() 方法判断传入具体参数类型;使用 get*() 获取具体的数据。

Iterative Algorithm

TermCriteria

TermCriteria 类确定了迭代算法终止条件。终止条件分为两种:

  1. 迭代次数(MaxCount)
  2. 精度(Eps)

从其构造函数可以看出:传入两个参数 maxCountepsilon确定终止条件,type则是选择终止条件。可以选择 cv::TermCriteria::Type::MAX_CPUNTcv::TermCriteria::Type::EPS。(同时选择是或操作)

从具体解析来看,会将 type 标志位比较,如果选中,则读取输入值,否则选择默认值。

if( !(termcrit.type & CV_TERMCRIT_ITER) )
    termcrit.maxCount = 5;
termcrit.maxCount = MAX(termcrit.maxCount,1);
termcrit.maxCount = MIN(termcrit.maxCount,100);
if( !(termcrit.type & CV_TERMCRIT_EPS) )
    termcrit.epsilon = 1.f;
termcrit.epsilon = MAX(termcrit.epsilon, 0.f);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值