如果我想从std :: vector创建一个opencv mat,我使用以下函数:
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())
这个构造函数不会复制数据,所以当向量是临时的并且我们返回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)中移动矢量数据指针。
答案 0 :(得分:0)
为什么不进行重构,以便getMat
返回一个向量,然后在cv::Mat
中将向量转换为doProcessing()
:
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;
}