目標檢測的影象特徵提取之(四)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檢測結果
相關的程式碼如下:
// 初始化BLOB引數
SimpleBlobDetector::Paramsparams;
params.minDistBetweenBlobs =0.0f;
params.filterByInertia =false;
params.filterByConvexity =false;
params.filterByColor =false;
params.filterByCircularity =false;
params
// 宣告根據面積過濾,設定最大與最小面積
params.filterByArea =true;
params.minArea =20.0f;
params.maxArea =2000.0f;
// 宣告根據圓度過濾,設定最大與最小圓度
params.filterByCircularity =true;
params.minCircularity =0.5;
params.maxCircularity =1.0;
// 凸包形狀分析 - 過濾凹包
params.filterByConvexity =true;
params.minConvexity =0.5;
params.minConvexity =1.0;
// 引數初始化BLOB檢測器,
Ptr<SimpleBlobDetector> detector =SimpleBlobDetector::create(params);
vector<KeyPoint> keypoints;
// 檢測得到特徵與繪製特徵
detector->detect(src, keypoints,Mat());
Mat kp_image;
drawKeypoints(src, keypoints, kp_image,Scalar(255,0,0),DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
imshow("keypoints", kp_image);
示例二:原圖
引數不同過濾執行結果
藍色與紅色是檢測結果表示
相關程式碼如下
// 幾何形狀過濾
// 宣告根據面積過濾,設定最大與最小面積
params.filterByArea =true;
params.minArea =1000.0f;
params.maxArea =12000.0f;
// 宣告根據圓度過濾,設定最大與最小圓度
params.filterByCircularity =true;
params.minCircularity =0.7;
params.maxCircularity =0.8;
// 凸包形狀分析 - 過濾凹包
params.filterByConvexity =true;
params.minConvexity =0.0;
params.minConvexity =0.5;
// 引數初始化BLOB檢測器,
Ptr<SimpleBlobDetector> detector =SimpleBlobDetector::create(params);
vector<KeyPoint> keypoints;
// 檢測得到特徵與繪製特徵
detector->detect(src, keypoints,Mat());
Mat kp_image;
drawKeypoints(src, keypoints, kp_image,Scalar(0,0,255),DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
imshow("keypoints", kp_image);
總結:
影象的BLOB特徵提取與分析,除了使用SimpleBlobDetector類之外還可以通過findContours與幾何矩Moments計算相結合來實現。後者更加考察對OpenCV相關API函式熟悉程度與影象處理相關知識的掌握程度。
原文資料:http://mp.weixin.qq.com/s/QhKUgDbqwxuQWW6aCf_oxg