文章目录

  • Mat的构造函数
  • blobFromImage函数
  • dnn::Net 的 forward()


Mat的构造函数

Mat::Mat()//无参数构造方法;
Mat::Mat(int rows, int cols, int type)//创建行数为 rows,列数为 col,类型为 type 的图像;
Mat::Mat(Size size, int type)//创建大小为 size,类型为 type 的图像;Mat::Mat(int rows, int cols, int type, const Scalar& s)//创建行数为 rows,列数为 col,类型为 type 的图像,并将所有元素初始化为值 s;Mat::Mat(Size size, int type, const Scalar& s)//创建大小为 size,类型为 type 的图像,并将所有元素初始化为值 s;Mat::Mat(const Mat& m)//将m赋值给新创建的对象,此处不会对图像数据进行复制,m和新对象共用图像数据,属于浅拷贝;Mat::Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP)//创建行数为rows,列数为col,类型为type的图像,此构造函数不创建图像数据所需内存,而是直接使用data所指内存,图像的行步长由 step指定。Mat::Mat(Size size, int type, void* data, size_t step=AUTO_STEP)//创建大小为size,类型为type的图像,此构造函数不创建图像数据所需内存,而是直接使用data所指内存,图像的行步长由step指定。Mat::Mat(const Mat& m, const Range& rowRange, const Range& colRange)//创建的新图像为m的一部分,具体的范围由rowRange和colRange指定,此构造函数也不进行图像数据的复制操作,新图像与m共用图像数据;Mat::Mat(const Mat& m, const Rect& roi)// 创建的新图像为m的一部分,具体的范围roi指定,此构造函数也不进行图像数据的复制操作,新图像与m共用图像数据。

这些构造函数中,很多都涉及到类型type
type:CV_8UC1,CV_16SC1,…,CV_64FC4 等。

8U 表示 8 位无符号整数,
16S 表示 16 位有符号整数,64F表示 64 位浮点数(即 double 类型);
C 后面的数表示通道数,例如 C1 表示一个通道的图像,C4 表示 4 个通道的图像,以此类推。

如果你需要更多的通道数,需要用宏 CV_8UC(n),例如:
Mat M(3,2, CV_8UC(5));//创建行数为 3,列数为 2,通道数为 5 的图像。

blobFromImage函数

blobFromImage主要是用来对图片进行预处理。包含两个主要过程:

整体像素值减去平均值(mean)
通过缩放系数(scalefactor)对图片像素值进行缩放

