OpenCV Mat类简介,Mat对象创建与赋值 C++实现

在 C++ 中,OpenCV 提供了一个强大的类 Mat 来表示图像和多维矩阵。Mat 类是 OpenCV 中最基础和最常用的类,用于存储和操作图像数据。

Mat类简介

Mat 类是一个多维的、通用的、压缩的数组容器,主要用于表示图像、点集、特征向量、矩阵等数据。Mat 的底层数据存储采用连续内存块,可以高效地进行矩阵操作和图像处理。

Mat 类的定义

class CV_EXPORTS Mat {
public:
    // 默认构造函数
    Mat();

    // 构造函数
    Mat(int rows, int cols, int type);
    Mat(Size size, int type);
    Mat(int rows, int cols, int type, const Scalar& s);
    Mat(Size size, int type, const Scalar& s);

    // 拷贝构造函数
    Mat(const Mat& m);

    // 赋值操作符
    Mat& operator = (const Mat& m);

    // 其他成员函数...

    // 数据访问
    uchar* data;
    int rows, cols;
    // 其他成员变量...
};

Mat 类的构造函数

默认构造函数

Mat();

创建一个空的 Mat 对象。

指定尺寸和类型的构造函数

Mat(int rows, int cols, int type);
Mat(Size size, int type);
Mat(int rows, int cols, int type, const Scalar& s);
Mat(Size size, int type, const Scalar& s);

创建一个指定尺寸和类型的 Mat 对象。type 参数指定了矩阵元素的类型,例如 CV_8UC1 表示单通道 8 位无符号整型,CV_8UC3 表示三通道 8 位无符号整型。

拷贝构造函数

cpp
复制代码
Mat(const Mat& m);

创建一个 Mat 对象,并复制另一个 Mat 对象的数据。

代码示例

深拷贝示例

Mat dst1,dst2;
dst1 = image.clone();
image.copyTo(dst2);

此时dst1,dst2 都是拷贝了image指向的数据。image的数据改变,dst1,dst2都不会随之改变

赋值示例

  // 创建空白图像 创建一个8*8的全为0的矩阵, 矩阵的宽度 等于 8*通道数 ,这里的通道数为1 ,一般代表为灰度图
    Mat dst3 = Mat::zeros(Size(8,8),CV_8UC(1));
//    cout<<dst3<<endl;
    cout<<"dst width :"<<dst3.cols<<" dst height :"<<dst3.rows<<" dst3 channel :"<<dst3.channels()<<endl;
    // 创建空白图像 创建一个4*4的全为1的矩阵, 矩阵的宽度 等于 4 *通道数 ,这里的通道数为3,一般代表为彩色图
    Mat dst4 = Mat::ones(Size(4,4),CV_8UC(3));
    // ones 用的时候要小心, 他不会把全部数据初始化为1,只会把第一个通道的函数初始化为1,其余通道为0
    cout<<dst4<<endl;
    cout<<"dst4 width :"<<dst4.cols<<" dst4 height :"<<dst4.rows<<" dst4 channel :"<<dst4.channels()<<endl;

    dst3= 15;  //也可以直接赋值 ,这样会直接给第一个通道值全赋值为15
    cout<<dst3<<endl;
    cout<<"dst3 width :"<<dst3.cols<<" dst3 height :"<<dst3.rows<<" dst3 channel :"<<dst3.channels()<<endl;

CV_8UC1 详解

  • CV: OpenCV 定义的前缀,表示这是一个 OpenCV 的类型。
  • 8U: 表示每个元素是 8 位无符号整型(8-bit Unsigned)。
  • C1: 表示图像有一个通道(1 Channel)。

因此,CV_8UC1 表示一个具有单通道的 8 位无符号整型图像。每个像素点用一个 8 位的值表示,范围是 0 到 255,通常用于表示灰度图像。同理CV_8UC3 表示一个具有三个通道的 8 位无符号整型图像。每个像素点由三个 8 位值组成,通常用于表示彩色图像。C3代表三个通道。

Mat重载了输出,因此可以直接打印

在这里插入图片描述

  //创建512*512的图像, 具有三个通道,并给第一个通道赋值为1.
    Mat dst5 = Mat::ones(Size(512,512),CV_8UC(3));
    //使用Scalar可以创建多维通道
    dst5 = Scalar(255,0,0);

Scalar函数详解

在 OpenCV 中,Scalar 是一个常用的数据结构,用于表示一个包含四个元素的向量,通常用于定义颜色和其他多通道数据。Scalar 函数主要用于图像处理和计算机视觉中的各种操作,例如设置绘图颜色、定义阈值范围等。

  1. 基本概念

Scalar 是一个包含四个元素的向量,通常用于表示颜色(BGR 或者 BGRA)或者其他多通道数据。在 OpenCV 中,Scalar 的定义如下:

Scalar(double v0, double v1=0, double v2=0, double v3=0)
  1. 构造函数参数
  • v0:第一个元素的值(例如蓝色通道的值)。
  • v1:第二个元素的值(例如绿色通道的值,默认值为 0)。
  • v2:第三个元素的值(例如红色通道的值,默认值为 0)。
  • v3:第四个元素的值(例如 Alpha 通道的值,默认值为 0)。
  1. 常用方法
  • Scalar():默认构造函数,初始化所有元素为 0。
  • Scalar(double v0, double v1, double v2, double v3):初始化四个元素的构造函数。
  • val[i]:访问第 i 个元素的值(i 的范围是 0 到 3)。
  1. 常用场景
  • 定义颜色:在绘图函数中使用,例如 cv2.line()cv2.rectangle()cv2.circle() 等。
  • 阈值处理:用于定义阈值范围,例如 cv2.inRange()
  • 图像初始化:用于初始化图像中的所有像素值。

例如 dst5 = Scalar(255,0,0); 因为OpenCV默认为BGR 蓝色优先,显示这个图像的话,就会是纯蓝色

在这里插入图片描述

浅拷贝示例

   //创建512*512的图像, 具有三个通道,并给第一个通道赋值为1.
    Mat dst5 = Mat::ones(Size(512,512),CV_8UC(3));
    //使用Scalar可以创建多维通道
    dst5 = Scalar(255,0,0);
    show_image(dst5);
    // 浅拷贝示例, dst6 会随着 dst5 变化而变化
    Mat dst6 =dst5;
    dst5 = Scalar(255,255,0);
    imshow("dst5",dst5);
    imshow("dst6",dst6);
    waitKey(0);

此时,dst5 和dst6都是指向了相同的内存区域,因此,dst6也会随着dst5变化而变化。如下图所示,dst5的值改变了,dst6的值也跟着改变

在这里插入图片描述

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Trump. yang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值