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;
}
相关推荐
映翰通网络16 小时前
TI开发板上的边缘AI工具链:先认清OpenCV、GStreamer和TIDL
人工智能·嵌入式硬件·opencv·计算机视觉·ti
m沐沐1 天前
【深度学习】模型部署全解析——从原理到Flask服务端实战
人工智能·后端·python·深度学习·opencv·flask
阿_旭2 天前
【分割实战】三种图像分割方法实战对比:Mask R-CNN + GrabCut + OpenCV【附源码】
opencv·图像分割
小保CPP2 天前
OpenCV C++车型识别1-图像预处理
c++·人工智能·opencv·计算机视觉
小保CPP2 天前
OpenCV C++车型识别2-形状匹配
c++·人工智能·opencv·计算机视觉
m沐沐2 天前
【自然语言处理】NLP分词与Word2Vec词向量——从原理到实战
人工智能·深度学习·opencv·机器学习·计算机视觉·自然语言处理·word2vec
zmzb01032 天前
Python课后习题训练记录Day172
开发语言·python·opencv
小宋加油啊3 天前
opencv工作中的基础知识点
人工智能·opencv·计算机视觉
m0_617493943 天前
Python OpenCV 分水岭算法(Watershed)详解与实战
python·opencv·算法