2011-06-23 82 views
3

我們怎樣將IplImage轉換爲QPixmapQImage將IplImage轉換爲Qpixmap

如果唯一的答案是保存Iplimage然後將其加載到QPixmap,那麼我們該怎麼做?

回答

0
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; } 

它的工作!爲什麼不直接使用此感謝法塔赫benmerzoug

+0

這種方法的問題在於你假設你的圖像總是有3個通道。如果他們有4個頻道會發生什麼?或1個頻道?如果您在前面引用的網站上注意到,還有一個名爲'QImageToIplImage'的轉換函數。你應該檢查一下。 – karlphillip

+4

它將QPixmap轉換爲IplImage而不是其他方式!1 – Sherif

+0

@karlphillip:如果我們有一個QPixmap,我們如何知道這個QPixmap的通道數? – aviit

1

它保存到一個文件,然後使用的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; 
} 
2

我剛剛發現了一個有趣的一段代碼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; 
+0

我已經找到了與測試,但不知何故它沒有工作對我來說,應用程序完全編譯,但執行後墜毀,我已經找到了問題和它的功能,因爲我正在使用Qt控制檯應用程序,我注意到在CONSOL窗口上的錯誤消息,它是這樣的:OpenCV錯誤:未知函數,文件.. \中的錯誤參數<未知數組類型>。 。\ .. \ .. \ ocv \ opencv \ modules \ core \ src \ matrix.cpp,第641行 – hamza

+0

在發佈之前,我複製了該函數並測試了它,並且它工作正常。 – karlphillip

1

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