我正在使用相机来获取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非常狡猾),而且我无法真正看到我的相机显示的内容。
感谢您的回答, 格雷
答案 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();
}
}