【发布时间】:2015-12-09 17:43:03
【问题描述】:
我在谷歌上做了很多搜索,但我仍然不确定。
cv::Mat ImageFromDisplay(int Width, int Height, int x, int y)
{
Display* display = XOpenDisplay(NULL);
Window root = DefaultRootWindow(display);
XWindowAttributes attributes = {0};
XGetWindowAttributes(display, root, &attributes);
XImage* img = XGetImage(display, root, x, y, Width, Height, AllPlanes, ZPixmap);
if (!img->data) {
cout << "No image data";
throw("No image data");
}
cv::Mat scene = cv::Mat(Height, Width, img->bits_per_pixel > 24 ? CV_8UC4 : CV_8UC3, img->data);
if (!scene.data) {
cout << "Error reading scene";
throw("Error reading scene");
}
cvtColor(scene, scene, CV_BGRA2BGR);
XFree(img);
XCloseDisplay(display);
return scene;
}
每当我使用这个函数时,我稍后都会在返回的对象上使用 cv::Mat->release,如下所示:
cv::Mat sceneImg = ImageFromDisplay(SCENE_WIDTH, SCENE_HEIGHT);
sceneImg.release();
一旦sceneImg超出范围,该函数分配的所有内存是否会被清理?
我知道我在 ImageFromDisplay 中的 img 上调用了 free,并且我从 ImageFromDisplay 调用了 XCloseDisplay on display,所以我假设这些数据结构的内存已被清理。调用sceneImg.release后是否需要删除sceneImg.data?
【问题讨论】:
-
不知道 X 的东西,但对于 openCV 垫:你甚至不需要释放。一旦它超出范围并且没有被另一个变量引用,它的 .data 内存将被自动释放。 openCV mat 数据使用引用计数!
-
我注意到您返回的是
cv::Mat scene值。分配一次内存(在函数外)然后通过指针返回不是更好吗? -
这是一个很好的观点。我是一名业余 C++ 程序员,非常感谢您的建议。