OpenCV的DNN模块



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,传入的图片一般是RGB
			  bool 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个标签的信息

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值