1. 程式人生 > >目標檢測的影象特徵提取之(四)OpenCV中BLOB特徵提取與幾何形狀分類

目標檢測的影象特徵提取之(四)OpenCV中BLOB特徵提取與幾何形狀分類

OpenCV中BLOB特徵提取與幾何形狀分類

一:方法

二值影象幾何形狀提取與分離,是機器視覺中重點之一,在CT影象分析與機器人視覺感知等領域應用廣泛,OpenCV中提供了一個對二值影象幾何特徵描述與分析最有效的工具 - SimpleBlobDetector類,使用它可以實現對二值影象幾何形狀的分離與分析。而它之所以強大是因為整合OpenCV中其它一些API的功能,主要是有三個:

  • 自動的影象灰度與二值化,根據輸入的步長與閾值,得到半徑

  • 實現了輪廓查詢功能,可以查詢所有輪廓,

  • 然後在此基礎上基於幾何矩的計算實現各種基於幾何特徵的過濾

在學習Blob特徵檢測器相關函式之前,我們首先看一下Blob幾何特徵過濾時候用到幾何特徵

面積

BLOB特徵檢測器可以根據面積大小對結果進行過濾,只有面積在指定範圍內的幾何形狀才會被BLOB特徵檢出並標註。這樣就可以通過它實現基於幾何形狀面積的大小分類。需要說明的是這裡的面積是基於畫素單位的,主要是利於幾何矩進行計算得到。

圓度

圓度的公式可以表示為 


慣性率

慣性率是跟偏心率,圓形的偏心率等於0, 橢圓的偏心率介於0和1之間,直線的偏心率接近於0, 基於幾何矩計算慣性率比計算偏心率容易,所以OpenCV選擇了慣性率這個特徵值,根據慣性率可以計算出來偏心率,偏心率與慣性率之間關係表示如下


凸度

表示幾何形狀是凸包還是凹包的度量。說白了就是可以根據引數過濾凸多邊形還是凹多邊形, 輸入的引數一般在0~1之間,最小為0,最大為1。一般圓形多會大於0.5以上


二 演示

演示部分通過兩個例子來說明BLOB特徵不同用法,第一個例子通過BLOB特徵檢測向日葵的葵盤,第二例子通過BLOB特徵檢測來對幾何形狀進行過濾分類。

示例一 :原圖


BLOB檢測結果


相關的程式碼如下:

  1. // 初始化BLOB引數

  2. SimpleBlobDetector::Paramsparams;

  3. params.minDistBetweenBlobs =0.0f;

  4. params.filterByInertia =false;

  5. params.filterByConvexity =false;

  6. params.filterByColor =false;

  7. params.filterByCircularity =false;

  8. params

    .filterByArea =false;

  9. // 宣告根據面積過濾,設定最大與最小面積

  10. params.filterByArea =true;

  11. params.minArea =20.0f;

  12. params.maxArea =2000.0f;

  13. // 宣告根據圓度過濾,設定最大與最小圓度

  14. params.filterByCircularity =true;

  15. params.minCircularity =0.5;

  16. params.maxCircularity =1.0;

  17. // 凸包形狀分析 - 過濾凹包

  18. params.filterByConvexity =true;

  19. params.minConvexity =0.5;

  20. params.minConvexity =1.0;

  21. // 引數初始化BLOB檢測器,

  22. Ptr<SimpleBlobDetector> detector =SimpleBlobDetector::create(params);

  23. vector<KeyPoint> keypoints;

  24. // 檢測得到特徵與繪製特徵

  25. detector->detect(src, keypoints,Mat());

  26. Mat kp_image;

  27. drawKeypoints(src, keypoints, kp_image,Scalar(255,0,0),DrawMatchesFlags::DRAW_RICH_KEYPOINTS);

  28. imshow("keypoints", kp_image);

示例二:原圖


引數不同過濾執行結果




藍色與紅色是檢測結果表示

相關程式碼如下

  1. // 幾何形狀過濾

  2. // 宣告根據面積過濾,設定最大與最小面積

  3. params.filterByArea =true;

  4. params.minArea =1000.0f;

  5. params.maxArea =12000.0f;

  6. // 宣告根據圓度過濾,設定最大與最小圓度

  7. params.filterByCircularity =true;

  8. params.minCircularity =0.7;

  9. params.maxCircularity =0.8;

  10. // 凸包形狀分析 - 過濾凹包

  11. params.filterByConvexity =true;

  12. params.minConvexity =0.0;

  13. params.minConvexity =0.5;

  14. // 引數初始化BLOB檢測器,

  15. Ptr<SimpleBlobDetector> detector =SimpleBlobDetector::create(params);

  16. vector<KeyPoint> keypoints;

  17. // 檢測得到特徵與繪製特徵

  18. detector->detect(src, keypoints,Mat());

  19. Mat kp_image;

  20. drawKeypoints(src, keypoints, kp_image,Scalar(0,0,255),DrawMatchesFlags::DRAW_RICH_KEYPOINTS);

  21. imshow("keypoints", kp_image);

總結:

影象的BLOB特徵提取與分析,除了使用SimpleBlobDetector類之外還可以通過findContours與幾何矩Moments計算相結合來實現。後者更加考察對OpenCV相關API函式熟悉程度與影象處理相關知識的掌握程度。

原文資料:http://mp.weixin.qq.com/s/QhKUgDbqwxuQWW6aCf_oxg