热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【个人笔记】OpenCV4C++快速入门03课

个人资料,仅供学习使用修改时间——2022年1月20日02:48:02学习课程:OpenCV4C快速入门视频30讲视频老师:贾志刚03图像

个人资料,仅供学习使用
修改时间——2022年1月20日 02:48:02
学习课程:OpenCV4 C++ 快速入门视频30讲
视频老师:贾志刚



03 图像对象的创建与赋值

opencv知识点:


  • mat - 简述
  • 3种复制 - 克隆/拷贝 + 赋值
  • 创建空白图像 - Mat::zeros + Mat::ones + “=” + Scalar

本课解决的问题:


  • Mat是什么?
  • 克隆/拷贝与赋值的区别?
  • 如何创建空白图像?
  • 如何对矩阵赋值?

1.Mat简述


什么是Mat呢,就是matrix(矩阵)的缩写
我们看到的图像,就是以数字矩阵的形式存储在计算机中
在opencv中,我们用Mat类存储图像。


在opencv中,Mat类分为两个部分


  • 矩阵头
  • 矩阵数据

在这里插入图片描述

矩阵头


图像有很多属性。
如:大小,宽高,数据类型,通道数
这些属性,就在矩阵头中


矩阵数据


数据部分,就是所有像素的值的一个集合


这里说一下赋值,与克隆/拷贝的区别


赋值
相当于浅复制,只复制了矩阵头,指向的是同一个数据块。



克隆/拷贝
相当于深复制,还会复制相应的数据块



2.Mat对象

3种常见的复制

//1.克隆
Mat m1 = src.clone();//2.拷贝
src.copyTo(m2);//3.赋值
Mat m3 = src;

创建空白图像

Mat m4 = Mat::zeros(src.size(),src.type())
/*
矩阵填充0行列为src行列数据类型为src的数据类型
*/

Mat m5 = Mat::zeros(Size(512,512),CV_8UC3);
/*
矩阵填充0行列为512*512数据类型为CV_8UC3(8UC指8位无符号字符,3指3个通道)
*/

Mat m6 = Mat::ones(Size(512,512),CV_8UC3);
/*
矩阵填充1其余与上相同
*/

C11创建图像的新方式

Mat kernel = (Mat_<char>(3,3)<<0,-1,0,-1,5,-1,0,-1,0);

3.本课的代码

//函数定义
void mat_creation_demo(Mat& image);//函数实现
void QuickDemo::mat_creation_demo(Mat& image) {Mat m1, m2;//克隆,拷贝m1 = image.clone();image.copyTo(m2);//创建空白图像Mat m3 = Mat::zeros(Size(8, 8), CV_8UC3);std::cout<<"cols:" << m3.cols <<"rows:" << m3.rows<<"channels:" << m3.channels()<<std::endl;std::cout << m3 << std::endl;
}

4.矩阵赋值


Mat::zeros

Mat m3 = Mat::zeros(Size(8, 8), CV_8UC1);Mat m3 = Mat::zeros(Size(8, 8), CV_8UC3);

当为CV_8UC1时,此时1个通道,8行8列
在这里插入图片描述
当为CV_8UC3时,此时1个通道,8行8*3列
在这里插入图片描述


所以矩阵数据的宽度,为图像的列 * 通道数


那么如何获取图像的行数,列数,通道数呢?

m3.cols;
m3.rows;
m3.channels();

在这里插入图片描述


Mat::ones

当填充为1的时候,要特别小心

Mat m3 = Mat::ones(Size(8, 8), CV_8UC1);Mat m3 = Mat::ones(Size(8, 8), CV_8UC3);

1通道没问题
在这里插入图片描述
3通道,只在每3个的第一个为1
在这里插入图片描述


“=” + Scalar

m3=127;

当给m3赋值1个值时,每3个的第一个为127
在这里插入图片描述
那怎么全变成127呢?那就用到了Scalar

m3=Scalar(127,127,127);

在这里插入图片描述
那我们来显示一下,全127,对应的图像

imshow("创建图像",m3);

在这里插入图片描述


本课所用API查阅

1.Mat::zeros
常用的有两种


第一种,3个参数( 行,列,数据类型)


在这里插入图片描述


第二种,2个参数(size,数据类型)


在这里插入图片描述
2.Mat::ones
常用的有两种


第一种,3个参数( 行,列,数据类型)


在这里插入图片描述


第二种,2个参数(size,数据类型)


在这里插入图片描述
3.Scalar
在这里插入图片描述


推荐阅读
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • CentOS7.8下编译muduo库找不到Boost库报错的解决方法
    本文介绍了在CentOS7.8下编译muduo库时出现找不到Boost库报错的问题,并提供了解决方法。文章详细介绍了从Github上下载muduo和muduo-tutorial源代码的步骤,并指导如何编译muduo库。最后,作者提供了陈硕老师的Github链接和muduo库的简介。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文总结了在开发中使用gulp时的一些技巧,包括如何使用gulp.dest自动创建目录、如何使用gulp.src复制具名路径的文件以及保留文件夹路径的方法等。同时介绍了使用base选项和通配符来保留文件夹路径的技巧,并提到了解决带文件夹的复制问题的方法,即使用gulp-flatten插件。 ... [详细]
  • 本文详细说明了在JavaScript中解决alert弹出窗口文本换行问题的方法。通过给alert弹出的文本添加换行符,可以实现在弹窗中显示多行文本的效果。同时,提供了相关代码示例和注意事项,帮助读者更好地理解和应用这一解决方法。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 浅解XXE与Portswigger Web Sec
    XXE与PortswiggerWebSec​相关链接:​博客园​安全脉搏​FreeBuf​XML的全称为XML外部实体注入,在学习的过程中发现有回显的XXE并不多,而 ... [详细]
  • 这篇文章给大家介绍怎么从源码启动和编译IoTSharp ,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。IoTSharp项目是 ... [详细]
  • npminstall-Dbabelcorebabelpreset-envbabelplugin-transform-runtimebabelpolyfillbabel-loader ... [详细]
  • 使用gitolite搭建一个私有的git服务器,来管理git仓库。有了它,就可以跟小伙伴们愉快地进行远程协作啦。今天又折腾了一遍,在这里把几个关键的步骤记下来,方便以后查阅。准备工 ... [详细]
  • 1.码云上根据需求创建项目;2.进入项目——克隆下载 选择复制SSH3.clone码云上的项目到本地:在相关目录(如A)下运行终端,执行指令:gitclone复制的SSH地址;  ... [详细]
  • 使用npmi编译vue项目出现无法下载github.com中的对应的包源文件报错信息如下:npmERR!fatal:unabletoaccess'https:github ... [详细]
author-avatar
Min2502857657_377
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有