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);