在QPixmap中显示cv :: Mat(类型CV_32F)

时间:2017-04-27 08:51:31

标签: c++ opencv qpixmap qlabel

我正在使用相机来获取imgTomo1图像,这是一个cv :: Mat对象。这是一张CV_32F图片。 我试图使用QPixmap在QLabel上显示它。 这是我的代码:

   cv::Mat imgTomo;
   imgTomo1.convertTo(imgTomo,CV_8UC1);

  static QVector<QRgb>  sColorTable;

  // only create our color table the first time
 if ( sColorTable.isEmpty() )

   sColorTable.resize( 256 );

       for ( int i = 0; i < 256; ++i )
       {
           sColorTable[i] = qRgb( i, i, >i );
       }
   }

   QImage image( imgTomo.data,
                 imgTomo.cols, imgTomo.rows,
                 static_cast<int>(imgTomo.step),
                 QImage::Format_Indexed8);

   image.setColorTable( sColorTable );
   _afficheImg->setPixmap(QPixmap::fromImage(image));

不幸的是,显示的图像仍为黑色。 我有点迷失在格式中,因为我是OpenCV的新手。 我认为转换应该有效,所以我真的不知道我在做什么。

编辑:我删除了fllowing line:

  

imgTomo1.convertTo(imgTomo,CV_8UC1);

导致信息丢失。 现在我不再有黑色的屏幕,但是有些“雪”(我觉得这个像素从1到0非常狡猾),而且我无法真正看到我的相机显示的内容。

感谢您的回答, 格雷

2 个答案:

答案 0 :(得分:0)

我不确定您的代码有什么问题,但我使用以下代码将cv::Mat图片转换为QImage

if (frame.channels()== 3){
        cv::cvtColor(frame, RGBframe, CV_BGR2RGB);
        img = QImage((const unsigned char*)(RGBframe.data),
                         RGBframe.cols,RGBframe.rows,QImage::Format_RGB888);
}
else
{
        img = QImage((const unsigned char*)(frame.data),
                         frame.cols,frame.rows,QImage::Format_Indexed8);
}

您甚至可以查看以下link,了解有关如何将Mat图片转换为QImage的更多信息。

答案 1 :(得分:0)

1.转换CV_8U类型

       Mat Temp;

       CurrentMat.convertTo(Temp, CV_8U);

2.检查频道号:

 int theType = Temp.type();

    int channel_number = (theType / 8) + 1;

    if(channel_number == 4){

        cvtColor(Temp, Temp, CV_BGRA2BGR);
    }

3.您可以使用以下代码将Mat类型转换为QImage:

        QImage putImage(const 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();
        }
        else
        {
            qDebug() << "ERROR: Mat could not be converted to QImage.";
            return QImage();
        }
        }