OpenCV Mat对象复制速度加快 最近我从OpenCV Python切换到OpenCV的C++版本,因为我想用CUDA加速我的实时视频处理应用程序。我是C++新手,所以在优化代码时发现了一些内存管理不明确的时刻。

OpenCV Mat对象复制速度加快 最近我从OpenCV Python切换到OpenCV的C++版本,因为我想用CUDA加速我的实时视频处理应用程序。我是C++新手,所以在优化代码时发现了一些内存管理不明确的时刻。,c++,opencv,video-processing,C++,Opencv,Video Processing,例如,我有一些过滤链,如下所示: void apply_blue_edgess(cv::Mat& matrix, cv::Mat& mask, cv::Mat& inverted_mask) { cv::Mat gray_image, blured, canny, canny_3d, in_range_mask; cv::cvtColor( matrix, gray_image, CV_BGR2GRAY ); cv::Gaussia

例如,我有一些过滤链,如下所示:

void apply_blue_edgess(cv::Mat& matrix, cv::Mat& mask, cv::Mat& inverted_mask) {

      cv::Mat gray_image, blured, canny, canny_3d, in_range_mask;

      cv::cvtColor( matrix, gray_image, CV_BGR2GRAY );
      cv::GaussianBlur( gray_image, blured, cv::Size( 5, 5 ), 0, 0 );
      cv::Canny(blured, canny, 0, 100);
      cv::cvtColor( canny, canny_3d, CV_GRAY2BGR );
      cv::inRange(canny_3d, cv::Scalar(255,255,255), cv::Scalar(255,255,255), in_range_mask);
      canny_3d.setTo(cv::Scalar(0, 171, 255), in_range_mask);
      cv::GaussianBlur( canny_3d, matrix, cv::Size( 5, 5 ), 0, 0 );
      cv::bitwise_and(matrix, mask, matrix);
}
在过滤链的每一步使用新的Mat对象可以吗?灰度图像、模糊、canny、canny\u 3d、in\u range\u mask?这种连续的内存分配对性能有害吗?如果是这样,我应该如何编写类似的函数

正如评论部分所建议的,我最终做了函子包装:


您可以在不分配内存的情况下重用内存。创建时间图像:

  void apply_blue_edgess(cv::Mat& matrix, cv::Mat& mask, cv::Mat& inverted_mask)
  {
        cv::Mat tmp[2];
        int srcInd = 1;
        auto InvInd = [&]() -> int { return srcInd ? 0 : 1; };
        cv::cvtColor( matrix, tmp[InvInd()], CV_BGR2GRAY );
        srcInd = InvInd();
        cv::GaussianBlur( tmp[srcInd], tmp[InvInd()], cv::Size( 5, 5 ), 0, 0 );
        srcInd = InvInd();
        cv::Canny(tmp[srcInd], tmp[InvInd()], 0, 100);
        srcInd = InvInd();
        cv::cvtColor( tmp[srcInd], tmp[InvInd()], CV_GRAY2BGR );
        srcInd = InvInd();
        cv::inRange(tmp[srcInd], cv::Scalar(255,255,255), cv::Scalar(255,255,255), tmp[InvInd()]);
        tmp[srcInd].setTo(cv::Scalar(0, 171, 255), tmp[InvInd()]);
        cv::GaussianBlur( tmp[srcInd], matrix, cv::Size( 5, 5 ), 0, 0 );
        cv::bitwise_and(matrix, mask, matrix);
  }

在C++中,这将分配内存超过必要的,但我不认为这将是瓶颈。@ Apple苹果从个人经验来看,开销是相当可观的。像往常一样,最好进行一些实际测量。假设使用相同大小的图像重复调用此函数,则在后续函数调用中重用临时变量可能会很有用,例如,将其转换为函子并使这些Mat成员变量成为函子。@DanMašek重复调用此函数的好处是:@DanMašek,谢谢!我没听说过函子的概念before@luddite478一个具有类似效果的简单更改是使用静态局部变量,但我不建议将其用于gpumat,这可能会导致麻烦。
  void apply_blue_edgess(cv::Mat& matrix, cv::Mat& mask, cv::Mat& inverted_mask)
  {
        cv::Mat tmp[2];
        int srcInd = 1;
        auto InvInd = [&]() -> int { return srcInd ? 0 : 1; };
        cv::cvtColor( matrix, tmp[InvInd()], CV_BGR2GRAY );
        srcInd = InvInd();
        cv::GaussianBlur( tmp[srcInd], tmp[InvInd()], cv::Size( 5, 5 ), 0, 0 );
        srcInd = InvInd();
        cv::Canny(tmp[srcInd], tmp[InvInd()], 0, 100);
        srcInd = InvInd();
        cv::cvtColor( tmp[srcInd], tmp[InvInd()], CV_GRAY2BGR );
        srcInd = InvInd();
        cv::inRange(tmp[srcInd], cv::Scalar(255,255,255), cv::Scalar(255,255,255), tmp[InvInd()]);
        tmp[srcInd].setTo(cv::Scalar(0, 171, 255), tmp[InvInd()]);
        cv::GaussianBlur( tmp[srcInd], matrix, cv::Size( 5, 5 ), 0, 0 );
        cv::bitwise_and(matrix, mask, matrix);
  }