SimpleBlobDetector的使用

一、概述

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;
}
相关推荐
泡干脆面就番茄4 小时前
03_LBPH人脸识别算法原理与实战
python·opencv
大熊背9 小时前
一种用于随机值脉冲噪声的检测统计量
图像处理·opencv·计算机视觉
欧特克_Glodon10 小时前
OpenCV计算机视觉开发入门与实践<三十八>:图像添加数字水印
c++·人工智能·opencv·计算机视觉
欧特克_Glodon10 小时前
OpenCV计算机视觉开发入门与实践<四十>:自动识别物体数量
c++·人工智能·opencv·计算机视觉
泡干脆面就番茄11 小时前
02_摄像头实时人脸检测与微笑识别
python·opencv
不爱学英文的码字机器12 小时前
让 Live2D 角色真正开始对话:Open-LLM-VTuber 从本地部署到远程访问
服务器·opencv·微信·电脑
欧特克_Glodon1 天前
OpenCV计算机视觉开发入门与实践<三十七>:OpenCV中的机器学习
c++·opencv·机器学习·计算机视觉
欧特克_Glodon1 天前
OpenCV计算机视觉开发入门与实践<三十六>:机器学习概述
c++·opencv·机器学习·计算机视觉
词却1 天前
OpenCV学习:人脸识别
人工智能·opencv·学习
凌晨1681 天前
OpenCV(十一)人脸识别三大算法LBPH、EigenFace、FisherFace
人工智能·opencv·算法