2016-08-20 48 views
1

我正在爲我的數字圖像處理類做家庭作業,我正在使用OpenCV與QT框架。QWidget繪製扭曲的角度QImage

我創建了一個類ImageDisplay,它是QWidget類的子類。

我已經使用OpenCV來操縱灰度圖像,然後從Mat對象中創建一個QImage對象。之後,我使用QWidget::drawImage()來繪製圖像。但有時它會顯示扭曲的,有角度的圖像。

我在做實驗,發現它與圖像尺寸有關。

例如,對於320x391像素這個圖像被正常再現 The image with 320x391 pixels is rendered normally

但是,如果變化的尺寸,以321x391(使用瘸子),它顯示了這樣的: The image with 321x391 pixels is rendered anormally

這是代碼該paintEvent方法:

void ImageDisplay::paintEvent(QPaintEvent *){ 
    QPainter painter(this); 
    Mat tmp; 
    /* The mat in the next line is a Mat object that contains the image data */ 
    cvtColor(mat, tmp, CV_GRAY2BGR); 
    QImage image(tmp.data, tmp.cols, tmp.rows, QImage::Format_RGB888); 
    painter.drawImage(rect(), image); 
} 

有沒有人有一個線索,這是什麼問題,如何解決?

在此先感謝!

+1

你在哪裏調整圖像大小?看起來你改變了尺寸,但使用舊的數據緩衝區(舊的尺寸)。你可以看到你看着你的_tilted_圖像的底部黑色行 – Miki

+0

哦,不。我沒有使用代碼調整圖像大小。我只是使用gimp並改變了圖像大小。 –

回答

3

我想你可能需要指定圖像(每行字節數)在第四個參數QImage的創建時的步驟:

QImage image((const uchar*) tmp.data, tmp.cols, tmp.rows, tmp.step, QImage::Format_RGB888); 
+0

哇,這工作!非常感謝你!!你能解釋一下這個參數的作用嗎? –

+2

我會嘗試...進行優化,opencv將圖像存儲在每行不等於圖像寬度的確定數量的像素中(您可能需要14像素寬度的圖像,但opencv會創建16像素寬度)。 Step參數告訴16,但cols告訴14。 – ikaro