c++ - cv::Mat::clone() 是否比分配由 cv::Mat::zeros() 创建的矩阵更有效?

标签 c++ opencv

我有一个在应用程序生命周期中执行多次的函数。为了优化代码,哪种方案更好?
这是:

void foo() {
    static const cv::Mat zeroMat16 = cv::Mat::zeros(rows, cols, CV_16UC1);
    cv::Mat newMat = zeroMat16.clone();
    ...
}
比这更快:
void foo() {
    cv::Mat newMat = cv::Mat::zeros(rows, cols, CV_16UC1);
    ...
}
还是效率差不多?

最佳答案

clone 在其实现中使用不带掩码的 copyTo

inline Mat Mat::clone() const
{
  Mat m;
  copyTo(m);
  return m;
}
copyTo implementation -> memcpy

zeros implementation
->
makeExpr
->
MatExpr
然后从 MatExpr 转换为 Mat MatExpr::operator Mat()
->
assign
调用 m = Scalar(); Mat::operator=
->
memset

memcpy is only slighly slower than memset
(约 0.2 秒超过 1 GB 数据),
结果 zeros copyTo 稍快。

结论:
通过使用 zeros 而不是 clone
  • 防止不必要的内存分配。
  • 性能提升非常轻微。
  • 关于c++ - cv::Mat::clone() 是否比分配由 cv::Mat::zeros() 创建的矩阵更有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64424885/

    相关文章:

    c++ - 无效的对象访问 C++

    c++ - 在 C++ 控制台窗口中显示表格

    c++ - 确定范围内的元素放置在连续内存中

    c++ - Visual Studio 2015 中的警告 C4594

    python - 图像处理 : Bad Quality of Disparity Image with OpenCV

    c++ - 用于定位对象的序列化和数据库技术

    android - 在 C++ OpenCV 中查找倾斜角度并旋转图像

    c++ - 图像处理 : Mean of line sample

    image - OpenCV和Matlab之间的像素值略有差异

    python - 如何正确使用 `cv2.putText`在图片上绘制中文文字? (Python+OpenCV)