- 操作系统: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 结构体内的成员变量来自定义斑点检测的过程。
代码示例
cpp
#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;
}