Mat cv::dnn::blobFromImage(InputArray image, double scalefactor=1.0, //像素值进行一定的尺度缩放const Size& size = Size(),//神经网络在训练的时候要求输入的图片尺寸const Scalar& mean = Scalar(), bool swapRB = false, //openCV默认 BGR,传入的图片一般是RGBbool crop = false,// crop:输入图像大小与size不符的时候,是否需要裁剪int ddepth = CV_32F// ddepth:图像的数据类型,目前仅支持32F和8U)// image:这个就是我们将要输入神经网络进行处理或者分类的图片。/*
mean:需要将图片整体减去的平均值,
// 如果我们需要对RGB图片的三个通道分别减去不同的值,那么可以使用3组平均值,
// 如果只使用一组,那么就默认对三个通道减去一样的值。
// 减去平均值(mean):
// 为了消除同一场景下不同光照的图片,对我们最终的分类或者神经网络的影响,
//  我们常常对图片的R、G、B通道的像素求一个平均值,然后将每个像素值减去我们的平均值,
//  这样就可以得到像素之间的相对值,就可以排除光照的影响。
*///scalefactor:当我们将图片减去平均值之后,还可以对剩下的像素值进行一定的尺度缩放,它的默认值是1,如果希望减去平均像素之后的值,全部缩小一半,那么可以将scalefactor设为1/2。//size:这个参数是我们神经网络在训练的时候要求输入的图片尺寸。//swapRB:OpenCV中认为我们的图片通道顺序是BGR,但是我平均值假设的顺序是RGB,所以如果需要交换R和G,那么就要使swapRB=true
void cv::dnn::Net::setInput  (   InputArray  blob,// blob,就是上文中介绍的blobFromImage的返回值const String &     name = "",// 这个name指的是inputlayer的名字。double   scalefactor = 1.0,const Scalar &   mean = Scalar() )  // scalefactor 和 mean 与blobFromImage中相同

dnn::Net 的 forward()

从网络开始层进行计算,前向传播到输出层
Mat cv::dnn::Net::forward(const String& outputName = String())// 这个函数只需要提供layer的name即可;// 函数返回一个Mat变量,返回值是指输入的layername  首次出现  的输出。//     // 默认输出整个网络的运行结果layer { // layer层的例子    (googleNet输出层)name: "prob"    //层名称type: "Softmax"  //bottom: "loss3/classifier"top: "prob"}void cv::dnn::Net::forward(OutputArrayOfArrays outputBlobs,const String & outputName = String())   // 该函数的返回值是void,通过OutputArrayOfArrays类型提供计算结果,类型为blob// 这个outputName依然是layer的name,// outputBlobs不是  首次   layer的输出了,而是layername指定的layer的全部输出void cv::dnn::Net::forward(OutputArrayOfArrays outputBlobs,const std::vector<String> & outBlobNames)// 该函数返回值为void,// outBlobNames是需要提供输出的layer的name,类型为vector,也就是说可以提供多个layer的那么;// 它会将每个layer的   首次计算输出    放入outputBlobs。void cv::dnn::Net::forward(std::vector<std::vector<Mat>> & outputBlobs, const std::vector<String> & outBlobNames )    // 返回值为void;// 输入outBlobNames是vector类型,// outputBlobs是vector<std::vector<Mat>>类型;// 该函数可以输入多个layer的name;// 它会输出每个layer的全部输出到outputBlobs中。

第二个开始依次是:标签、置信度、目标位置的4个坐标信息[xmin ymin xmax ymax]
倒数第二维是识别的标签的数量,图中选择显示第4个标签的信息

OpenCV的DNN模块相关推荐

  1. 用opencv的dnn模块做yolov5目标检测

    最近在微信公众号里看到多篇讲解yolov5在openvino部署做目标检测文章,但是没看到过用opencv的dnn模块做yolov5目标检测的.于是,我就想着编写一套用opencv的dnn模块做yol ...

  2. OpenCV之DNN模块,实现深度学习网络的推理加速

    OpenCV是计算机视觉领域使用最为广泛的开源库,以功能全面使用方便著称.自3.3版本开始,OpenCV加入了对深度神经网络(DNN)推理运算的支持.在LiveVideoStack线上交流分享中英特尔 ...

  3. AI入门之神经网络(9)基于c++、opencv的dnn模块的视频手势识别

    基于c++.opencv的dnn模块的手势识别 先看效果: 老规矩话不多,实现的方法步骤,细节全在我的代码注释里面,只你跟着注释写,相信你也写得出来的! #include <opencv2/dn ...

  4. OpenCV的dnn模块调用TesorFlow训练的MoblieNet模型

    七月 上海| 高性能计算之GPU CUDA培训 7月27-29日三天密集式学习  快速带你入门阅读全文> 正文共2073个字,2张图,预计阅读时间10分钟. 一.初得模型 那是一个月之前的事情了 ...

  5. python、C++ 中通过OpenCV的DNN模块使用YoloV4

    目录 1 Python环境下调用 2 C++环境下调用(编写CMakeLists.txt文件) 2.1 OpenCV安装 2.2 程序编写 2.2.1 main.cpp 2.2.2 Detection ...

  6. 深度学习与OpenCV DNN模块:权威指南

    计算机视觉领域自20世纪60年代末就已经存在.图像分类和目标检测是计算机视觉领域的一些最古老的问题,研究人员已经努力解决了几十年.使用神经网络和深度学习,我们已经达到了一个阶段,计算机可以开始真正地理 ...

  7. tensorflow contrib模块_OpenCV DNN 模块-风格迁移

    本文主要介绍OpenCV的DNN模块的使用.OpenCV的DNN模块自从contrib仓库开始,就是只支持推理,不支持训练.但是仅仅只是推理方面,也够强大了.现在OpenCV已经支持TensorFlo ...

  8. OpenCV-图像着色(采用DNN模块导入深度学习模型)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 实现原理 图像着色最早是应用在图像修复方面,将一些过去的黑白旧照根据预设色盘上色,得到色彩饱满的 ...

  9. Opencv、dnn部署自己的Yolov5模型记录

    Opencv.dnn部署自己的Yolov5模型记录 一.环境配置 1.opencv == 4.5.1+dnn模块 2.pytorch == 1.8 3.ubuntu18.04 二.代码来源 1.htt ...

最新文章

  1. Python十大装腔语法
  2. a连接带id转送不了数据_你找到了数据清洗利器?
  3. mysql 密码 You must reset your password using ALTER USER statement before executing this statement....
  4. 透明物体分割学习笔记
  5. Kafka消费者Consumer常用配置
  6. The Simple Life
  7. PHP 模拟POST请求
  8. “数据门”事件频发 如何避免人为因素导致数据泄露?
  9. JavaScript之常用方法讲解
  10. thinkphp的快捷方法实例化对象
  11. 《Spring实战》第一章 — Spring之旅
  12. 图片保存到数据库和从数据库读取图片并显示(C#)
  13. 怎样提高自己的Java编程能力?
  14. Oracle分区查询
  15. 幻想三国android官方版,幻想三国ol官方版
  16. Python对电影数据简单分析
  17. npm安装报错(npm ERR code EPERM npm ERR syscall mkdir npm ERR path CProgram Filesnodejsnode_ca...)
  18. 球迷必备:2012欧洲杯手机观战指南
  19. 白盒测试与黑盒测试的联系与区别
  20. 抖音运营变现必知的几个常识;新手不看后悔一辈子丨国仁网络资讯

热门文章

  1. selenium得到一个动态页面
  2. 干扰网络信号的app_解决家中WIFI信号无法全面覆盖的方法
  3. c52单片机控制l298n步进电机角度_【设计图文】单片机实现的步进电机控制系统(开题报告+论文+文献综述+外文翻译+DWG图纸)...
  4. Java爬虫系列二:使用HttpClient抓取页面HTML
  5. 动态删除列表中的元素
  6. Vue 犯罪指南:TypeError: Right-hand side of 'instanceof' is not an object
  7. 解决方案:IndentationError: unindent does not match any outer indentation level
  8. 基于zookeeper实现配置集中管理【转】
  9. 类型的权限已失败 SqlClientPermission
  10. for循环如果先--_如果再写for循环,我就锤自己!