RV1126 NO.35:OPENCV重点结构体Mat的讲解
OpenCV中Mat类是图像处理的核心数据结构,用于存储矩阵形式的图像数据。Mat对象包含矩阵头(元信息)和矩阵数据(像素值)。OpenCV支持8种数据类型(如CV_8U、CV_32F等)和4种通道数(单/双/三/四通道),可表示灰度图、RGB图像等。Mat提供多种构造方法:指定行列数、Size结构体、Scalar颜色填充等,并能创建全零/全一矩阵。通过调整参数可生成不同特性的图像矩阵,并保存为图
一.什么是Mat

在OpenCV中,Mat类是图像存储和处理的核心基础类。它主要用于存储各种矩阵形式的数据,包括向量、矩阵以及灰度或彩色图像等。每个Mat对象包含两个主要部分:矩阵头存储图像的元信息(如尺寸、色彩模式等),而矩阵数据则存储实际的像素值。开发者若需修改图像内容,实际上操作的是矩阵数据中的像素信息。
简而言之,Mat类就是以矩阵形式存储图像二进制数据的容器。

二.Mat的深度和字节类型
| CV_8U | 8位无符号类型 |
| CV_8S | 8位有符号类型 |
| CV_16U | 16位无符号类型 |
| CV_16S | 16位有符号类型 |
| CV_32S | 32位整型数据 |
| CV_32F | 32位浮点型数据 |
| CV_64F | 64位双精度类型 |
| 单通道 | 双通道 | 三通道 | 四通道 |
| CV_8UC1 | CV_8UC2 | CV_8UC3 | CV_8UC4 |
| CV_32SC1 | CV_32SC2 | CV_32SC3 | CV_32SC4 |
| CV_32FC1 | CV_32FC2 | CV_32FC3 | CV_32FC4 |
| CV_64FC1 | CV_64FC2 | CV_64FC3 | CV_64FC4 |
| CV_16SC1 | CV_16SC2 | CV_16SC3 | CV_16SC4 |
上面是Opencv的字节类型和通道数的定义,在OPENCV中通常分为四个通道和8种数据类型。分别是单通道(灰度图)、双通道(二值图像)、三通道(RGB彩色图像)、四通道(带Alpha的四通道图像)。
灰度图:

灰度图又称之为灰阶图,颜色介于白色和黑色之间按对数关系分为若干等级,这种图像称之为灰度。灰度分为256个阶
二值图像:

二值图像中的图像中每一个像素只有两个值分别是0和1,其中0表示黑色、1表示白色
三通道图像:

三通道(RGB)图像也就是我们所说的RGB图像,所以三通道图像可以用来彩色图像。
四通道图像:

