在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.OpenCV(BGR)Mat图片转换成qt(RGB)QImage 图片
通过
opencv
加载的图片,是不能在
qt
上直接使用的,
opencv的图片类型是
Mat
,
qt
的图片类型是
QImage。
7.1 首先将opencv中BGR通道的图片转换成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的级联分类器和人脸识别器,谢谢!