簡體   English   中英

帶有 Qt Creator 的 GUI 播放視頻

[英]GUI with Qt Creator to play video

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 播放視頻?

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

您可能在 Internet 上的某處看到此函數被使用並復制/粘貼到您的代碼中。

通過在 Google 上的簡單搜索,我找到這個函數的實現

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM