【问题标题】:Convert IplImage to Qpixmap将 IplImage 转换为 Qpixmap
【发布时间】:2011-06-23 01:06:58
【问题描述】:

我们如何将IplImage 转换为QPixmap 或QImage?

如果唯一的答案是保存Iplimage,然后将其加载到QPixmap,那么我们该怎么做呢?

【问题讨论】:

    标签: c++ qt opencv qimage qpixmap


    【解决方案1】:

    我刚刚发现了一段有趣的代码here,它提供了一个从IplImage* 转换为QImage* 的函数。搜索名为IplImageToQImage() 的函数。

    要使用该功能,您可以:

    IplImage* cv_img = cvLoadImage("filename.jpg", CV_LOAD_IMAGE_UNCHANGED);
    if(!cv_img)
    {
        std::cout << "ERROR: cvLoadImage failed" << std::endl;
        exit(0);
    }
    
    uchar* data = NULL;
    QImage* qt_img = IplImageToQImage(cv_img, &data, 0.0, 0.0);
    if(!qt_img)
    {
        std::cout << "ERROR: IplImageToQImage failed" << std::endl;
        exit(0);
    }
    
    qt_img->save("qimage_output.jpg");
    delete qt_img;
    

    【讨论】:

    • 我已经找到并测试了它,但不知何故它对我不起作用,应用程序编译完美,但执行后崩溃,我已经找到了问题及其在那个函数上,因为我正在使用Qt 控制台应用程序我注意到控制台窗口上有一条错误消息,类似于:OpenCV Error: Bad argument in unknown function, file ..\..\..\..\ocv\opencv\ modules\core\src\matrix.cpp,第 641 行
    • 在这里发布之前,我复制了该功能并对其进行了测试,它运行良好。
    【解决方案2】:

    将其保存到文件中,然后使用 QImage 检索它是一种方法:

    // On my system this code can be compiled with:
    // g++ qimage_test.cpp -o qimage_test -I/usr/include/qt4 -lQtGui `pkg-config --cflags --libs opencv`
    #include <qt4/QtGui/qpainter.h>
    #include <highgui.h>
    #include <cv.h>
    #include <iostream>
    
    int main()
    {
        IplImage* cv_img = cvLoadImage("coins.jpg", CV_LOAD_IMAGE_UNCHANGED);
        if(!cv_img)
        {
            std::cout << "ERROR: cvLoadImage failed" << std::endl;
            return -1;
        }
    
        // Process cv_img and then save it on a file on the disk
    
        if (!cvSaveImage("cv_out.jpg", cv_img))
        {
            std::cout << "ERROR: cvSaveImage failed" << std::endl;
            return -1;
        }
    
        // Loading OpenCV saved image into QImage
        QImage::QImage qt_img("cv_out.jpg");
    
        // Then finally display it, or do something with it.
        // Saving it to the disk for testing purposes
        qt_img.save("qt_img.jpg");
    
        return 0;
    }
    

    【讨论】:

      【解决方案3】:

      为什么不直接使用这个:

      QImage qt_img = ( QImage ( cv_img->dataIm, cv_img->width, cv_img->height, cv_img->QImage::Format_RGB888 ) ).rgbSwapped();
      

      【讨论】:

        【解决方案4】:
        IplImage * ImageToIplImage(QPixmap * qPix){
        
            int width = (qPix->toImage()).width();
            int height =(qPix->toImage()).height();
        
            // Creates a iplImage with 3 channels
        
            IplImage *img = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 3);
        
            for(int y=0;y<height;y++)
            {
                for(int x=0;x<width;x++ )
                {
                    QRgb color = qPix->toImage().pixel(x,y);
                    cvSet2D(img,y,x,cvScalar(qBlue(color),qGreen(color),qRed(color),1));
                }
            }
            return img; }
        

        成功了!!感谢 Fateh benmerzoug

        【讨论】:

        • 这种方法的问题是你假设你的图像总是有 3 个通道。如果他们有 4 个频道会怎样?还是1个频道?如果您在我之前引用的网站上注意到,还有一个用于此转换的函数,名为 QImageToIplImage。你应该检查一下。
        • 它正在将 QPixmap 转换为 IplImage 而不是其他方式!1
        • @karlphillip:如果我们有一个QPixmap,我们怎么知道这个QPixmap的通道数?
        • 这超出了这个问题的范围,所以如果你想问一个新问题,请继续。但是,QPixmap doc 似乎没有用于此目的的方法。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-16
        • 1970-01-01
        • 1970-01-01
        • 2013-05-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-07
        相关资源
        最近更新 更多