gpt4 book ai didi

c++ - 在 C++ 中将 cv::Mat 实例存储在堆上

转载 作者:太空宇宙 更新时间:2023-11-03 22:48:32 25 4
gpt4 key购买 nike

这不仅是一个 OpenCV 相关的问题,也是一个一般的 C++ 问题。

我想在方法中加载图像并使用指针将其存储在堆上。

这是我目前使用的方法的代码:

int load_offline_image(std::string src, unsigned char* buffer, int* width, int* height, int* len) {
if (offline_image) {
delete offline_image;
}
offline_image = new cv::Mat(cv::imread(src, cv::IMREAD_GRAYSCALE));
if (offline_image->data == 0){
return ERROR;
}
int numRow = offline_image->rows;
int numCol = offline_image->cols;
*len = numCol*numRow*offline_image->elemSize1();
*width = offline_image->size().width;
*height = offline_image->size().height;
buffer = offline_image->data;
return OK;
}

方法内部一切正常。但是当我尝试从外部访问 buffer 变量时,它是 Null。我确定问题与指针 offline_image 指向一个 cv::Mat 实例有关,该实例仅存在于堆栈中,并且它的地址在之后丢失load_offline_image 的执行已经完成。

顺便说一句:offline_image 是一个全局变量。

在 C++ 中实现它的正确方法是什么,以便我为 cv::Mat 实例分配堆空间?

最佳答案

你可能想要的是这样的:

int load_offline_image(std::string src, unsigned char** buffer, int* width, int* height, int* len) {
...
*buffer = offline_image->data;
....
}

这样做的原因是——您想更改buffer 指向的地址。使用 unsigned char* buffer 更改地址,但更改仅限于调用方法。您需要一个 unsigned char** 才能使更改在方法之外持续存在。

此外,我建议您考虑步幅宽度 - 这可能与图像宽度不同。您可以查询 offline_image.isContinuous() 来解决这个问题。

另一方面,这不是使用 cv::Mat 的合适方式。此外,不清楚由谁负责清除buffer 指向的内存。这是一个更简洁的方法:

int main() {
// Calling application
buffer = new unsigned char[width*height*dims];
...
load_offline_image(..., buffer, width, height, ...);
...
delete[] buffer;
}

int load_offline_image(...) {
Mat offline_image;
// use imread
// Copy the buffer over
memcpy(buffer, offline_image->data, ...);
// Since we're using the Mat structure, the Mat will be deallocated automatically
}

这解耦了这两个函数并让它们分别管理它们的内存。

关于c++ - 在 C++ 中将 cv::Mat 实例存储在堆上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43475177/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com