一、Mat类的综述
1. Mat 类存储图像
Mat 类是 OpenCV 里面使用广泛的一个类,最重要的一个作用就是作为存储图像的数据结构。Mat类是如何存储图像的呢?图像分为彩色图像和灰度图像,不管是彩色图像还是灰度图像,都是二维的矩阵,具体的存储格式如下:
(1)灰度图像的格式:

(2)彩色图像的格式:

虽然彩色图像由BGR三个通道,但是是存储在同一个平面内的,只不过OpenCV在这里把三列才当作一列,因此有 img.cols 等于图像的列数。
一般我们用 OpenCV 读取的灰度图像的数据类型为 uchar 类型的,而彩色图像的一个像素的数据类型为 <Vec3b> 类型,灰度图一个像素占用一个字节,而彩色图像一个像素3个字节。接下来简单介绍如何按像素读取图像。
2. Mat 按像素读取图像内容
这里主要介绍两种方法:一种非常简单,易于编程,但效率比较低;另一种效率高,但不好记。
(1)易于编程的方法
#include <opencv2\core\core.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
Mat img = imread("1.jpg");
resize(img, img, Size(375, 500));//resize为500*375的图像
cvtColor(img, img, CV_RGB2GRAY);//转为灰度图
imshow("gray_ori", img);
for (int i = 0; i < img.rows; i++)
{
for (int j = 0; j < img.cols; j++)
{
//at<类型>(i,j)进行操作,对于灰度图
img.at<uchar>(i, j) = i+j;
}
}
imshow("gray_result", img);
waitKey(0);
return 0;
}
效果图:


本文详细介绍了OpenCV中的Mat类,包括如何存储图像(灰度图像和彩色图像)以及按像素读取图像内容的两种方法。Mat类用于存储图像数据,灰度图每个像素占一个字节,彩色图每个像素占三个字节。通过at操作符和指针访问像素,前者简单但效率较低,后者高效但较复杂。文章还讨论了Mat类中的变量参数,如rows、cols、step1()、step[]、size、elemSize和elemSize1,提供了相关测试代码和结果分析。
&spm=1001.2101.3001.5002&articleId=88907771&d=1&t=3&u=28d88932282e4b259dd42017fd201c5e)
2358

被折叠的 条评论
为什么被折叠?



