首页 > 解决方案 > OpenCV 从指针内存泄漏中恢复 Mat

问题描述

我正在使用 cgo 将指向 opencv Mat 的指针从 golang 发送到 c++,并将其恢复为 c++ 中的 Mat 以用于 tensorflow 推理。

一旦在 C++ 中重新创建了 Mat,我将其转换为张量并通过我的 tensorflow 模型运行它以进行预测(下面的代码中未显示)。

这是可行的,并且图像已传输并可以在 c++ 中使用。然而,每次我从 C++ 中的指针创建一个新的 Mat 时,我都会遇到巨大的内存泄漏。我试图删除这一行,而是使用 cv::imread 从磁盘读取图像。这不会导致任何内存泄漏,因此运行 tensorflow 模型没有问题。问题似乎出在我从 C++ 中的指针重新创建 cv::Mat 时。

如何在不导致内存泄漏的情况下将我的 Mat 从 golang 转换为 C++?

tf.go:

func Detect(detectFrame *gocv.Mat) {
    detectFrameSlice_ptr, _ := detectFrame.DataPtrUint8()
    detectFrame_ptr := unsafe.Pointer(&detectFrameSlice_ptr[0])

    C.LIB_predict(detectFrame_ptr)

    . . .
}

tf-bridge.hpp:

void LIB_predict(void* detectFrame_ptr);

tf-bridge.cpp:

void LIB_predict(void* detectFrame_ptr){
    // Restore Mat from gocv.Mat pointer
    uchar* ptr = static_cast<uchar*>(detectFrame_ptr);
    // MEMORY LEAK ON THIS LINE ---->
    cv::Mat inputMat(inputTensorShapeHeight, inputTensorShapeWidth, inputTensorShapeType, ptr);
    // <----- MEMORY LEAK ON ABOVE LINE
}

我也试过

cv::Mat inputMat = cv::Mat(inputTensorShapeHeight, inputTensorShapeWidth, inputTensorShapeType, ptr).clone();

cv::Mat inputMat;
cv::Mat(inputTensorShapeHeight, inputTensorShapeWidth, inputTensorShapeType, ptr).copyTo(inputMat);

标签: c++opencvgopointersmemory-leaks

解决方案


推荐阅读