C++ 使用Qt Creator播放视频的GUI

C++ 使用Qt Creator播放视频的GUI,c++,c,opencv,qt-creator,C++,C,Opencv,Qt Creator,我喜欢和Qt Creator一起玩视频。我使用上面的代码,但它不好。我得到以下错误: IplImageToQImage未在此范围内声明 有人知道我如何在同一个窗口中使用OpenCV和Qt Creator播放视频吗?嗯,这很有意义,因为IplImage2QImage()不是Qt或OpenCV的一部分 您可能看到此函数在Internet上的某个地方被使用,并被复制/粘贴到您的代码中 通过在谷歌上的简单搜索,我发现了以下功能: frame = cvQueryFrame(camera); while(

我喜欢和Qt Creator一起玩视频。我使用上面的代码,但它不好。我得到以下错误:

IplImageToQImage未在此范围内声明


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

嗯,这很有意义,因为
IplImage2QImage()
不是Qt或OpenCV的一部分

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

通过在谷歌上的简单搜索,我发现了以下功能:

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);
在我的Linux机器上,我用以下代码编译了它:

#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();
}

这个问题本身很糟糕,但即使如此,你能至少尝试格式化你的代码吗?你可以看到它现在的样子。可能是重复的,谢谢你的帮助,但我尝试使用此函数,但它不确定。它不确定不是对你面临的问题的准确描述。我用一个功能完整的最小示例更新了答案,只是为了向你展示我之前共享的代码有效!如果您能投票选出有用的答案,并选择解决您问题的答案,那就太好了。最后一部分,您可以通过单击答案附近的复选框来选择它作为您问题的正式答案。对不起,我尝试显示视频,而不仅仅是图像,因此如果您可以,请在播放视频后为我显示界面的打印屏幕?您问题中所述的问题已在我的答案中解决。正确的做法是,如果我的答案对您有所帮助,请对其进行投票,或者通过单击答案旁边的复选框将其作为您问题的正式答案,或者同时进行这两种操作!不要劫持自己的线程。我注意到你已经问了一个关于如何使用OpenCV和Qt播放视频的问题,我正在考虑帮助你,但你应该一次只做一件事。
#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();
}
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