一、概述
Blob是指图像中的一块连通区域,Blob(灰度块)检测就是对前景/背景分离后的二值图像,进行连通域提取和标记。通过特征提取实现对灰度图像中特定对象组件的检测与分离。
SimpleBlobDetector的使用,Blob(斑点)筛选条件:斑点颜色、面积、圆度、惯性率、凸度。
二、findCirclesGrid函数检测无报错
项目时发现OpenCV的findCirclesGrid函数对圆形标定板的检测效果并不稳定,有时完全检测不到圆心。或者在使用的时候,获取的图像比较模糊,检测时候运行程序不报错,运行时间长,会卡住(特征点圆心数量不对或者为空时候,findCirclesGrid源程序不报错,查资料说更新opencv4.x版本可解决,待验证)。那么可以利用用SimpleBlobDetector搞定圆形标定板圆心提取,通过SimpleBlobDetector检测的数量进行判断。
三、示例
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
using namespace cv;
// 主函数示例
int main()
{
// 1.读取图像
Mat imgc = imread("circle.jpg"); // siemens_star72.jpg correct0602.jpg
// 通过 SimpleBlobDetector::Params 结构体配置检测阈值、面积过滤、圆度、凸度等条件,精准筛选目标斑点
// 2.初始化参数设置
SimpleBlobDetector::Params params;
params.minThreshold = 10; // 最小阈值 //二值化的阈值步长
params.maxThreshold = 240; // 最大阈值
params.filterByArea = true; // 启用面积过滤
params.minArea = 20; // 最小面积
params.maxArea = 80000; // 最大面积
params.filterByCircularity = true;// 启用圆度过滤
params.minCircularity = 0.1; // 最小圆度
params.filterByConvexity = true; // 启用凸性过滤
params.minConvexity = 0.5; // 最小凸性
params.filterByInertia = true; // 启用惯性比过滤
params.minInertiaRatio = 0.5; // 最小惯性比
// 3.检测斑点
// 使用SimpleBlobDetector :: create方法创建智能指针调用该算法
// 创建斑点检测器(Blob Detector)
Ptr<SimpleBlobDetector> detector = SimpleBlobDetector::create(params);
vector<KeyPoint> key_points;
detector->detect(imgc, key_points);
// 4.打印检测斑点的数量
cout <<" key_points.size()=" << key_points.size() << endl;
// 5.绘制检测斑点
Mat output_img;
drawKeypoints(imgc, key_points, output_img, Scalar(0, 0, 255), DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
namedWindow("SimpleBlobDetector", WINDOW_NORMAL);
imshow("SimpleBlobDetector", output_img);
cv::waitKey(0);
return 0;
}