2017-08-16 5 views
0

Ich versuche eine Funktion zu schreiben, die eine Graustufen OpenCv Mat in eine Qt QPixmap und dann in eine QLabel schreibt.C++ opencv Mat zu QPixmap Fehler

Ein Drittel der Zeit es funktioniert.

Ein Drittel der Zeit, es das Bild verzerrt ...

enter image description here

wird

enter image description here

Der Rest der Zeit, die Programmabstürze, insbesondere auf der Fromimage() Linie.

Ich weiß, dass die eingehenden Mat Objekte jeweils Graustufen und nicht Null sind. Hier ist der Code in Frage ...

void MainWindow::updateCanvasLabel(Mat mat){ 

    imwrite("c:/pics/last-opened.jpg", mat); //to verify that Mat is 
              // what I think it is 

    QPixmap pixmap = QPixmap::fromImage(QImage((unsigned char*) mat.data, 
           mat.cols, 
           mat.rows, 
           QImage::Format_Grayscale8)); 

    ui->canvasLabel->setPixmap(pixmap); 
    ui->canvasLabel->setScaledContents(true); 
} 
+0

Sie das Bild hochladen können, und wie viele Kanäle Sie haben – eyllanesc

+0

Sie haben wahrscheinlich Probleme mit Kanälen (RGB/Grayscale/RGBA, etc) –

Antwort

1

Hier finden Sie, was ich normalerweise zu konvertieren verwenden cv::Mat-QPixmap oder QImage:

void MainWindow::updateCanvasLabel(Mat mat){ 

    QPixmap pixmap; 
    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); 
     pixmap = QPixmap::fromImage(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); 
     pixmap = QPixmap::fromImage(img.rgbSwapped()); 
    } 
    else 
    { 
     qDebug() << "ERROR: Mat could not be converted to QImage or QPixmap."; 
     return; 
    } 

    ui->canvasLabel->setPixmap(pixmap); 
    ui->canvasLabel->setScaledContents(true); 
}