移动语义和 cv::Mat
move semantics and cv::Mat
Opencv 关于cv::Mat
的文档似乎表明目前没有移动构造函数,所以像cv::Mat A=std::move(some_other_cv_mat)
这样的东西没有多大意义。我目前(和天真的(这个问题的解决方案是从cv::Mat
派生一个类,为此我实现了一个移动构造函数,如下所示:
namespace cv
{
//matrix object derived from cv::Mat
class Mvbl_Mat final: public Mat
{
public:
//constructors
Mvbl_Mat(){};
Mvbl_Mat(int rows, int cols, int type, const Scalar &s):Mat(rows, cols, type, s){}
//destructor
~Mvbl_Mat(){};
//move constructor
Mvbl_Mat(Mvbl_Mat && other) noexcept
{
this->data=other.data;
other.data=nullptr;
}
//move assignment operator
Mvbl_Mat & operator=(Mvbl_Mat && other)
{
this->data=other.data;
other.data=nullptr;
return *this;
}
};
}
虽然这适用于我目前面临的有限问题,但显然存在许多限制,解决方案远非理想。那么,模拟cv::Mat
移动语义的最佳方法是什么?
没有必要这样做。cv::Mat
的复制构造函数实际上并不复制数据。 它基本上是一个引用,所有对象共享相同的数据。
cv::Mat::Mat(const Mat & m(
这是一个重载成员函数,为方便起见而提供。它与上述函数的区别仅在于它接受的参数。
参数
m
(全部或部分(分配给构造矩阵的数组。这些构造函数不会复制任何数据。相反,指向 m 数据或其子数组的标头被构造并与之关联。引用计数器(如果有(将递增。因此,当您修改使用此类构造函数形成的矩阵时,您也修改了 m 的相应元素。如果你想有一个子数组的独立副本,请使用 Mat::clone((
从4.x开始,OpenCV提供了Mat (Mat &&m)
和Mat & operator= (Mat &&m)
。
如果您正在处理 4.x 之前的版本,我建议您查看modules/core/include/opencv2/core/mat.inl.hpp
中定义的cv::Mat
移动构造函数和移动赋值运算符实现,因为它比仅复制.data
成员要复杂一些。
相关文章:
- 将CHW格式的浮点向量转换为cv::Mat
- C++:从GPU内存(cudaMemcpy2D)获取BGR图像(cv::Mat)
- 选择基于另一个垫子的非零像素的cv::Mat的一部分?
- 将 cv::mat 转换为 QImage
- 将 cv::Mat 转换为 std::vector 的通用函数
- 在 QML VideoOutput 中将 cv::mat 显示为 QVideoFrame
- 如何将 cv::Mat & Img 复制到未签名的 char* img?opencv
- 如何将 cv::Mat 转换为 vtkImageData?
- 如何将 vtkImageData 转换为 cv::Mat?
- 如何总结所有cv::Mat元素
- Qt-工作线程崩溃时将cv::Mat转换为QImage
- 在 cv::Mat 中生成 2D 坐标网格
- 将 cv::Mat 转换为无符号的 int 像素
- OpenCV 分段错误(核心转储)在使用 cv::Mat::at 时
- 如何将多个 cv::Mat 从 c++ dll 传递到 opencvsharp Mat c#?
- OpenCV(3.4.1) 错误:断言失败(变暗 <= 2 && step[0] > 0) in cv::Mat::locateROI
- 如何在不复制数据的情况下将 cv::Mat 转换为 2d 标准::矢量
- 如何使用 (*mpORBextractorLeft)(im,cv::Mat(),mvKeys,mDescriptors)
- 从数组创建 Mat 时,'cv::Mat' 和 'int' 类型不兼容
- 如何将 cv::mat 对象从 python 模块传递到 c++ 函数并返回返回的 cv::mat 类型为对象?