从 std::vector 创建 OpenCV 垫子的有效方法

efficient way to create an opencv mat from std::vector

本文关键字:有效 方法 OpenCV std vector 创建      更新时间:2023-10-16

如果我想从 std::vector 创建一个 opencv 垫子,我使用以下函数:

Mat::Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP)
vector<double> myData;
cv::Mat m(100, 100, 1, myData.data(), myData.size())

这个构造函数不复制数据,所以当向量是 temp 并且我们返回 mat 时,mat 有无效的数据,所以我返回它的克隆,这是低效的。

void doProcessing()
{
//...
Mat m = getMat(12.2, 144, ...);
cout<< m.at<double>(0,0);
//...
}
Mat getMat(some parameters){
vector<double> myData;
//do some processing on parameters and myData
cv::Mat m(100, 100, 1, myData.data(), myData.size());
return m.clone();
}

有没有更好的方法?如何使用 std::move 只移动指针? 我不想复制数据,只想在 O(1( 中移动矢量数据指针。

为什么不重构,以便getMat返回一个向量,并在稍后doProcessing()将向量转换为cv::Mat

void doProcessing()
{
//...
vector<double> v = getMat(12.2, 144, ...);
cv::Mat m(100, 100, 1, myData.data(), myData.size());
cout<< m.at<double>(0,0);
//...
}
vector<double> getMat(some parameters){
vector<double> myData;
//do some processing on parameters and myData
return myData;
}