将CV :: MAT转换为STD :: vector而无需复制
Convert cv::Mat to std::vector without copying
我有这个功能:
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);
}
}
相关文章:
- 创建一个没有复制构造函数的类的 std::vector 的 std::vector
- 使用赋值运算符复制 std::vector
- 除了 std::vector 之外,是否有一个 std 容器不会复制和销毁作为类的元素?
- 将 Vector<String > 元素复制到其他 Vector<String>* (1 作为
- push_back std::vector,则重复调用复制构造函数
- 如何使用 CUDA 将 std::vector<std::string> 复制到 GPU 设备
- 双重调用传递给 std::vector::emplace_back 的类的复制构造函数
- std::vector 是否有用于引用的复制构造函数?
- 如何禁用Visual Studio警告C4244,用于std::vector复制或使用隐式缩小转换进行赋值
- 根据条件将元素从 std::vector 复制到 std::set 但它崩溃了
- 将数据从 std::vector 复制到 Eigen's MatrixXd in C++
- 将std :: vector复制到std :: array
- 仅在发布版本中出错,从 std::vector 复制结构
- 将std::vector复制到qvector
- 如何将boost::numeric::ublas::vector复制到矩阵
- c++ vector复制赋值,调用其元素的复制机制
- 有趣的std::从std::vector复制到std::string的行为
- 使用memcpy将std::vector复制到protobuf中的重复字段
- 将 std::map<int, vector> 复制到 std::<int>map<std:string, vector<int>>
- 基于条件从vector复制元素