gpt4 book ai didi

c++ - Qt 中不同线程上的信号/插槽 OpenCV Mat

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:21:39 30 4
gpt4 key购买 nike

我聚合来自硬件 (PointGrey) 相机的图像,并将它们放入专用(相机)线程中的 opencv 矩阵中。我想在另一个 (gui) 线程中运行的 QWidget 中显示这些图像。

如果图像聚合和 gui 在同一个线程中运行,内存方面一切都很好,但是一旦相机在另一个线程中运行,我就会出现内存泄漏,因为 opencv 矩阵没有被正确删除.

整个事情看起来如下:

 Thread A                         Thread B
+---------+ +---------+
| Camera | | QWidget |
+---------+ +---------+
| |
| emit camFrame(frame);--------->|
| |-> setImage(cv::Mat frame);
| |

我将 camFrame 信号与 QMainWindow 实例中的 setImage 插槽连接起来:

mCameraThread = new QThread;
mCamera->moveToThread(mCameraThread);

/* connect camera with attached thread */
connect(mCameraThread, SIGNAL(started()), mCamera, SLOT(start()));
connect(mCamera, SIGNAL(stopped()), mCameraThread, SLOT(quit()));
connect(mCamera, SIGNAL(stopped()), mCamera, SLOT(deleteLater()));
connect(mCameraThread, SIGNAL(finished()), mCameraThread, SLOT(deleteLater()));

/* connect camera with camerawidget thread */
connect(mCamera, SIGNAL(camFrame(cv::Mat)), mCameraPreviewWidget, SLOT(setImage(cv::Mat)));

/* start camera in separate thread with high priority */
mCameraThread->start();
mCameraThread->setPriority(QThread::TimeCriticalPriority);

在将 opencv 矩阵发送到另一个线程时,我没有分配新内存,所以我不知道为什么会发生内存泄漏。我正在做:

Image rawImage;
mError = mCamera.RetrieveBuffer(&rawImage);

cv::Mat tmpFrame(rawImage.GetRows(), rawImage.GetCols(), CV_8UC1);
tmpFrame.data = rawImage.GetData();
cv::Mat actualFrame = tmpFrame.clone();
tmpFrame.release();
emit camFrame(actualFrame)

有人能指出我这里可能出了什么问题的正确方向吗?提前致谢

已修复

谢谢大家。上面的示例代码实际上很好。我的错误是我不小心用代码启动了两次相机。在玩第二个线程时,我忘了删除线

mCamera->start()

来 self 的代码。很抱歉因为这个愚蠢的错误而耽误您的时间。

最佳答案

OpenCV 不会在数据被指针赋值时自动释放资源("frame.data = rawImage.GetData();")。您可能想要复制或手动释放 Mat。

关于c++ - Qt 中不同线程上的信号/插槽 OpenCV Mat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25289082/

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