码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • OpenCV_Mat类对象的基本操作、常用操作及相关成员函数介绍


    OpenCV的Mat类有许多成员函数,我们可以利用这些成员函数实现Mat类对象的基本操作、常用操作。

    本文列举出Mat类常用的成员函数及其功能。

    说明:本文提供的示例代码请到页面 https://www.hhai.cc/thread-75-1-1.html 查看。

    目录

    • 01-成员函数Mat::row():获取矩阵的某行(与原矩阵共用内存空间)
      • 01-1 成员函数Mat::row()的简单使用
      • 01-2 成员函数Mat::row()的应用:实现矩阵的行间运算
    • 02-成员函数Mat::col():获取矩阵的某列(与原矩阵共用内存空间)
    • 03-成员函数Mat::rowRange():获取矩阵的某几行(与原矩阵共用内存空间)
    • 04-成员函数Mat::colRange():获取矩阵的某几列(与原矩阵共用内存空间)
    • 05-成员函数Mat::clone():创建矩阵或矩阵子矩阵的副本(深拷贝,不与原矩阵共用内存空间)
    • 06-成员函数Mat::copyTo():复制矩阵到另一矩阵(深拷贝,不与原矩阵共用内存空间)
    • 07-成员函数Mat::convertTo():实现矩阵元素的数据类型的转换
    • 08-成员函数Mat::zeros():初始化一个所有元素值都为零的矩阵
    • 09-成员函数Mat::ones():初始化一个所有元素值都为1的矩阵
    • 10-成员函数Mat::size():获取矩阵的size(列数、行数)
    • 11-成员函数Mat:type():)获取矩阵的type
    • 12-成员函数Mat:channels():获取矩阵的通道数
    • 13-成员函数Mat:at():访问某个矩阵元素的值
    • 14-成员函数Mat::depth():获取矩阵元素的数据类型
    • 15-成员函数Mat::operator()(const Rect& roi) const:选择ROI区域(感兴趣矩形区域),并实现深拷贝和浅拷贝
      • 15-1 深拷贝ROI区域
      • 15-2 浅拷贝ROI区域
      • 15-3 将一个矩阵(图像)复制到另一矩阵(图像)的指定区域(ROI)【深拷贝】
    • 16-成员函数Mat:empty():判断Mat对象的数据是否为空

    01-成员函数Mat::row():获取矩阵的某行(与原矩阵共用内存空间)

    成员函数Mat::row()用于获取矩阵的某行(与原矩阵共用内存空间)

    01-1 成员函数Mat::row()的简单使用

    示例代码请查看本文开头的说明。

    示例代码运行结果如下:
    请添加图片描述

    01-2 成员函数Mat::row()的应用:实现矩阵的行间运算

    示例代码请查看本文开头的说明。

    示例代码运行结果如下:
    在这里插入图片描述

    02-成员函数Mat::col():获取矩阵的某列(与原矩阵共用内存空间)

    成员函数Mat::col()用于获取矩阵的某列(与原矩阵共用内存空间)

    示例代码就不给了,因为这个的使用与上一个成员函数Mat::row()的使用一模一样,只是Mat::col()获取到的是列,而Mat::row()获取到的是行。

    03-成员函数Mat::rowRange():获取矩阵的某几行(与原矩阵共用内存空间)

    成员函数Mat::rowRange()用于获取矩阵的某几行(与原矩阵共用内存空间)

    成员函数Mat::rowRange()的原型如下:

    Mat cv::Mat::rowRange(int startrow, int endrow) const
    
    • 1

    参数startrow和参数endrow设置要选取的连续行区域的起始行和结束行。注意由这两个参数设置选取的行区间[startrow, endrow)是左开右闭区间。举个例子,[0, 2)选取的是第0行和第1行,没有第二行。

    示例代码如下:

    Image1.rowRange(1,4) = 88; //把第1行到第三行的元素的值修改为88
    std::cout << Image1.rowRange(1,4) << std::endl; //输 Image1第一行至第三行的数据 
    
    • 1
    • 2

    04-成员函数Mat::colRange():获取矩阵的某几列(与原矩阵共用内存空间)

    成员函数Mat::colRange()用于获取矩阵的某几列(与原矩阵共用内存空间)
    该成员函数与上一个成员函数Mat::rowRange()的使用方法完全一样,这里就不再赘述。

    05-成员函数Mat::clone():创建矩阵或矩阵子矩阵的副本(深拷贝,不与原矩阵共用内存空间)

    成员函数Mat::clone()用于创建矩阵或矩阵子矩阵的副本(深拷贝,不与原矩阵共用内存空间)

    示例代码请查看本文开头的说明。

    示例代码运行结果如下:
    请添加图片描述

    06-成员函数Mat::copyTo():复制矩阵到另一矩阵(深拷贝,不与原矩阵共用内存空间)

    成员函数Mat::copyTo()用于复制矩阵到另一矩阵(深拷贝,不与原矩阵共用内存空间)

    示例代码请查看本文开头的说明。

    示例代码运行结果如下:
    请添加图片描述
    从上面的运行结果我们可以看出函数clone()和函数copyTo()在使用上及效果上几乎是一样的,事实上,这两个函数在使用和效果上几乎也是没有差别的,并且它们都不与原矩阵共用内存空间。
    但是它们俩还是有细微的差别,它们俩的细微差别详见链接 https://www.hhai.cc/thread-76-1-1.html

    07-成员函数Mat::convertTo():实现矩阵元素的数据类型的转换

    成员函数Mat::convertTo()用于实现矩阵元素的数据类型的转换

    示例代码请查看本文开头的说明。

    示例代码运行结果如下:
    请添加图片描述
    从运行结果可以看出,矩阵元素的数据类型被转换了。
    另外,还要提示一下,使用convertTo()还能实现原矩阵通过经典线性变换到一个新的矩阵哦。

    08-成员函数Mat::zeros():初始化一个所有元素值都为零的矩阵

    可利用Mat类的成员函数Mat::zeros()实现初始化一个所有元素值都为零的矩阵,详细介绍请参看链接 https://www.hhai.cc/thread-71-1-1.html

    09-成员函数Mat::ones():初始化一个所有元素值都为1的矩阵

    可利用Mat类的成员函数Mat::ones()实现初始化一个所有元素值都为1的矩阵,成员函数Mat::ones()的使用与上一个Mat::zeros()的使用完全相同,这里就不再详细介绍了。

    10-成员函数Mat::size():获取矩阵的size(列数、行数)

    可利用Mat类的成员函数Mat::size()获取矩阵的size(列数、行数),详细介绍请参看链接 https://www.hhai.cc/thread-78-1-1.html

    11-成员函数Mat:type():)获取矩阵的type

    可利用Mat类的成员函数Mat:type()获取矩阵的type,详细介绍请参看链接 https://www.hhai.cc/thread-78-1-1.html

    12-成员函数Mat:channels():获取矩阵的通道数

    可利用Mat类的成员函数Mat:channels()获取矩阵的通道数,详细介绍请参看链接 https://www.hhai.cc/thread-78-1-1.html

    13-成员函数Mat:at():访问某个矩阵元素的值

    可利用Mat类的成员函数Mat:at()访问某个矩阵元素的值。
    格式为M.at(i,j)
    示例:
    image.at(i,j):取出灰度图像image中第i行第j列点的像素值;
    image.at(i,j)[k]:取出彩色图像image第k通道中第i行第j列点的像素值。
    如何想了解“Vec3b”为何物,可以参考链接 https://www.hhai.cc/thread-80-1-1.html
    注意:函数at()的第一个参数代表行索引,第二个参数代表列索引。

    示例代码请查看本文开头的说明。
    示例代码运行结果如下:
    在这里插入图片描述

    14-成员函数Mat::depth():获取矩阵元素的数据类型

    可利用Mat类的成员函数Mat::depth()获取矩阵元素的数据类型,详细介绍请参看链接 https://www.hhai.cc/thread-78-1-1.html

    15-成员函数Mat::operator()(const Rect& roi) const:选择ROI区域(感兴趣矩形区域),并实现深拷贝和浅拷贝

    可利用Mat类的成员函数Mat::operator()(const Rect& roi) const选择ROI区域(感兴趣矩形区域)。
    operator()表示Mat类对运算符()的重载,关于运算符重载,可以参见博文 https://www.hhai.cc/thread-81-1-1.html
    关于const的含义,可以参见博文 https://www.hhai.cc/thread-82-1-1.html

    15-1 深拷贝ROI区域

    深拷贝ROI区域示例代码:

    //利用Rect选择区域(100, 180, 150, 50)
    int xRoi = 80;
    int yRoi = 180;
    int widthRoi = 150;
    int heightRoi = 100;
    srcImage(cv::Rect(xRoi,yRoi,widthRoi,heightRoi)).copyTo(roiImage);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    上面的代码实现了把srcImage中的区域(100, 180, 150, 50)深拷贝到给了roiImage。
    ROI区域:cv::Rect(xRoi,yRoi,widthRoi,heightRoi)代表下面这个矩形:
    矩形区域左上角顶点的坐标为(100, 180)
    矩形区域在x方向上的长度为150;
    矩形区域在y方向上长度为180;

    15-2 浅拷贝ROI区域

    浅拷贝ROI区域的示例代码请查看本文开头的说明。
    示例代码运行结果如下:
    在这里插入图片描述
    从上面的运行结果来看,对浅拷贝对象A1_roi的修改也会影响到A1中相应元素的值。

    15-3 将一个矩阵(图像)复制到另一矩阵(图像)的指定区域(ROI)【深拷贝】

    这里给一个示例代码,代码将B1的数据复制到了A1中的指定区域。
    具体的代码请请查看本文开头的说明。
    示例代码运行结果如下:
    在这里插入图片描述

    16-成员函数Mat:empty():判断Mat对象的数据是否为空

    对于成员函数Mat:empty(),如果Mat对象没有数据元素,则返回ture。
    我们通常利用它检测图像的读取是否成功。
    在图像读取完成后,我们可以利用下面的语句判断是否读取成功:

    	if (src_image.empty())
    	{
    		std::cout << "Error: Could not load image" << std::endl;
    		return 0;
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • 相关阅读:
    NFT Marketplace 比较 | 快速指南
    给矩阵添加地理信息
    C++ 序容器
    数据仓库性能测试方法论与工具集
    安卓毕业设计选题基于Uniapp+SSM实现的智能课堂管理APP在线学习网
    UDP接收报文函数recvfrom和UDP发送报文函数sendto
    Nacos 注册中心入门及使用
    美创科技入选“浙江省网络安全规模十强企业”
    Vue项目实战之人力资源平台系统(三)主页模块
    Flink 1.13 源码解析——Flink 作业提交流程
  • 原文地址:https://blog.csdn.net/wenhao_ir/article/details/127400089
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号