将CV :: MAT转换为STD :: vector而无需复制



我有这个功能:

void foo(cv::Mat &mat){
  float *p = mat.ptr<float>(0);
  //modify mat values through p
}

我有此代码称为函数:

void bar(std::vector<unsigned char> &vec){
  //...
  cv::Mat res(m, n, CV_32FC1, (void *)&workspace.front());
}

但是,上面的代码存在性能问题:vec可能不会对齐。实际上,英特尔编译器说reference *out has unaligned access。我希望这是原因。

btw,正如我在这个问题中发现的那样,cv::Mat将被对齐。因此,一个简单的解决方法是:

  1. 创建cv::Mat res(m,n)
  2. 致电foo(m);
  3. vec指针分配给m.ptr<float>(0)

您可以想象,此处的表现至关重要,因此深深的问题是无问题的。

我在此问题中尝试了代码:

vec = res.data;

,但我发现编译器错误。此外,我不知道以上代码是否会进行(效率低下(的副本,或者只是通过vec更改指向数据。

我该如何顺利这样做?否则,将不胜感激。

在此处查看

std::vector<uchar> array;
if (mat.isContinuous()) {
  array.assign(mat.datastart, mat.dataend);
} else {
  for (int i = 0; i < mat.rows; ++i) {
    array.insert(array.end(), mat.ptr<uchar>(i), mat.ptr<uchar>(i)+mat.cols);
  }
}
//p.s.: For cv::Mats of other types, like CV_32F, you should do like this:
std::vector<float> array;
if (mat.isContinuous()) {
  array.assign((float*)mat.datastart, (float*)mat.dataend);
} else {
  for (int i = 0; i < mat.rows; ++i) {
    array.insert(array.end(), (float*)mat.ptr<uchar>(i), (float*)mat.ptr<uchar>(i)+mat.cols);
  }
}

最新更新