C++ & OpenCV 零散學習總結

OpenCV中Mat基本用法:編程

  Mat類 (Matrix的縮寫) 是OpenCV用於處理圖像而引入的一個封裝類。從功能上講,Mat類在IplImage結構的基礎上進一步加強,而且,因爲引入C++高級編程特性,Mat類的擴展性大大提升。數組

  Mat image(240, 320, CV8UC3);第一個參數是rows,該矩陣的行數;第二個參數是cols,該矩陣的列數;第三個參數是該矩陣元素的類型。這句話表示建立一個大小爲240×320的矩陣,裏面的元素爲8位unsigned型,通道數(channel)有3個。函數

  Mat::zeros(3, 3, CV32F) + 5;定義個3×3的32bit浮點數矩陣,元素全爲0,再將全部元素加上5.0。優化

C++中vector的at函數:spa

  假設v是一個vector對象,一般v.at(n)和v[n]是同樣的,前者會檢查是否越界(所以花費的時間稍多),然後者不會(後者越界會致使未定義行爲)。指針

C++優化之使用emplace對象

  在C++開發過程當中,咱們常常會用STL的各類容器,好比vector,map,set等,這些容器極大的方便了咱們的開發。在使用這些容器的過程當中,咱們會大量用到的操做就是插入操做,好比vector的push_back,map的insert,set的insert。這些插入操做會涉及到兩次構造,首先是對象的初始化構造,接着在插入的時候會複製一次,會觸發拷貝構造。可是不少時候咱們並不須要兩次構造帶來效率的浪費,若是能夠在插入的時候直接構造,就只須要構造一次就夠了。教程

  C++11標準已經有這樣的語法能夠直接使用了,那就是emplace。vector有兩個函數可使用:emplace,emplace_back。emplace相似insert,emplace_back相似push_back。內存

OpenCV的連通域處理函數
  在圖像處理過程當中,常常會遇到這樣一部分圖像,圖像的總體部分若是人來看的話一眼就能看出,可是它的內部因爲有各類小缺口,致使斷開了,這樣在計算機「眼」裏就被認爲是斷開的,爲了使圖像達到適應人眼的感受,須要將這些缺口和斷開的口給鏈接上去,這就須要用到計算機圖形學中的連通域處理技術。給出一個簡單的連通域處理函數,這個函數是來自OpenCV著名教程Learning OpenCV中。開發

  這個連通域處理函數的形式:

  void ConnectedComponents(Mat &mask_process,  int poly1_hull0,  float perimScale,  int number = 0,  Rect &bounding_box = Rect(),  Point &contour_centers = Point(-1, -1));

  參數mask表示的是須要進行連通域處理二值圖像。

  參數poly1_hull0表示輪廓邊緣是否採用多邊形擬合,若是該參數爲1,則表示採用多邊形擬合,不然採用凸包擬合。

  參數perimScale是用來將那些小的輪廓去掉,那些小的輪廓時指它的周長小於(mask長+寬)/perimScale。固然你在其內部代碼也能夠該爲面積來判斷。

  參數num表示實際須要處理最多的輪廓的個數(若是輸入的mask有多個輪廓的話),這裏的處理是指計算出這些輪廓的外接矩形和中心點。默認值爲0,表示函數內部不須要處理這些外接矩形和中心點。

  參數bbs表示的是處理完後對應輪廓的外接矩形,默認值爲Rect(),表示不須要返回這些外接矩形。

  參數centers表示處理完後對應輪廓的中心點座標,默認值爲Point(-1, -1),表示不須要返回這些中心點。

C++ memset()函數: 

  memset 函數是內存賦值函數,用來給某一塊內存空間進行賦值的;

  包含在<string.h>頭文件中,能夠用它對一片內存空間逐字節進行初始化;

  原型爲 :

  void *memset(void *s, int v, size_t n);  

  這裏s能夠是數組名,也能夠是指向某一內在空間的指針;

  v爲要填充的值;

  n爲要填充的字節數;

相關文章
相關標籤/搜索