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個標籤的信息

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章