- 操作系統:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 編程語言:C++11
算法描述
cv::SimpleBlobDetector 是 OpenCV 中用于檢測二值圖像中連通區域(即“斑點”或“blob”)的類。這些連通區域可以是白色前景中的黑色斑點,也可以是黑色背景中的白色斑點。SimpleBlobDetector 可以識別不同形狀、大小和亮度的斑點,并且可以設置參數來過濾掉不符合特定條件的斑點。
從 OpenCV 3.0 開始,SimpleBlobDetector 的創建方式有所變化。它現在是一個工廠方法 create 返回的一個指針對象,而不是直接實例化類的對象。這允許通過修改參數來配置檢測器的行為,而無需改變代碼邏輯。
下面是一些重要的成員函數和屬性:
- 構造函數:
在 OpenCV 3.x 和更新版本中,推薦使用 cv::SimpleBlobDetector::create() 方法來創建 SimpleBlobDetector 對象,該方法返回一個指向 Ptrcv::SimpleBlobDetector 類型的智能指針。 - 成員函數:
- void detect(const cv::Mat& image, std::vectorcv::KeyPoint& keypoints) 檢測輸入圖像中的斑點,并將結果存儲在 keypoints 向量中。每個 cv::KeyPoint 表示一個斑點的位置、大小和其他信息。
- void setParams(const SimpleBlobDetector::Params& params) 設置斑點檢測器的參數。這通常是在創建檢測器之后立即調用,以配置其行為。
- Params getParams() const 獲取當前設置的參數。
- 成員類型:
- struct Params 包含了可以調整的各種參數,例如斑點的最小面積、最大面積、圓度范圍、凸性等。你可以通過修改 Params 結構體內的成員變量來自定義斑點檢測的過程。
代碼示例
#include <opencv2/features2d.hpp>
#include <opencv2/opencv.hpp>using namespace cv;int main()
{// 加載圖像并轉換為灰度圖Mat image = imread( "/media/dingxin/data/study/OpenCV/sources/images/smarties.png", IMREAD_GRAYSCALE );if ( image.empty() ){std::cout << "Could not open or find the image" << std::endl;return -1;}// 配置斑點檢測器參數SimpleBlobDetector::Params params;// 改變默認參數params.filterByArea = true;params.minArea = 100;params.filterByCircularity = true;params.minCircularity = 0.1;params.filterByConvexity = true;params.minConvexity = 0.87;params.filterByInertia = true;params.minInertiaRatio = 0.01;// 創建斑點檢測器Ptr< SimpleBlobDetector > detector = SimpleBlobDetector::create( params );// 檢測斑點std::vector< KeyPoint > keypoints;detector->detect( image, keypoints );// 繪制斑點并顯示Mat outputImage;drawKeypoints( image, keypoints, outputImage, Scalar::all( -1 ), DrawMatchesFlags::DEFAULT );imshow( "Detected Blobs", outputImage );waitKey( 0 );return 0;
}