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;
}
相关推荐
zmzb01032 小时前
Python课后习题训练记录Day194
python·opencv·计算机视觉
欧特克_Glodon10 小时前
OpenCV计算机视觉开发入门与实践<十四>:基础几何图形绘制
人工智能·opencv·计算机视觉
欧特克_Glodon11 小时前
OpenCV计算机视觉开发入门与实践<十六>:图像边框和图像轮廓
c++·人工智能·opencv·计算机视觉
W_326001 天前
Python-OpenCV 轮廓进阶:旋转最小外接矩形、图像矩求质心、嵌套层级 hierarchy、轮廓形状匹配
图像处理·python·opencv·机器学习·计算机视觉
牧羊人.3331 天前
计算机视觉基础 第 9 章|实战:银行卡号识别
图像处理·人工智能·opencv·计算机视觉·图搜索算法
欧特克_Glodon1 天前
OpenCV计算机视觉开发入门与实践<十三>:图像转换之灰度图、二值图
c++·人工智能·opencv·计算机视觉
AndrewHZ1 天前
图像处理入门010 | Pillow 与 OpenCV 对比:双库图像读写实战
图像处理·opencv·计算机视觉·pillow
欧特克_Glodon1 天前
OpenCV计算机视觉开发入门与实践<十二>:XML 和 YAML 文件读写
xml·c++·opencv·计算机视觉
W_326002 天前
Python-OpenCV边缘检测与阈值分割:Sobel、Scharr、Laplacian、Canny、全局与自适应阈值
开发语言·图像处理·python·opencv·机器学习
闻道且行之2 天前
图片处理助手|C++ 手搓离线 AI 抠图工具,U2Net 原理到落地一次讲透
开发语言·c++·人工智能·神经网络·opencv·计算机视觉