OpenCv 将矢量转换为矩阵C++
OpenCv convert vector to matrix C++
我正在尝试使用 c++ opencv 将向量转换为 (128*128(矩阵这是代码
Mat image = imread("1.jpg", 0);
vector<double> vec ImgVec[i].assign(image.datastart, image.dataend);
vector<double> avgFace = calAvgFace(vec);
Mat img=avgFace;
代码的最后一行不正确,但它只是一个示例。
虽然之前已经提出过同样的问题并得到了回答,例如:
- https://stackoverflow.com/a/20981227/5008845
- https://stackoverflow.com/a/13706190/5008845
我认为仍然缺少对明显解决方案的明确解释。因此我的回答。
OpenCV提供了两种简单的方法,使用Mat
构造函数将std::vector
转换为cv::Mat
:
- 接受指向数据的指针的构造函数
- 接受
std::vector
的构造函数。
您可以创建矢量数据的副本(如果修改vector
,则Mat
中的数据将保持不变(,也可以创建矢量中内容的Mat
视图(如果修改vector
,Mat
将显示更改(。
请查看此代码。首先,我创建一个随机的双精度Mat
,并在vector
中复制。然后应用一些接受此向量并返回新向量的函数。这只是为了使代码与您的要求保持一致。然后,您可以看到如何从std::vector
获取cv::Mat
,无论是否复制数据。
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
vector<double> foo(const vector<double>& v)
{
// Apply some operation to the vector, and return the result
vector<double> result(v);
sort(result.begin(), result.end());
return result;
}
int main()
{
// A random CV_8UC1 matrix
Mat1d dsrc(128,128);
randu(dsrc, Scalar(0), Scalar(1));
imshow("Start double image", dsrc);
waitKey();
// Get the vector (makes a copy of the data)
vector<double> vec(dsrc.begin(), dsrc.end());
// Apply some operation on the vector, and return a vector
vector<double> res = foo(vec);
// Get the matrix from the vector
// Copy the data
Mat1d copy_1 = Mat1d(dsrc.rows, dsrc.cols, res.data()).clone();
// Copy the data
Mat1d copy_2 = Mat1d(res, true).reshape(1, dsrc.rows);
// Not copying the data
// Modifying res will also modify this matrix
Mat1d no_copy_1(dsrc.rows, dsrc.cols, res.data());
// Not copying the data
// Modifying res will also modify this matrix
Mat1d no_copy_2 = Mat1d(res, false).reshape(1, dsrc.rows);
imshow("Copy 1", copy_1);
imshow("No Copy 1", no_copy_1);
waitKey();
// Only no_copy_1 and no_copy_2 will be modified
res[0] = 1.0;
imshow("After change, Copy 1", copy_1);
imshow("After change, No Copy 1", no_copy_1);
waitKey();
return 0;
}
相关文章:
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 复制列表初始化的隐式转换的等级是多少
- 正在将指针转换为范围
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 是否可以从int转换为enum类类型
- 了解 GLM- openGL 中的相机转换
- 将无符号char*转换为std::istream*C++