繁体   English   中英

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

[英]Best way for overwritting cv::Mat data

目前我有这样的事情,因为我无法在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

您无需在循环外分配任何内容。 您的代码应为:

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中的pixel值,那么raw_data也会更改。

您可以使用cv::Mat::at分别分配每个元素cv::Mat::at或使用cv::Mat::ptr复制每一行的数据。 确保阅读文档,尤其是最后一篇文档。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM