如何在QLabel中显示捕获图像

How to show capture image in QLabel

本文关键字:图像 显示 QLabel      更新时间:2023-10-16

我正在尝试向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 )));
            }
        }
    }
}

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

正如Ezee所说,您需要将从相机捕获的图像委托给单独的线程,然后将图像发送到GUI线程。这里的样本代码:

//计时器.h

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

//timer.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);
}