2021年1月13日 星期三

[範例]如何在QT中顯示OpenCV開啟的影像

標題:[範例]如何在QT中顯示OpenCV開啟的影像

本篇以Visual Studio 2019做範例。


首先,你的Visual Studio 2019要先安裝好QT和OpenCV。

可以參考以下兩篇文章:


確定安裝好之後,建立一份QT專案。

然後按專案/[專案名稱]屬性。 (我懶得重新截圖,所以用舊圖)



找到VC++目錄的地方。

在Include目錄之後加上 ;C:\opencv\build\include

在程式庫目錄之後加上 ;C:\opencv\build\x64\vc15\lib

注意,前後要用「;」區隔。


然後你去C:\opencv\build\x64\vc15\lib。

找到類似opencv_world451.lib的東西,把檔名複製起來。

如果你的專案是debug模式,就要複製檔名後面有個d的,就是opencv_world451d.lib。

如果你的專案是release模式,就要複製opencv_world451.lib。


然後回到剛剛的屬性頁。

按連接器/輸入。
在其他相依性的地方加入剛剛複製的opencv_world451.lib。
因為我現在是debug模式,所以是opencv_world451d.lib。
注意,前後要用「;」區隔。



接下來要打程式碼了,在這個QT專案找到一個繼承QMainWindow的class。

它的位置應該在[專案名稱].h的地方。

我的專案名稱是kaleido_painter,所以是kaleido_painter.h。


然後在裡面的public之類的地方加入這段:

void paintEvent(QPaintEvent*);



範例:(kaleido_painter是我的專案名稱,請更改為自己的)
(新增的程式碼片段為紅色處)

class kaleido_painter : public QMainWindow
{
    Q_OBJECT

public:
    kaleido_painter(QWidget *parent = Q_NULLPTR);
    void paintEvent(QPaintEvent*);

private:
    Ui::kaleido_painterClass ui;
};

然後到main.cpp的地方,引入以下套件及名稱空間:

#include <QtWidgets/QApplication>
#include <QWidget>
#include <QPainter>
#include <QPen>
#include <QBuffer>
#include<opencv2/opencv.hpp>
using namespace cv;

並在main函數的上方填入以下程式碼:

範例:(kaleido_painter是我的專案名稱,請更改為自己的)
記得紅色的檔名處要改成你的圖片路徑。
void kaleido_painter::paintEvent(QPaintEvent* event)
{
Q_UNUSED(event);
QPainter painter(this);
Mat img = imread("C:/ckey/0.jpg", -1);
QImage* myImage = new QImage;
*myImage = QImage((unsigned char*)img.data, img.cols, img.rows, img.step, QImage::Format_RGB888);
painter.drawImage(QRect(30, 50, 500, 300), *myImage);
}

輸入完後按下執行。

會看到我那超讚的立華奏彈鋼琴圖被畫到QT上去了,但顏色怪怪的。

那是因為OpenCV讀取到的影像的顏色順序是BGR,而QT的QImage讀取顏色的順序則是RGB,怎麼處理呢,有兩個方法。

方法一:
使用 cv::cvtColor(img, img, cv::COLOR_BGR2RGB);


使用OpenCV的cvtColor語法將BGR轉成RGB。

更改後的語法如下(深紅色處):
void kaleido_painter::paintEvent(QPaintEvent* event)
{
Q_UNUSED(event);
QPainter painter(this);
Mat img = imread("C:/ckey/0.jpg", -1);
cv::cvtColor(img, img, cv::COLOR_BGR2RGB);
QImage* myImage = new QImage;
*myImage = QImage((unsigned char*)img.data, img.cols, img.rows, img.step, QImage::Format_RGB888);
painter.drawImage(QRect(30, 50, 500, 300), *myImage);
}

第二個方法則是改變QImage的格式,將Format_RGB888改成Format_BGR888。
更改後的語法如下(深紅色處):
void kaleido_painter::paintEvent(QPaintEvent* event)
{
Q_UNUSED(event);
QPainter painter(this);
Mat img = imread("C:/ckey/0.jpg", -1);
QImage* myImage = new QImage;
*myImage = QImage((unsigned char*)img.data, img.cols, img.rows, img.step, QImage::Format_BGR888);
painter.drawImage(QRect(30, 50, 500, 300), *myImage);
}

使用這兩種方法的任一一種更改完後,我那張超讚的立華奏的圖就被以正常的色彩畫到QT的視窗上去了。


=====分隔線=====
如果覺得立華奏很讚,或這篇文有幫助到你們的話,請留言或幫忙按個廣告吧。

您的支持是我寫文的最大動力。

如果失敗了,也請留言讓我知道,看看哪個環節出了問題,我有看到就會回。


希望這篇文有幫助到各位ξ( ✿>◡❛)

沒有留言:

張貼留言

有興趣或有疑問的歡迎提問與交流喔!!!