c++的一维vector 怎么转换为opencv的二维mat
时间: 2024-05-15 18:12:54 浏览: 128
将一维 `vector` 转换为二维 `Mat` 需要确定 `Mat` 的行数和列数,然后将 `vector` 中的元素按照行列顺序填入到 `Mat` 中。假设 `vector` 的长度为 `len`,`Mat` 的行数为 `rows`,列数为 `cols`,则转换代码如下:
```c++
#include <opencv2/opencv.hpp>
#include <vector>
using namespace cv;
using namespace std;
int main()
{
vector<int> vec(len); // 声明一维 vector
Mat mat(rows, cols, CV_32S); // 声明二维 Mat
// 将 vector 转换为 Mat
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
mat.at<int>(i, j) = vec[i * cols + j];
}
}
return 0;
}
```
其中,`at<int>(i, j)` 表示访问 `Mat` 中第 `i` 行、第 `j` 列的元素,`i * cols + j` 表示计算 `vector` 中对应元素的下标。
相关问题
c++实现二维catmull细分算法,并用opencv实现可视化
二维Catmull-Rom细分算法实现:
```c++
#include <iostream>
#include <vector>
#include "opencv2/opencv.hpp"
using namespace cv;
using namespace std;
vector<Point2f> catmullRom(vector<Point2f> points, float alpha) {
vector<Point2f> result;
for (int i = 1; i < points.size() - 2; i++) {
Point2f p0 = points[i - 1];
Point2f p1 = points[i];
Point2f p2 = points[i + 1];
Point2f p3 = points[i + 2];
float t0 = 0;
float t1 = powf(powf((p1.x - p0.x), 2.0f) + powf((p1.y - p0.y), 2.0f), 0.5f);
float t2 = t1 + powf(powf((p2.x - p1.x), 2.0f) + powf((p2.y - p1.y), 2.0f), 0.5f);
float t3 = t2 + powf(powf((p3.x - p2.x), 2.0f) + powf((p3.y - p2.y), 2.0f), 0.5f);
for (float t = t1; t < t2; t += alpha) {
float a1 = (t1 - t) / (t1 - t0);
float a2 = (t - t0) / (t1 - t0);
Point2f p = a1 * p0 + a2 * p1;
a1 = (t2 - t) / (t2 - t1);
a2 = (t - t1) / (t2 - t1);
p += a1 * p1 + a2 * p2;
a1 = (t3 - t) / (t3 - t2);
a2 = (t - t2) / (t3 - t2);
p += a1 * p2 + a2 * p3;
p *= 0.5f;
result.push_back(p);
}
}
return result;
}
int main(int argc, char** argv) {
vector<Point2f> points = { Point2f(100, 100), Point2f(200, 100), Point2f(200, 200), Point2f(100, 200) };
float alpha = 0.01f;
vector<Point2f> result = catmullRom(points, alpha);
Mat img = Mat::zeros(300, 300, CV_8UC3);
for (int i = 0; i < points.size(); i++) {
circle(img, points[i], 3, Scalar(0, 255, 0), -1);
}
for (int i = 0; i < result.size(); i++) {
circle(img, result[i], 1, Scalar(0, 0, 255), -1);
}
for (int i = 0; i < points.size() - 1; i++) {
line(img, points[i], points[i + 1], Scalar(0, 255, 0), 1);
}
for (int i = 0; i < result.size() - 1; i++) {
line(img, result[i], result[i + 1], Scalar(0, 0, 255), 1);
}
imshow("Catmull-Rom", img);
waitKey(0);
return 0;
}
```
这里我们先定义了一个`catmullRom`函数来实现二维Catmull-Rom细分算法。传入参数为一个点集和步长alpha,返回值为细分后的点集。在函数内部,我们首先对每个点进行处理,得到其所在的四个点p0、p1、p2、p3和其各自在总长度上的位置t0、t1、t2、t3。接着,我们对p1和p2之间的一段进行细分,每次细分按照步长alpha进行。
在`main`函数中,我们传入一个点集和步长alpha,得到细分后的点集,并在图像上绘制出来。
运行结果如下:
![catmull-rom](https://s1.ax1x.com/2020/03/31/GUhOY9.png)
c++ 用vector创建的二维数组怎么用cv::FileStorage进行保存
使用 `cv::FileStorage` 保存二维 vector 数组需要进行以下步骤:
1. 创建一个 `cv::FileStorage` 对象,使用其构造函数指定文件名和文件格式(如 `.yaml` 或 `.xml`)。
2. 创建一个 `cv::Mat` 对象,将其中的数据设置为二维 vector 数组中的数据。
3. 将 `cv::Mat` 对象写入到 `cv::FileStorage` 对象中。
4. 关闭 `cv::FileStorage` 对象。
以下是一个示例代码:
```c++
#include <opencv2/opencv.hpp>
#include <vector>
int main()
{
// 创建一个二维 vector 数组
std::vector<std::vector<int>> vec{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
// 创建一个 cv::FileStorage 对象
cv::FileStorage fs("data.yaml", cv::FileStorage::WRITE);
// 创建一个 cv::Mat 对象
cv::Mat mat(vec);
// 将 cv::Mat 对象写入到 cv::FileStorage 对象中
fs << "data" << mat;
// 关闭 cv::FileStorage 对象
fs.release();
return 0;
}
```
在此示例中,我们使用 `cv::Mat` 对象将二维 vector 数组转换为了矩阵,然后将矩阵写入到了 `cv::FileStorage` 对象中。在保存完成后,我们需要调用 `release()` 方法关闭 `cv::FileStorage` 对象。
阅读全文