c++ - 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);
解决方案
推荐阅读
- html - 如何使徽标出现在背景图片上?
- python - Pandas 绘图栏:每隔 n 个 xlabel 显示一次
- apache-spark - 如何计算 pyspark 数据框每一列中的 null、na 和 nan 值
- android - Xamarin 应用程序徽章不适用于 Android 窗体
- swift - 变异结构和重新分配结构之间的性能差异
- javascript - 如何在 D3.js 行的中间绘制箭头
- sql - 如何更新除给定一周(太阳 - 星期六)内创建的最新记录之外的所有记录?
- sql - 如何合并select中调用的函数返回的表?
- android - 使用 Mockito 测试 MVP Android 应用程序
- amazon-web-services - 如何通过 CloudFront 缓存的重定向并改为访问 API 网关?