OpenCV中表示图像的类Mat在QT里的基本使用

在Qt中使用OpenCV的Mat类来表示和处理图像是相对简单的,因为Qt和OpenCV都是跨平台的,并且可以很好地在一起工作。以下是如何在Qt项目中使用OpenCV的Mat类的基本步骤:

1.在Qt代码中包含OpenCV头文件

在Qt的源代码文件中,你需要包含OpenCV的头文件以及opencv统一的命名空间来使用Mat类。

#include <opencv2/opencv.hpp>
using namespace cv;  //opencv 统一的命名空间

2.创建图片对象

   Mat src;

3.加载本地图像

从硬盘中读取一张图片,赋值给M at 对象
Mat imread( const String& filename, int flags = IMREAD_COLOR );
参数 1 :图片的路径
参数 2 :图像的色彩空间模式(默认为 BGR
返回值:图像对象
色彩空间: QT:为RGB ;opencv为 BGR(opencv 默认的 )
虽然都是三原色组成,但是他们不是一样的色彩空间,因为顺序不一样
Mat src = imread(" 图片绝对路径 ");
例:
Mat src = imread("D:/opencv/1.jpg");

4.在窗口显示图像

void imshow(const String& winname, const ogl::Texture2D& tex);
参数 1 :窗口名称
参数 2 :图像对象 Mat 就可以
Mat src = imread("D:/opencv/1.jpg");
imshow("src", src);
在名字叫 src 的窗口中显示 Mat 对象 src 中的图片。

5.转换图像色彩空间 色彩空间(一个像素点的组成)

void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 );
参数 1 :输入图像
参数 2 :输出图像
参数 3:转换色彩空间 CV_BGR2GRAY(转灰度空间),还可以转其他色彩空间
参数 4 :通道数,默认根据色彩空间决定
常用来将 BGR 转成 Gray ,灰度图虽然难看 但是保留了原图像 的所有特征
例: BGR 空间转灰度空间
Mat src = imread(" 路径 ");
Mat gray;
cvtColor(src,gray,CV_BGR2GRAY);
imshow("src",src);
imshow("gray",gray);

6.保存图像到本地

bool imwrite( const String& filename, InputArray img, const std::vector& params = std::vector());
参数 1 :图片文件的名字
参数 2 :保存的图像对象
参数 3 :参数(一般不需要指定)
注意:只有 8 位、 16 位的 PNG JPG Tiff 文件格式而且是单通道或者三通道的 BGR 的图像才可以通过这 种方式保存。
// 把这张灰度图保存到工程路径下 
imwrite("gray.jpg",gray);  //参数:文件的名字    Mat 对象

7.OpenCVBGR)Mat图片转换成qt(RGB)QImage 图片

通过 opencv 加载的图片,是不能在 qt 上直接使用的,
opencv的图片类型是 Mat qt 的图片类型是 QImage。

7.1 首先将opencvBGR通道的图片转换成RGB通道的,因为QT支持的通道是RGB

Mat rgb;
cvtColor(src, rgb, CV_BGR2RGB);
Mat 对象 src BGR 色彩空间转换到 RGB 空间,将转换后的图像存放到 rgb 对象中。

7.2 以rgb对象使用的数据创建新的QImage对象。

QImage img(rgb.data, rgb.cols, rgb.rows, rgb.cols rgb.channels(), QImage::Format_RGB888);
参数 1 rgb 对象的数据
参数 2 rgb 图像的宽度
参数 3 rgb 图像的高度
参数 4 rgb 图像每一行的通道数 rgb.cols* rgb.channels()
参数 5 QImage 对象的格式
QImage img( rgb.data, rgb.cols, rgb.rows, rgb.cols* rgb.channels(),QImage::Format_RGB888);

7.3  例子:显示一张Mat图像 在label

void MainWindow::on_pushButton_show_clicked()
{
//Mat对象
Mat src = imread("D:/opencv/psb.jpeg");
if(src.empty())
{
qDebug()<<"load fail";//#include<QDebug>
return;
}
//转换色彩空间 BGR --> RGB
Mat rgb;
cvtColor(src,rgb,CV_BGR2RGB);
imshow("src",src);
imshow("rgb",rgb);
//mat --> QImage img
//rgb图像的数据 宽 高 通道数 QImage的格式
QImage img(rgb.data,rgb.cols,rgb.rows,rgb.cols*rgb.channels(),QImage::Format_RGB888);
QPixmap p = QPixmap::fromImage(img);
//label进行显示
ui->label_image->setPixmap(p);
}

这就是图像的类Mat在QT里的基本使用,本次代码分享到此结束,感谢大家的观看,希望大家点点赞,点点关注,后续还会发有关OpenCV的级联分类器和人脸识别器,谢谢!

  • 38
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值