c++的一维vector 怎么转换为opencv的二维mat
时间: 2024-05-15 20:12:54 浏览: 5
将一维 `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++二维图像扶正
这里提供一种简单的C++实现方法,基于OpenCV库实现,具体步骤如下:
1. 安装OpenCV库,并导入头文件。
```c++
#include <opencv2/opencv.hpp>
using namespace cv;
```
2. 读取需要扶正的图像,并将其转换为灰度图像。
```c++
Mat img = imread("input.jpg");
Mat gray;
cvtColor(img, gray, COLOR_BGR2GRAY);
```
3. 使用霍夫变换检测图像中的直线特征。
```c++
vector<Vec2f> lines;
HoughLines(gray, lines, 1, CV_PI / 180, 100, 0, 0);
```
4. 根据直线的位置和方向,计算需要旋转的角度。
```c++
float angle = 0.0;
for (size_t i = 0; i < lines.size(); i++) {
float rho = lines[i][0], theta = lines[i][1];
if (theta < CV_PI / 4. || theta > 3.*CV_PI / 4.) {
angle = theta;
break;
}
}
```
5. 对图像进行旋转,将直线旋转到水平方向。
```c++
Mat rotated;
Point2f pt(img.cols / 2., img.rows / 2.);
Mat r = getRotationMatrix2D(pt, angle * 180 / CV_PI, 1.0);
warpAffine(img, rotated, r, img.size());
```
6. 根据需要,进行图像的裁剪或者填充操作,得到最终的扶正图像。
```c++
Mat result;
if (rotated.cols > rotated.rows) {
int y = (rotated.cols - rotated.rows) / 2;
result = rotated(Rect(y, 0, rotated.rows, rotated.rows));
}
else {
int x = (rotated.rows - rotated.cols) / 2;
result = rotated(Rect(0, x, rotated.cols, rotated.cols));
}
```
完整的代码如下:
```c++
#include <opencv2/opencv.hpp>
using namespace cv;
int main() {
Mat img = imread("input.jpg");
Mat gray;
cvtColor(img, gray, COLOR_BGR2GRAY);
vector<Vec2f> lines;
HoughLines(gray, lines, 1, CV_PI / 180, 100, 0, 0);
float angle = 0.0;
for (size_t i = 0; i < lines.size(); i++) {
float rho = lines[i][0], theta = lines[i][1];
if (theta < CV_PI / 4. || theta > 3.*CV_PI / 4.) {
angle = theta;
break;
}
}
Mat rotated;
Point2f pt(img.cols / 2., img.rows / 2.);
Mat r = getRotationMatrix2D(pt, angle * 180 / CV_PI, 1.0);
warpAffine(img, rotated, r, img.size());
Mat result;
if (rotated.cols > rotated.rows) {
int y = (rotated.cols - rotated.rows) / 2;
result = rotated(Rect(y, 0, rotated.rows, rotated.rows));
}
else {
int x = (rotated.rows - rotated.cols) / 2;
result = rotated(Rect(0, x, rotated.cols, rotated.cols));
}
imshow("input", img);
imshow("output", result);
waitKey();
return 0;
}
```
需要注意的是,上述代码中的参数都是示例值,需要根据具体情况进行调整。同时,由于上述算法依赖于直线特征的检测,因此如果图像中没有明显的直线特征,可能无法得到准确的扶正结果。
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` 对象。