gpt4 book ai didi

c++ - 如何在 QLabel 中显示捕获图像

转载 作者:行者123 更新时间:2023-11-28 06:42:16 25 4
gpt4 key购买 nike

我正在尝试向 Qlabel 显示实时摄像头图像。当我启动代码时,它没有给出任何错误,并且我的摄像头灯变为蓝色,这意味着工作正常。但是 ui 没有启动。调试我的代码后,我在 while(true) 中看到它总是循环,但是 ui->lblProcessedVideo->setPixmap..... 命令不显示任何 ui。

你能告诉我我的错误吗..

这是我的部分代码:

void MainWindow::getImageFromVideo()
{
CvCapture* capture;
cv::Mat frame;
cv::Mat gray_frame;

capture = cvCaptureFromCAM( 0 );

if( capture )
{
while( true )
{
frame = cvQueryFrame( capture );

if( !frame.empty() )
{
cvtColor( frame, gray_frame, CV_BGR2GRAY);

equalizeHist( gray_frame, gray_frame );

ui->lblProcessedVideo->setPixmap( QPixmap::fromImage( Mat2QImage( frame )));
}
}
}
}

编辑:Mat2QImage() 是一个将 Mat 转换为 QImage 的函数

最佳答案

就像 Ezee 所说的,您需要将相机捕获的图像委托(delegate)给单独的线程,然后将图像发送到 GUI 线程。继承人示例代码:

//定时器.h

class Timer : public QThread
{
Q_OBJECT
public:
explicit Timer(QObject *parent = 0);
void run();
signals:
void updFrame(QPixmap);
public slots:

};

//定时器.cpp

Timer::Timer(QObject *parent) :
QThread(parent)
{
}

void Timer::run() {
VideoCapture cap(0); // open the default camera
for(;;){
Mat frame;
cap.read(frame);
QPixmap pix = QPixmap::fromImage(IMUtils::Mat2QImage(frame));
emit updFrame(pix);
if( waitKey (30) >= 0){
break;
}
}
}

//videoviewer.h

class VideoViewer : public QLabel
{
Q_OBJECT
public:
explicit VideoViewer(QObject *parent = 0);

signals:

public slots:
void updateImage(QPixmap pix);
};

//videoviever.cpp

VideoViewer::VideoViewer(QObject *parent) :
QLabel()
{
Timer* timer = new Timer();
connect(timer,SIGNAL(updFrame(QPixmap)),this,SLOT(updateImage(QPixmap)));
timer->start();
}

void VideoViewer::updateImage(QPixmap pix){
this->setPixmap(pix);
}

关于c++ - 如何在 QLabel 中显示捕获图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25761016/

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