1. 程式人生 > >Qt + opencv mat轉換成qimage後無法使用qpainter顯示

Qt + opencv mat轉換成qimage後無法使用qpainter顯示

Qt下配置opencv已經成功,系統為win764位。使用的vs2010編譯器。至於怎麼配置好的,有其他的資訊可以找到。或者改天給寫出來。

為了顯示圖片,看有的人使用qlabel,這個就不必過多描述,除了能顯示,並不能做別的事情。Qt下正兒八經顯示的方法還是qpainter。這個是做繪圖板用的,還可以在上面畫很多的影象。QPainter加上QImage,是比較合理的組合。

問題就出來了。我用opencv讀取一個視訊,用>>匯入到mat結構中,然後轉換成QImage結構,在paintEvent中進行重新整理顯示。是可以的。其中關鍵的轉換程式碼如下:

Mat temp,image;

temp = imread(“…”);

cvtColor(temp,image,CV_BGR2RGB);

img=QImage((unsignedchar*)(image.data),image.cols,image.rows,image.step,QImage::Format_RGB888);

這樣是可以顯示的,可是在imread後得到image就無法顯示,輸出視窗輸出:

The program has unexpectedly finished.

報錯介面為:

查看了每一個環節,轉換後的img,通過QLabel是可以正常顯示的。但是就是進入到paintEvent後就出現以上的問題。用各種高大上的搜尋引擎也找不到問題出在哪裡。

paintEvent()關鍵程式碼如下

painter.begin(this);

painter.drawImage(ui->frame_preview->x()+ui->centralWidget->x(),

ui->frame_preview->y()+ui->centralWidget->y(),

img);

painter.end();

並沒有什麼玄妙的地方。曾經一度懷疑人品問題。除錯了一個上午就是卡到這裡。

不過受到啟發後,得到QImage型別其實可以自己讀取圖片,但是讀取進來jpg格式是FORMAT_RGB32,不是原來的FORMAT_RGB888

,這個可以轉換一下。讀進來之後就可以正常顯示了,也可以在上面畫各種圖形。

問題沒有真正得到解決,但是通過其他方法實現了目的。以後有方法解決再記錄下來。

img.load(fileInfo_jpg->at(index_jpg).filePath());

img.convertToFormat(QImage::Format_RGB888);