我有这个功能:
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
将被对齐。因此,一个简单的解决方法是:
- 创建
cv::Mat res(m,n)
- 致电
foo(m);
- 将
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);
}
}