硬件和软件部分搞定之后,就可以正式上手了。很多书或者教程开始都是介绍OpenCV的历史等等之类的,但是一般人对这些都没兴趣,也不需要知道,所以本文就略过了。

OpenCV系列的第一个实例就是打开图片,而且一般人也不喜欢黑框框。现在找工作都是要求了解一定的图形框架,根据难易程度,我们从Qt开始。同时会添加一些函数或者其他信息。

1.1 新建Qt项目




opencv mat图像转rgba数组 opencv mat setto_Qt


新建Qt项目

1.2 添加库文件位置

在Qt项目文件*.pro中添加OpenCV库文件位置


unix:{
INCLUDEPATH += /usr/include/opencv4/
LIBS += 
        -lopencv_core -lopencv_highgui -lopencv_videoio 
        -lopencv_imgcodecs -lopencv_imgproc -lopencv_ml
}

win32:{
INCLUDEPATH += C:Librariesopencvbuildinclude

LIBS += -LC:Librariesopencvbuildx64mingwbin 
        -lopencv_core412 
        -lopencv_dnn412 
        -lopencv_highgui412 
        -lopencv_imgcodecs412 
        -lopencv_imgproc412 
        -lopencv_ml412
}


1.3 临时文件处理

Qt编译后会产生很多的中间文件,我们通过项目设置来将临时文件移至统一的文件夹中。


DESTDIR = bin #可执行文件位置
OBJECTS_DIR = tmp/obj # gcc编译后的obj文件位置
RCC_DIR = tmp/rcc #Qt的resource文件编译后的位置
UI_DIR = tmp/ui #UI文件编译后的位置
MOC_DIR = tmp/moc #Qt的一种机制编译后文件位置


1.4 包含头文件


#include <opencv2/opencv.hpp>
using namespace cv;


在Qt中按住Ctrl,点击头文件名,可以跳转到头文件内容。


opencv mat图像转rgba数组 opencv mat setto_Qt_02


可以看到此头文件已经包含了所有需要的其他头文件,所有只需要这一个就够了。

1.5 显示图片

1.5.1 OpenCV显示

OpenCV库中提供了GUI界面用于显示图片

在mainwindow.cpp中mainwindow构造函数中添加代码:


Mat srcImage = imread("lena.jpg");//读取图片
imshow("lena",srcImage);//显示图片


显示图片函数中有两个参数:第一个是显示窗口名称,必须是英文,如果为中文会无法显示;第二个参数是图片数据。

lena图片要与可执行文件在同一个文件夹中。


opencv mat图像转rgba数组 opencv mat setto_Qt_03


1.5.2 Qt显示图片

既然是图像界面,那么就应该有打开、显示的过程。Qt图片操作是通过QImage类来操作的。

在Qt的UI界面中添加菜单栏和动作


opencv mat图像转rgba数组 opencv mat setto_Qt_04


在菜单栏中添加File菜单,在File菜单下添加Open行为。在下方的列表中选中actionOpen右击“转到槽”


opencv mat图像转rgba数组 opencv mat setto_Qt_05


triggered表示鼠标点击这个操作行为。这样在mainwidow.cpp中会生成一个槽函数,点击后会执行槽函数中的代码。


//打开操作,然后选择图片
QString filePath = QFileDialog::getOpenFileName(this,tr("Open"));
if(filePath.isEmpty()){//如果没有选中图片,则退出
    qDebug()<<"Select nothing";
    return;
}

QTextCodec *codec = QTextCodec::codecForName("UTF-8");
std::string imagePath = codec->fromUnicode(filePath).data();//将QString转换为std::string

Mat srcImage = imread(imagePath);//从选中的图片的位置读取数据
if(!srcImage.data){//如果数据为空则退出,保险起见
    //对话框显示错误信息
    QMessageBox::information(this,tr("Waring"),tr("Cannot find data in selected file"),QMessageBox::Ok);
    return;
}

ui->labelImg->clear();//清空界面中label中的所有信息
cvtColor(srcImage,srcImage,COLOR_RGB2BGR);//数据转换
QImage img = QImage((const unsigned char*)(srcImage.data),
                    srcImage.cols,srcImage.rows,srcImage.cols*srcImage.channels(),
                    QImage::Format_RGB888);//获取mat中的数据,并填充到QImage对象中
//img = img.scaled(label->size());
ui->labelImg->setPixmap(QPixmap::fromImage(img));//显示图片


具体的函数说明、参数、实例详见Qt的实例和官方文档库。

https://docs.opencv.org/4.1.2/index.htmldocs.opencv.org


按照一般的软件操作,点击file,点击open,选中图片,将会自动显示。


opencv mat图像转rgba数组 opencv mat setto_opencv mat图像转rgba数组_06


代码在github中。