覆盖 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
?
您可以使用 cv::Mat::at
or copy the data for each row using cv::Mat::ptr
分别分配每个元素。请务必阅读文档,尤其是最后一个文档。
请注意,这些方法最终可能会比仅创建一个临时文件(在打开优化时甚至可能被编译器删除)更慢。
您不需要在循环外分配任何东西。您的代码应该是:
for(;;) {
// Obtain raw data
Mat frame_mat(height, width, CV_8UC3, raw_data);
// Use frame_mat
}
在这种情况下,frame_mat 只是 raw_data 的包装器,允许您将其传递给 OpenCV 函数。它没有分配任何内存,除了很小的常量大小header。也不允许 de-allocate 不是由它分配的内存,所以不要忘记在范围末尾释放你的 raw_data。
另请记住,如果您更改 frame_mat 中的像素值,raw_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
?
您可以使用 cv::Mat::at
or copy the data for each row using cv::Mat::ptr
分别分配每个元素。请务必阅读文档,尤其是最后一个文档。
请注意,这些方法最终可能会比仅创建一个临时文件(在打开优化时甚至可能被编译器删除)更慢。
您不需要在循环外分配任何东西。您的代码应该是:
for(;;) {
// Obtain raw data
Mat frame_mat(height, width, CV_8UC3, raw_data);
// Use frame_mat
}
在这种情况下,frame_mat 只是 raw_data 的包装器,允许您将其传递给 OpenCV 函数。它没有分配任何内存,除了很小的常量大小header。也不允许 de-allocate 不是由它分配的内存,所以不要忘记在范围末尾释放你的 raw_data。
另请记住,如果您更改 frame_mat 中的像素值,raw_data 也会更改。