QT live 摄像头显示内存不足导致崩溃
QT live camera showing crashes due to out of memory
我正在使用 QT Qpixmap 来显示使用 OpenCV 框架从相机捕获的图像。我正在执行以下步骤
- 使用 OpenCV 捕获图像
- 将OpenCV图像转换为QImage
- 将 QImage 转换为 Qpixmap
- 在 Qlabel 上显示它
我面临的问题是内存开始快速增加,几次后应用程序因内存不足而崩溃
我已经多次检查代码以一次又一次地检查正在创建的任何对象。
示例代码如下
void mainfucntion(){
std::thread producer_t(&MainWindow::RunDefaultCamera,this);
for(;;){
time(&start);
timer = double(getTickCount());
tic();
if(!bufferQueue.empty()){
lock_guard<std::mutex> lock(fmutex);
readFrame = bufferQueue.front();
qDebug() << "1 : " << bufferQueue.size();
bufferQueue.pop_front();
qDebug() << "2 : " << bufferQueue.size();
}
else{
if(keepRunning == true)
{
if(threadEnable==false)
{
std::thread producer_t(&MainWindow::RunDefaultCamera,this);
}
continue;
}
else{
producer_t.join();
return -1;
}
}
// cap >> readFrame;
cv::resize(readFrame, readFrame, size);
img = QImage((uchar*) readFrame.data, readFrame.cols, readFrame.rows, readFrame.step, QImage::Format_BGR888);
image = QPixmap::fromImage(img);
// QPixmap image = QPixmap(img);
ui->lblDisplayVideo->setPixmap(image);
}
线程函数来了
void runthread()
{
while(capture.isOpened())
{
qDebug() << "thread is running";
capture >> ImageMat;
bufferQueue.push_back(ImageMat);
if(!ImageMat.empty())
{
frameCounter++;
lock_guard<std::mutex> lock(fmutex);
if (int(bufferQueue.size()) >= bufferSize)
{
bufferQueue.clear();
}
else
{
bufferQueue.push_back(ImageMat);
}
}
sleep(100);
// ui->listInfo->addItem(QString::number(bufferQueue.size()));
qDebug() << bufferQueue.size();
}
capture.release();
}
我们将不胜感激。
在尝试了很多事情之后得出结论,代码现在可以正常工作了
我删除了 tic toc 部分
time(&start);
timer = double(getTickCount());
tic();
它工作正常但崩溃然后只是为了确保 QImage 不是 NULL 我删除了 img = QImage(); // releasing memory
与
if(!img.isNull())
img = QImage();
它现在工作得很好。
分享编辑取消删除标志
我正在使用 QT Qpixmap 来显示使用 OpenCV 框架从相机捕获的图像。我正在执行以下步骤
- 使用 OpenCV 捕获图像
- 将OpenCV图像转换为QImage
- 将 QImage 转换为 Qpixmap
- 在 Qlabel 上显示它
我面临的问题是内存开始快速增加,几次后应用程序因内存不足而崩溃
我已经多次检查代码以一次又一次地检查正在创建的任何对象。
示例代码如下
void mainfucntion(){
std::thread producer_t(&MainWindow::RunDefaultCamera,this);
for(;;){
time(&start);
timer = double(getTickCount());
tic();
if(!bufferQueue.empty()){
lock_guard<std::mutex> lock(fmutex);
readFrame = bufferQueue.front();
qDebug() << "1 : " << bufferQueue.size();
bufferQueue.pop_front();
qDebug() << "2 : " << bufferQueue.size();
}
else{
if(keepRunning == true)
{
if(threadEnable==false)
{
std::thread producer_t(&MainWindow::RunDefaultCamera,this);
}
continue;
}
else{
producer_t.join();
return -1;
}
}
// cap >> readFrame;
cv::resize(readFrame, readFrame, size);
img = QImage((uchar*) readFrame.data, readFrame.cols, readFrame.rows, readFrame.step, QImage::Format_BGR888);
image = QPixmap::fromImage(img);
// QPixmap image = QPixmap(img);
ui->lblDisplayVideo->setPixmap(image);
}
线程函数来了
void runthread()
{
while(capture.isOpened())
{
qDebug() << "thread is running";
capture >> ImageMat;
bufferQueue.push_back(ImageMat);
if(!ImageMat.empty())
{
frameCounter++;
lock_guard<std::mutex> lock(fmutex);
if (int(bufferQueue.size()) >= bufferSize)
{
bufferQueue.clear();
}
else
{
bufferQueue.push_back(ImageMat);
}
}
sleep(100);
// ui->listInfo->addItem(QString::number(bufferQueue.size()));
qDebug() << bufferQueue.size();
}
capture.release();
}
我们将不胜感激。
在尝试了很多事情之后得出结论,代码现在可以正常工作了
我删除了 tic toc 部分
time(&start);
timer = double(getTickCount());
tic();
它工作正常但崩溃然后只是为了确保 QImage 不是 NULL 我删除了 img = QImage(); // releasing memory
与
if(!img.isNull())
img = QImage();
它现在工作得很好。
分享编辑取消删除标志