我已經開始學習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