c++ opencv mat_1、OpenCV入门:图片显示

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

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

1.1 新建Qt项目

d61148828d2277cf7ad45dc5e63c8df4.gif
新建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,点击头文件名,可以跳转到头文件内容。

32e5263eb044f6cdc30e49d21634cbed.png

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

1.5 显示图片

1.5.1 OpenCV显示

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

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

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

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

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

3b2f9ea8ea184c54f9d7cf0ecca9f37c.png

1.5.2 Qt显示图片

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

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

0300dbff2f6e80d48d5339271cec62d3.png

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

0237ef58a97fd8d9d5cdabb7fcb1e8f8.png

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.html​docs.opencv.org

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

ea32681dda752a73be9c8e852b66c1ad.png

代码在github中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值