我已经开始学习Qt,并试图制作一个简单的视频播放器,它将加载视频并播放它。它工作得很好。现在添加了阈值功能。阈值将从spinBox中获得。 代码的写入方式是除了值为0(显示正常视频)之外,阈值操作将在spinBox中以值的形式完成。 所以这是我的同一个函数:如何将灰度/二进制Mat转换为QImage?
void Player::run()
{
while(!stop)
{
if(!capture.read(frame))
stop = true;
// convert RGB to gray
if(frame.channels() == 3)
{
if(thresh == 0)
{
cvtColor(frame, RGBframe, CV_BGR2RGB);
img = QImage((const unsigned char*)(RGBframe.data),
RGBframe.cols,RGBframe.rows,QImage::Format_RGB888);
}
else
{
Mat temp;
cvtColor(frame, temp, CV_BGR2GRAY);
threshold(temp, binary, thresh, 255, 0);
img = QImage((const unsigned char*)(binary.data),
binary.cols, binary.rows, QImage::Format_Indexed8);
bool save = img.save("/home/user/binary.png");
cout<<"threshold value = "<<thresh<<endl;
//imshow("Binary", binary);
}
}
else
{
if(thresh == 0) // original Image
{
img = QImage((const unsigned char*)(frame.data),
frame.cols,frame.rows,QImage::Format_Indexed8);
}
else // convert to Binary Image
{
threshold(frame, binary, thresh, 255, 0);
img = QImage((const unsigned char*)(binary.data),
binary.cols, binary.rows, QImage::Format_Indexed8);
}
}
emit processedImage(img);
this->msleep(delay);
}
}
为SPINBOX值等于0,则运行正常,但当SPINBOX值增加我只得到黑屏。我试过imshow(cv:: Mat binary)
,它显示正确的二进制图像,但当我尝试保存QImage img
时,它是一些随机的黑白像素(尽管原始帧的大小相同)。
看来你缺少一个colorTable。在while循环之前添加:'QVector sColorTable(256);对于(int i = 0; i <256; ++ i){sColorTable [i] = qRgb(i,i,i);}',并且在从二进制文件创建'QImage'后,添加'img.setColorTable sColorTable);' –
Miki
彩色图像输入案例还是灰度图像输入案例? afair灰度不是在Qt中索引的类型,afair我不得不使用颜色表。 – Micka