【发布时间】:2017-09-29 07:50:50
【问题描述】:
我有这个功能:
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。我希望是这个原因。
顺便说一句,正如我在this 问题中发现的那样,cv::Mat 将被对齐。所以一个简单的解决方法是:
- 创建
cv::Mat res(m,n) - 致电
foo(m); - 将
vec指针分配给m.ptr<float>(0)
正如您可以想象的那样,这里的性能至关重要,因此深拷贝是不可能的。
我试过this问题中的代码:
vec = res.data;
但是我得到一个编译器错误。此外,我不知道上面的这段代码是否会进行(低效)复制,或者只是将指向的数据更改为vec。
我怎样才能顺利地做到这一点?否则,将不胜感激另一种解决方法。
【问题讨论】:
标签: c++ opencv vector alignment mat