使用 Qt Creator 播放视频的 GUI

Posted

技术标签:

【中文标题】使用 Qt Creator 播放视频的 GUI【英文标题】:GUI with Qt Creator to play video 【发布时间】:2012-03-18 19:11:42 【问题描述】:
frame = cvQueryFrame(camera);

while(key!='q')

    cvNamedWindow( "main",CV_WINDOW_AUTOSIZE);
    cvShowImage("main", frame);
    if(frame!=NULL)

        drawSquares( frame, findSquares4( frame, storage ) );

        /* wait for key. Also the function cvWaitKey takes care of event processing */
        key = cvWaitKey(33);
        IplImage *img = cvCloneImage(frame);
        if (img->origin)
            cvFlip(img);
            img->origin= 0;
        

        QImage* qimg = IplImageToQImage(img)
        // qimg = IplImage2QImage (img);
        QLabel label;
        ui->label->setPixmap(QPixmap::fromImage(qimg));
        cvReleaseImage(&img);

我喜欢用 Qt Creator 播放视频。我使用上面的代码,但是不行。我收到以下错误:

IplImageToQImage 没有在这个范围内声明

有谁知道如何在同一个窗口中使用 OpenCV 和 Qt Creator 播放视频?

【问题讨论】:

问题本身很糟糕,但即便如此,您至少可以尝试格式化您的代码吗?你可以看到它现在的样子。 how to play video using opencv and qt creator的可能重复 【参考方案1】:

嗯,这是有道理的,因为IplImage2QImage() 既不是 Qt 也不是 OpenCV 的一部分。

您可能在 Internet 上的某个地方看到此函数被使用并复制/粘贴到您的代码中。

通过谷歌简单搜索,我找到了这个函数的the implementation:

static QImage IplImage2QImage(const IplImage *iplImage)

    int height = iplImage->height;
    int width = iplImage->width;
 
    if  (iplImage->depth == IPL_DEPTH_8U && iplImage->nChannels == 3)
    
      const uchar *qImageBuffer = (const uchar*)iplImage->imageData;
      QImage img(qImageBuffer, width, height, QImage::Format_RGB888);
      return img.rgbSwapped();
     else if  (iplImage->depth == IPL_DEPTH_8U && iplImage->nChannels == 1)
    const uchar *qImageBuffer = (const uchar*)iplImage->imageData;
    QImage img(qImageBuffer, width, height, QImage::Format_Indexed8);
 
    QVector<QRgb> colorTable;
    for (int i = 0; i < 256; i++)
        colorTable.push_back(qRgb(i, i, i));
    
    img.setColorTable(colorTable);
    return img;
    else
      qWarning() << "Image cannot be converted.";
      return QImage();
    

希望你会知道如何处理它。

我写了这个最小的例子来展示如何成功使用IplImage2QImage()。它使用cvLoadImage() 从磁盘加载名为 test.jpg 的文件,然后将其显示在 QLabel 上。这很简单,而且很有效!

#include <cv.h>
#include <highgui.h>

#include <iostream>

#include <QtGui>
#include <QImage>

static QImage IplImage2QImage(const IplImage *iplImage)

    int height = iplImage->height;
    int width = iplImage->width;

    if  (iplImage->depth == IPL_DEPTH_8U && iplImage->nChannels == 3)
    
      const uchar *qImageBuffer = (const uchar*)iplImage->imageData;
      QImage img(qImageBuffer, width, height, QImage::Format_RGB888);
      return img.rgbSwapped();
    
    else if  (iplImage->depth == IPL_DEPTH_8U && iplImage->nChannels == 1)
    
        const uchar *qImageBuffer = (const uchar*)iplImage->imageData;
        QImage img(qImageBuffer, width, height, QImage::Format_Indexed8);

        QVector<QRgb> colorTable;
        for (int i = 0; i < 256; i++)
        
            colorTable.push_back(qRgb(i, i, i));
        
        img.setColorTable(colorTable);
        return img;
    
    else
    
      std::cout << "Image cannot be converted.";
      return QImage();
    


int main(int argc, char** argv)

    QApplication app(argc, argv);

    IplImage* img = cvLoadImage("test.jpg", 1);
    if (!img)
    
        std::cout << "Failed to load test.jpg";
        return -1;
    

    QImage qt_img = IplImage2QImage(img);

    QLabel label;
    label.setPixmap(QPixmap::fromImage(qt_img));
    label.show();

    return app.exec();

在我的 Linux 机器上,我使用以下代码编译它:

g++ qimage.cpp -o qimage -I/usr/local/include/opencv -I/usr/local/include -I/opt/qt_47x/include -I/opt/qt_47x/include/QtGui -L/usr/local/lib -L/opt/qt_47x/lib -lopencv_core -lopencv_imgproc -lopencv_highgui -lQtCore -lQtGui

【讨论】:

感谢您的帮助,但我尝试使用此功能,但不行 不正常不是对您所面临问题的准确描述。 我用一个功能齐全的最小示例更新了答案,只是为了向您展示我在 WORKS 之前分享的代码!如果您对有用的答案进行投票并选择解决您的问题的答案,那就太好了。最后一部分,您可以通过单击答案附近的复选框来选择它作为您问题的官方答案。 抱歉,我尝试显示视频,而不仅仅是图像,所以如果可以,请您在播放视频后显示界面的打印屏幕吗? 您的问题中所述的问题已在我的回答中得到解决。正确的做法是,如果我的答案对您有所帮助,请投票赞成,或者通过单击答案附近的复选框将其作为您问题的官方答案接受,或者两者都做! 不要劫持你自己的线程。 我注意到你已经问过一个关于如何使用 OpenCV 和 Qt 播放视频的问题,我正在考虑帮助你,但你应该一次只做一件事。

以上是关于使用 Qt Creator 播放视频的 GUI的主要内容,如果未能解决你的问题,请参考以下文章

Python使用PyQT制作视频播放器!专属播放器~

Python编程使用PyQT制作视频播放器

Python应用03 使用PyQT制作视频播放器

Python应用03 使用PyQT制作视频播放器

视频播放器:QtCreator运行VLC-Qt官方示例代码

如何通过 Qt gui 应用程序显示视频的帧?