文件处理
跳转到“文件处理”1)cv::glob()
cv::glob 是 OpenCV 库中的一个函数,用于获取指定目录下的所有文件(或满足特定模式的文件)。它的函数签名如下:
void cv::glob(String pattern, std::vector<String>& result, bool recursive = false);参数说明:
pattern:文件模式字符串,可以包含通配符,例如 “images/*.jpg”。result:一个字符串向量,用于存储匹配的文件名。recursive:一个布尔值,指定是否递归搜索子目录。
例如,如果你想获取 “images/” 目录下所有的 “.jpg” 文件,可以这样使用 cv::glob:
std::vector<String> filenames;cv::glob("images/*.jpg", filenames);Mat一般用法
跳转到“Mat一般用法”GitHub Copilot: Mat 是 OpenCV 中的一个核心数据结构,用于存储图像或者矩阵。它的全名是 Matrix,即矩阵的意思。Mat 对象不仅可以存储二维图像,还可以存储三维图像和更高维度的数据。
cv::Mat image = cv::Mat::zeros(8400, 38, CV_8UC3); // [h, w]:(8400, 38)std::cout << image.size()<< std::endl; // [38 x 8400]
| 属性 / 功能 | 说明 | 示例代码 |
|---|---|---|
| 数据类型 | 存储不同类型的数据 | Mat A = Mat::zeros(3, 3, CV_32F); |
| 通道数 | 存储多通道数据 | Mat B = Mat::zeros(3, 3, CV_8UC3); |
| 尺寸 | 存储任意尺寸的数据 | Mat C = Mat::ones(10, 10, CV_32F); |
| 连续性 | 数据在内存中可能是连续或非连续的 | Mat D = C.clone(); // D的数据在内存中是连续的 |
| 子矩阵 | 表示大矩阵的一部分 | Mat E = C(Range(0,5), Range(0,5)); // E是C的一个子矩阵 |
| 数据共享 | Mat对象之间可以共享数据 | Mat F = C; // F和C共享数据 |
| 自动内存管理 | 自动管理内存,无引用时自动释放 | Mat G; // G是一个空矩阵,不占用任何内存 |
| 函数操作 | OpenCV提供的多种矩阵操作函数 | Mat H = C + 1; // 对C中的每个元素加1 |
| 方法/属性 | 示例 | 说明 |
|---|---|---|
zeros | Mat A = Mat::zeros(3, 3, CV_32F); | 创建一个全零矩阵 |
ones | Mat::ones(3, 3, CV_32F); | 创建一个全一矩阵 |
eye | Mat::eye(3, 3, CV_32F); | 创建一个单位矩阵 |
at (访问) | float value = A.at<float>(0, 0); | 访问指定位置的元素 |
at (修改) | A.at<float>(0, 0) = 1.0; 注意顺序是(h, w) | 修改指定位置的元素 |
rows | int rows = A.rows; | 获取矩阵的行数 |
cols | int cols = A.cols; | 获取矩阵的列数 |
clone | Mat B = A.clone(); | 创建矩阵的副本 |
Range | Mat C = A(Range(0, 2), Range(0, 2)); | 创建子矩阵 |
convertTo | A.convertTo(A, CV_32F); | 转换矩阵的类型 |
+ - * / | Mat D = A + B; | 矩阵的算术操作 |
create | mat.create(3, 3, CV_32F); | 创建一个新的矩阵 |
empty | if (mat.empty()) { cout << "Matrix is empty" << endl; } | 检查矩阵是否为空 |
size | Size s = mat.size(); Size s = mat.size().width; Size s = mat.size().height; | 获取矩阵的尺寸 |
type | int t = mat.type(); | 获取矩阵的类型 |
channels | int c = mat.channels(); | 获取矩阵的通道数 |
reshape | Mat reshaped = mat.reshape(1); | 改变矩阵的通道数和/或行数 |
row col | Mat r = mat.row(0); | 获取矩阵的指定行或列 |
t | Mat transposed = mat.t(); | 转置矩阵 |
inv | Mat inverse = mat.inv(); | 计算矩阵的逆 |
mul | Mat result = mat.mul(mat); | 执行矩阵的按元素乘法 |
dot cross | double dot_product = mat.dot(mat); | 计算矩阵的点积和叉积 |
Mat 属性
跳转到“Mat 属性”| 属性 | 描述 | 示例 |
|---|---|---|
| .data | 是一个指向数据的指针 | |
| 方法(成员函数) | ||
size_t cv::Mat::total() const | Returns the total number of array elements.(单通道) | size_t cv::Mat::total(int startDim, int endDim = INT_MAX )const |
convertTo() | 数组转换为另一种数据类型,可选scale | void cv::Mat::convertTo(OutputArray m, int rtype, double alpha = 1,double beta = 0) const |
| .ptr() | 它用于获取指向矩阵特定行或元素的指针。有20个重载 | template const _Tp * cv::Mat::ptr(int row, int col) const |
cv::Mat img_640 = cv::Mat::zeros(640, 640, CV_8UC3);src = img_640; // 其中src是(480, 640)// 显示std::cout << bbox.data << std::endl; // 显示为空,ptr 不是标准的输入输出格式。std::cout << bbox << std::endl; // 直接输出,因为Mat 重载了,可以想python显示numpy那样显示出来。