OpenCv 将矢量转换为矩阵C++

OpenCv convert vector to matrix C++

本文关键字:C++ 转换 OpenCv      更新时间:2023-10-16

我正在尝试使用 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视图(如果修改vectorMat将显示更改(。

请查看此代码。首先,我创建一个随机的双精度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;
}