Преобразование cv :: mat в QImage - PullRequest
0 голосов
/ 01 октября 2018

, как и в заголовке, я пытаюсь преобразовать cv :: mat в QImage.Я использую функцию equizeHist () на коврике, а затем преобразую его в QImage для отображения в окне виджета в Qt.Я знаю, что мат работает и загружает изображение правильно, потому что выровненное изображение будет отображаться в новом окне с помощью imshow (), однако при преобразовании этого мата в QImage я не могу отобразить его в окне.Я считаю, что проблема с преобразованием из циновки в QImage, но не могу найти проблему.Ниже приведена часть моего кода.

Mat image2= imread(directoryImage1.toStdString(),0);
//cv::cvtColor(image2,image2,COLOR_BGR2GRAY);
Mat histEquImg;
equalizeHist(image2,histEquImg);
imshow("Histogram Equalized Image 2", histEquImg);
//QImage img=QImage((uchar*) histEquImg.data, histEquImg.cols, histEquImg.rows, histEquImg.step, QImage::Format_ARGB32);
imageObject= new QImage((uchar*) histEquImg.data, histEquImg.cols, histEquImg.rows, histEquImg.step, QImage::Format_RGB888);
image = QPixmap::fromImage(*imageObject);
scene=new QGraphicsScene(this); //create a frame for image 2
scene->addPixmap(image); //put image 1 inside of the frame
ui->graphicsView_4->setScene(scene); //put the frame, which contains image 3, to the GUI
ui->graphicsView_4->fitInView(scene->sceneRect(),Qt::KeepAspectRatio); //keep the dimension ratio of image 3

Нет ошибок, и программа не падает.Заранее спасибо.

1 Ответ

0 голосов
/ 01 октября 2018

Ваша проблема - преобразование QImage в cv::Mat, при использовании флага 0 в cv::imread подразумевается, что показание является шкалой серого, и вы используете преобразование в формате QImage::Format_RGB88 8.Я использую следующую функцию, чтобы преобразовать cv::Mat в QImage:

static QImage MatToQImage(const cv::Mat& mat)
{
    // 8-bits unsigned, NO. OF CHANNELS=1
    if(mat.type()==CV_8UC1)
    {
        // Set the color table (used to translate colour indexes to qRgb values)
        QVector<QRgb> colorTable;
        for (int i=0; i<256; i++)
            colorTable.push_back(qRgb(i,i,i));
        // Copy input Mat
        const uchar *qImageBuffer = (const uchar*)mat.data;
        // Create QImage with same dimensions as input Mat
        QImage img(qImageBuffer, mat.cols, mat.rows, mat.step, QImage::Format_Indexed8);
        img.setColorTable(colorTable);
        return img;
    }
    // 8-bits unsigned, NO. OF CHANNELS=3
    if(mat.type()==CV_8UC3)
    {
        // Copy input Mat
        const uchar *qImageBuffer = (const uchar*)mat.data;
        // Create QImage with same dimensions as input Mat
        QImage img(qImageBuffer, mat.cols, mat.rows, mat.step, QImage::Format_RGB888);
        return img.rgbSwapped();
    }
    return QImage();
}

После этого я вижу, что у вас есть неправильные представления о том, как QGraphicsView и QGraphicsScene работают при комментировании: поместите рамку, которая содержит изображение 3, в графический интерфейс , с помощью ui->graphicsView_4->setScene(scene); вы устанавливаете не рамку, а сцену, и сцену следует устанавливать только один раз, предпочтительно в конструкторе.

// constructor
scene = new QGraphicsScene(this);
ui->graphicsView->setScene(scene);

Поэтому, когда вы хотите загрузить изображение, просто используйте сцену:

cv::Mat image= cv::imread(filename.toStdString(), CV_LOAD_IMAGE_GRAYSCALE);

cv::Mat histEquImg;
equalizeHist(image, histEquImg);

QImage qimage = MatToQImage(histEquImg);
QPixmap pixmap = QPixmap::fromImage(qimage);
scene->addPixmap(pixmap);
ui->graphicsView->fitInView(scene->sceneRect(), Qt::KeepAspectRatio);

Полный пример можно найти по следующей ссылке .

...