【问题标题】:GUI with Qt Creator to play video使用 Qt Creator 播放视频的 GUI
【发布时间】: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 播放视频?

【问题讨论】:

标签: c++ c opencv 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 播放视频的问题,我正在考虑帮助你,但你应该一次只做一件事。
猜你喜欢
  • 1970-01-01
  • 2010-12-23
  • 2014-02-22
  • 1970-01-01
  • 2013-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-28
相关资源
最近更新 更多