C++ 使用cv_BGR2HSV的cv::cvtColor中存在潜在内存泄漏

C++ 使用cv_BGR2HSV的cv::cvtColor中存在潜在内存泄漏,c++,ios,opencv,memory,memory-management,C++,Ios,Opencv,Memory,Memory Management,在视频处理算法的上下文中,使用cv_BGR2GRAY和cv_BGR2HSV反复调用cv::cvtColor时,我发现iPad3上的内存使用情况有着根本不同,我想了解一下这是为什么,或者如何避免每次调用cvtColor时出现线性内存增长 以下是我为测试和本问题中的上下文编写的简化代码: - (void) processImage:(cv::Mat &)image { processor.process(image, output); image = output; } 输

在视频处理算法的上下文中,使用cv_BGR2GRAY和cv_BGR2HSV反复调用cv::cvtColor时,我发现iPad3上的内存使用情况有着根本不同,我想了解一下这是为什么,或者如何避免每次调用cvtColor时出现线性内存增长

以下是我为测试和本问题中的上下文编写的简化代码:

- (void) processImage:(cv::Mat &)image {
    processor.process(image, output);
    image = output;
}
输出被定义为该方法所在类的一部分。处理器类定义为:

class TestFrameProcessor {
public:
    cv::Mat tmp;
    cv::Scalar green;
    TestFrameProcessor(void):
        green(0,255,0) {
    }

    void process(cv:: Mat &input, cv:: Mat &output) {
        cv::cvtColor(input, tmp, CV_BGR2HSV);
        output = green;
    }
};
这段代码只是为了说明我不必做任何有价值的事情的问题。当我使用CV_BGR2GRAY作为转换类型时,我得到如下内存配置文件:

最大值约为21MB,平均值约为10MB

当我使用CV_BGR2HSV时,我会得到如下内存配置文件:

峰值约为225 MB,最小值约为12 MB。我关心的是使用BGR2HSV转换时内存使用量的线性增长。在这个特定的运行中,OpenCV中似乎发生了内存清理,但是我也有过这样的运行(没有获得配置文件的屏幕上限),内存无限增长,直到所有系统内存都用完,应用程序以不正常的方式死亡

问题是:

  • 我是否误用了cv::Mat对象或cvtColor?我应该叫释放吗
  • 有没有人在使用cvtColor之前见过这种类型的内存使用情况
  • 如果是,有没有办法避免
  • OpenCV实现cvtColor是否存在已知内存问题

(我希望其他人知道答案,或者拥有比我更好的谷歌搜索技能)

这样的讨论应该直接进行到合适的人可以给予你关注的地方。结果发现,这是iOS OpenCV摄像头捕获代码的内存问题,而不是cvtColor。一旦我从使用OpenCV版本切换到本机AVCaptureSession并手动管理图像数据,内存问题就消失了。