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;
}
相关推荐
xailorliu12 小时前
SLIC_超像素算法
c++·opencv·目标检测·机器学习·计算机视觉
企业数字化笔记21 小时前
视觉智能体怎么选技术?目标检测、跟踪、分割、OpenCV和FFmpeg的职责划分
opencv·目标检测·ffmpeg
xailorliu2 天前
矩阵定性-正定负定不定半正定半负定
c++·opencv·线性代数·计算机视觉·矩阵
泡干脆面就番茄3 天前
MediaPipe人体感知全指南
opencv
欧特克_Glodon4 天前
OpenCV计算机视觉开发入门与实践(基于C++):专栏内容介绍及目录
c++·人工智能·opencv·计算机视觉
sali-tec4 天前
C# 基于OpenCv的视觉工作流-章110-YOLO 实例分割
图像处理·人工智能·opencv·算法·yolo·计算机视觉
爱写代码的小朋友4 天前
Windows 下 MSYS2 + MinGW64 安装与使用 OpenCV 全指南(含踩坑记录)
c++·人工智能·windows·opencv
初学大模型5 天前
先剔后识:OpenCV三维预处理与YOLO语义检测协同的机器人视觉系统可行性分析
人工智能·opencv·yolo·计算机视觉·机器人
AI的探索之旅11 天前
97 个 OpenCV 实例(三十):双目立体,从标定到点云
人工智能·opencv·计算机视觉
词却11 天前
OpenCV学习:CNN 人脸检测
opencv