四通道(ARGB)也就是在RGB彩色图像中,添加了透明度Alpha
2.1.单通道分类:
CV_8UC1:指的是一个8位无符号整型单通道矩阵
CV_32SC1:指的是一个32位整型单通道矩阵
CV_32FC1:指的是一个32位浮点型单通道矩阵
CV_64FC1:指的是一个64位浮点型单通道矩阵
CV_16SC1:指的是一个16位整型单通道矩阵
2.2.双通道分类:
CV_8UC2:指的是一个8位无符号整型双通道矩阵
CV_32SC2:指的是一个32位整型双通道矩阵
CV_32FC2:指的是一个32位浮点型双通道矩阵
CV_64FC2:指的是一个64位浮点型双通道矩阵
CV_16SC2:指的是一个16位整型双通道矩阵
2.3.三通道分类:
CV_8UC3:指的是一个8位无符号整型三通道矩阵
CV_32SC3:指的是一个32位整型三通道矩阵
CV_32FC3:指的是一个32位浮点型三通道矩阵
CV_64FC3:指的是一个64位浮点型三通道矩阵
CV_16SC3:指的是一个16位整型三通道矩阵
2.4.四通道分类:
CV_8UC4:指的是一个8位无符号整型四通道矩阵
CV_32SC4:指的是一个32位整型四通道矩阵
CV_32FC4:指的是一个32位浮点型四通道矩阵
CV_64FC4:指的是一个64位浮点型四通道矩阵
CV_16SC4:指的是一个16位整型四通道矩阵
三.Mat的创建和构造方法
Mat的创建一般分为五种方式,分别是Mat(int rows, int cols, int type)、Mat(Size size, int type)、Mat::zeros(Size(width,height),type),下面我将把三种构造的方式都详细说一遍。
3.1.Mat(int rows, int cols, int type);
重载的构造函数,这个构造函数在创建的时候,提供矩阵的大小,分别是rows、cols以及存储类型type
rows:行数,也指的是图像的高度,height。
cols:列数,也指的是图像的宽度,width。
type:通道类型,具体的看上面的图
示例:Mat t1 = Mat(300,300,CV_8UC1),这指的是创建一个width:300,height:300,单通道的灰度图像.
3.2.Mat(Size size, int type);
重载的构造函数,这个构造函数在创建的时候,需要传入Size类和类型。
第一个传参:Size结构体,Size(width,height)
第二个传参:type通道类型,具体的看上面的图
示例:Mat t2 = Mat(Size(300,300),CV_8SC3),这指的是创建一个width:300,height:300,三通道的灰度图像
3.3.Mat(int rows, int cols, int type, const Scalar& s);
重载的构造函数,这个构造函数在创建的时候,提供矩阵的大小,分别是rows、cols、存储类型type、还有Scalar颜色标量。
第一个传参:rows行数,也指的是图像的高度,height。
第二个传参:cols列数,也指的是图像的宽度,width。
第三个传参:type通道类型,具体的看上面的图
第四个传参:Scalar颜色标量,Scalar(v0,v1,v2,v3),v0,v1,v2,v3分别对应OPENCV颜色分量的四个值
示例: Mat mat = Mat(300,300,CV_8UC3,Scalar(255,255,255));表示的是创建一个cols:300,rows:300,三通道的图像,颜色标量为白色的图像
3.4.Mat::zeros(rows,cols,type);
重载的构造函数,这个构造函数在创建的时候,提供矩阵的大小,分别是rows、cols以及存储类型type。ZROS相当于创建一张黑色的图片,每个像素通道为0,并且Scalar(0,0,0)。
第一个传参:rows行数,也指的是图像的高度,height。
第二个传参:cols列数,也指的是图像的宽度,width。
第三个传参:type通道类型,具体的看上面的图
示例: Mat::zeros(300,300,CV_8SC3);,这指的是创建一个width:300,height:300,三通道的彩色图像,Scalar(0,0,0),相当于
Mat mat = Mat(300,300,CV_8SC3,Scalar(0,0,0));
3.5.Mat::ones(rows,cols,type);
重载的构造函数,这个构造函数在创建的时候,提供矩阵的大小,分别是rows、cols以及存储类型type。ONES相当于每个像素第一个通道为1,后面两个通道为0。
第一个传参:rows行数,也指的是图像的高度,height。
第二个传参:cols列数,也指的是图像的宽度,width。
第三个传参:type通道类型,具体的看上面的图
示例: Mat::ones(300,300,CV_8SC3),这指的是创建一个width:300,height:300, 三通道的彩色图像,Scalar(1,0,0),
这等同于Mat mat = Mat(300,300,CV_8SC3,Scalar(1,0,0));
四.代码实现OPENCV创建Mat
4.1. 实现Mat构造,并保存到本地
Mat t0 = Mat(300, 300, CV_8UC3, Scalar(218,112,214));
imwrite("t0.jpg", t0);
这指的是创建一个width:300,height:300,三通道的灰度图像, 粉色的图像
4.2. 利用Mat(Size size, int type)构造生成矩阵数据,并保存到本地
Mat t1 = Mat(300, 300, CV_8UC3);
t1 = Scalar(255,0,0);
imwrite("t1.jpg", t1);
这指的是创建一个width:256,height:256,三通道的图像。
然后再用t1 = Scalar(255,0,0);把矩阵变成蓝色
最后把矩阵保存到本地
4.3. 利用Mat::zeros(rows,cols,type)构造生成矩阵数据,并保存到本地
Mat t2 = Mat::zeros(300,300,CV_8UC3);
imwrite("t2.jpg", t2);
利用zeros去创建矩阵,ZROS相当于创建一张黑色的图片,每个像素通道为0,并且Scalar(0,0,0)。
然后把图片保存到本地
4.4. 利用Mat::ones(rows,cols,type)构造生成矩阵数据,并保存到本地
Mat t3 = Mat::ones(300,300,CV_8UC3);
imwrite("t3.jpg", t3);
利用ones去创建矩阵,ONES相当于每个像素第一个通道为1,后面两个通道为0,相当于Scalar(1,0,0))
然后把图片保存到本地
4.5. Makefile的编写:
hide := @
ECHO := echo
#G++ := /home/hao/shared/rv1126_rv1109_linux_sdk_v1.8.0_20210224/prebuilts/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++
G++ := /opt/rv1126_rv1109_linux_sdk_v1.8.0_20210224/prebuilts/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++
CFLAGS := -I./include/rkmedia \
-I./include/rkaiq/common \
-I./include/rkaiq/xcore \
-I./include/rkaiq/uAPI \
-I./include/rkaiq/algos \
-I./include/rkaiq/iq_parser \
-I./rknn_rockx_include \
-I./im2d_api \
-I./sqlite3_source/include \
-I./arm_opencv_source/include
#-I./SDL_SOURCE/include
LIB_FILES := -L./rv1126_lib -L./sqlite3_source/lib -L./arm_opencv_source/lib #-L./SDL_SOURCE/lib
LD_FLAGS := -lpthread -leasymedia -ldrm -lrockchip_mpp \
-lavformat -lavcodec -lswresample -lavutil \
-lasound -lv4l2 -lv4lconvert -lrga \
-lRKAP_ANR -lRKAP_Common -lRKAP_3A \
-lmd_share -lrkaiq -lod_share -lrknn_api \
-lrockx -lsqlite3 -lopencv_core -lopencv_dnn \
-lopencv_features2d -lopencv_flann -lopencv_highgui \
-lopencv_imgcodecs -lopencv_imgcodecs -lopencv_imgproc \
-lopencv_ml -lopencv_objdetect -lopencv_photo -lopencv_shape \
-lopencv_stitching -lopencv_superres -lopencv_videoio -lopencv_video \
-lopencv_calib3d
CFLAGS += -DRKAIQ
SAMPLE_COMMON := common/sample_common_isp.c
SAMPLE_COMMON_02 := sample_common_isp.c
all:
$(G++) Opencv_Mat_Demo.cpp $(CFLAGS) $(LIB_FILES) $(LD_FLAGS) -o Opencv_Mat_Demo
$(hide)$(ECHO) "Build Done ..."
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)