QT中对Mat类的一些操作详解
Mat类简介
Mat类是OpenCV图像处理库中常用的一个类,它可以用来存储图像数据信息,并提供了很多对图像进行操作的方法。在QT中,可以使用OpenCV库中的Mat类来进行图像处理操作。
Mat类的创建与初始化
Mat类提供了很多构造函数,可以根据不同的参数来创建不同的Mat对象。下面是一些常用的构造函数:
// 创建一个空的Mat对象
Mat M;
// 创建一个指定行数、列数、数据类型的Mat对象
Mat M(int rows, int cols, int type);
// 创建一个与给定的Mat对象拥有相同大小和类型的Mat对象
Mat M(const Mat& m);
// 使用给定的行列数、数据类型和指针创建Mat对象
Mat M(int rows, int cols, int type, void* data, size_t step = AUTO_STEP);
// 使用给定的行列数、数据类型的数字数组创建Mat对象
Mat M(int rows, int cols, int type, const Scalar& s);
需要注意的是,如果使用第四个构造函数创建Mat对象,需要自行分配内存。而如果使用第五个构造函数创建Mat对象,并不是所有的数据类型都可以使用Scalar类型进行初始化。例如,当数据类型为CV_8UC1时,必须使用Scalar(255)来初始化。
Mat类的基本使用
获取Mat对象的像素值
Mat类提供了at()方法可以使用像素点的坐标获取该像素点的值。该方法有两种形式:
// 获取指定行列坐标的像素值
Vec3b at(int y, int x) const;
// 获取指定点的像素值
Vec3b at(Point pt) const;
需要注意的是,获取像素值时,行列索引是从0开始的。而返回的像素值是采用向量类型的,可以通过[]操作符进行访问。
示例:
// 创建一个3*3的图像
Mat img(3, 3, CV_8UC3, Scalar(0, 0, 255));
// 获取第一行第二列的像素值
Vec3b pixel = img.at(0, 1);
// 输出像素值
qDebug() << "B:" << pixel[0] << " G:" << pixel[1] << " R:" << pixel[2];
输出结果:
B: 0 G: 0 R: 255
修改Mat对象的像素值
上面介绍了如何获取Mat对象的像素值,同样可以使用at()方法来修改Mat对象的像素值。需要注意的是,Mat对象的每个像素点可以由一个标量或一个向量类型的值来表示。而且向量类型的值必须与Mat对象的数据类型一致。
// 修改指定行列坐标的像素值
Vec3b& at(int y, int x);
// 修改指定点的像素值
Vec3b& at(Point pt);
示例:
// 创建一个3*3的图像
Mat img(3, 3, CV_8UC3, Scalar(0, 0, 255));
// 获取第一行第二列的像素值
Vec3b& pixel = img.at(0, 1);
// 修改像素值
pixel[0] = 255;
pixel[1] = 0;
pixel[2] = 0;
// 输出像素值
qDebug() << "B:" << pixel[0] << " G:" << pixel[1] << " R:" << pixel[2];
输出结果:
B: 255 G: 0 R: 0
总结
在QT中,使用OpenCV中的Mat类可以方便地对图像进行处理。本文介绍了Mat类的创建与初始化方法,以及获取和修改Mat对象的像素值的方法。Mat类的使用还包括很多其他常用的操作,例如图像几何变换、图像过滤等。如有需要,可以参考官方文档进行深入学习。
示例
void showMatInfo(const cv::Mat& mat) {
qDebug() << "Mat rows: " << mat.rows;
qDebug() << "Mat cols: " << mat.cols;
qDebug() << "Mat type: " << mat.type();
qDebug() << "Mat channel: " << mat.channels();
if (mat.channels() == 1) {
qDebug() << "Mat depth: " << mat.depth();
} else {
qDebug() << "Mat depth: " << mat.depth() << ", depth of each channel:" << mat.elemSize1();
}
}
void matConvertToQImage(cv::Mat srcImage, QImage& destImage) {
// 确定目标QImage的格式
const int colorChannel = srcImage.channels();
switch (colorChannel) {
case 1:
destImage = QImage(srcImage.cols, srcImage.rows, QImage::Format_Indexed8);
break;
case 3:
destImage = QImage(srcImage.cols, srcImage.rows, QImage::Format_RGB888);
break;
default:
break;
}
// 使用memcpy将Mat数据拷贝到QImage中
uchar *pSrc = srcImage.data;
uchar *pDest = destImage.bits();
int srcLineBytes = srcImage.step;
int destLineBytes = destImage.bytesPerLine();
const int lineHeight = srcImage.rows;
const int pixelBytes = colorChannel * sizeof(uchar);
for (int i = 0; i < lineHeight; i++) {
// 逐行拷贝
memcpy(pDest, pSrc, pixelBytes * srcImage.cols);
// 指针移动到下一行
pSrc += srcLineBytes;
pDest += destLineBytes;
}
}
void example() {
// 读取一张图像
cv::Mat srcImage = cv::imread("example.png");
// 显示一些图片信息
showMatInfo(srcImage);
// 对图像进行处理...
cv::Mat blurryImage;
cv::GaussianBlur(srcImage, blurryImage, cv::Size(5, 5), 0);
// 将OpenCV图像转换成QImage
QImage destImage;
matConvertToQImage(blurryImage, destImage);
// 显示QImage
QLabel* label = new QLabel;
label->setPixmap(QPixmap::fromImage(destImage));
label->show();
}
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:QT中对Mat类的一些操作详解 - Python技术站