Преобразование IplImage в Qpixmap

Как нам преобразовать IplImage в QPixmap или QImage?

Если единственный ответ — сохранить Iplimage, а затем загрузить его в QPixmap, то как нам это сделать?


person hamza    schedule 23.06.2011    source источник


Ответы (4)


Я только что нашел интересный фрагмент кода здесь , который предоставляет функцию для преобразования из 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;
person karlphillip    schedule 23.06.2011
comment
я уже нашел и протестировал его, но почему-то у меня это не сработало, приложение скомпилировалось отлично, но оно разбилось после выполнения, я обнаружил проблему и ее в этой функции, так как я работаю с консольным приложением Qt, я заметил ошибку сообщение в окне консоли, это было что-то вроде: Ошибка OpenCV: неверный аргумент ‹Неизвестный тип массива› в неизвестной функции, файл ..\..\..\..\ocv\opencv\modules\core\src\matrix. cpp, строка 641 - person hamza; 23.06.2011
comment
Прежде чем опубликовать это здесь, я скопировал эту функцию и протестировал ее, и она работала нормально. - person karlphillip; 23.06.2011

Сохранение его в файл, а затем использование 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;
}
person karlphillip    schedule 23.06.2011

Почему бы просто не использовать это:

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

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

это сработало !! спасибо Фатеху Бенмерзоугу

person hamza    schedule 23.06.2011
comment
Проблема с этим подходом заключается в том, что вы предполагаете, что ваши изображения всегда будут иметь 3 канала. Что произойдет, если у них будет 4 канала? или 1 канал? Если вы заметили, что на веб-сайте, на который я ссылался ранее, также есть функция для этого преобразования под названием QImageToIplImage. Вам стоит это увидеть. - person karlphillip; 23.06.2011
comment
Он конвертирует QPixmap в IplImage, а не наоборот!1 - person Sherif; 24.05.2012
comment
@karlphillip: если у нас есть QPixmap, как мы можем узнать номер канала этого QPixmap? - person aviit; 20.11.2015
comment
Это выходит за рамки этого вопроса, поэтому задайте новый вопрос, если хотите. Однако кажется, что в документе QPixmap нет метода для этой цели. . - person karlphillip; 20.11.2015