覆盖cv :: Mat数据的最佳方法

时间:2015-03-09 13:53:03

标签: c++ opencv

目前我有类似的东西,因为我在OpenCV Mat API上找不到更好的快速扫描:

cv::Mat frame_mat(width, height, CV_8UC3);

for(;;) {
    // Obtain raw data
    frame_mat = cv::Mat(height, width, CV_8UC3, raw_data);
    // Use frame_mat
}

它看起来并不具有资源友好性,在高级别它似乎在每次迭代时为临时cv::Mat对象分配和释放内存,只是为了设置一个全局的。

我应该如何直接设置free_mat

2 个答案:

答案 0 :(得分:2)

您不需要在循环之外分配任何内容。你的代码应该是:

for(;;) {
    // Obtain raw data
    Mat frame_mat(height, width, CV_8UC3, raw_data);
    // Use frame_mat
}

在这种情况下,frame_mat只是raw_data的包装器,允许您将其传递给OpenCV函数。除了一个很小的常量标题之外,它不会分配任何内存。也不允许取消分配未分配的内存,因此不要忘记在范围的末尾发布raw_data。

另请注意,如果更改frame_mat中的像素值,则会更改raw_data。

答案 1 :(得分:1)

您可以使用cv::Mat::at单独分配每个元素,或使用cv::Mat::ptr复制每行的数据。请务必阅读文档,特别是最后一篇文档。

请注意,这些方法最终可能比创建临时文件更慢(在打开优化时甚至可能被编译器删除)。