Blob分析
BLOB是图像中灰度块的一种专业称呼,更加变通一点的可以说它跟我们前面二值图像分析的联通组件类似,通过特征提取实现常见的各种灰度BLOB对象组件检测与分离。使用该检测器的时候,可以根据需要输入不同参数,得到的结果跟输入的参数息息相关。
Blob分析函数与演示
OpenCV中的Blob分析函数为SimpleBlobDetector,OpenCV中支持实现常见的BLOB分析过滤,如下所示:
-根据BLOB面积过滤 -根据灰度/颜色值过滤 -根据圆度过滤 -根据长轴与短轴过滤 -根据凹凸进行过滤
对应的参数列表如下:
SimpleBlobDetector::Params() bool filterByArea bool filterByCircularity bool filterByColor bool filterByConvexity bool filterByInertia float maxArea float maxCircularity float maxConvexity float maxInertiaRatio float maxThreshold float minArea float minCircularity float minConvexity float minDistBetweenBlobs float minInertiaRatioOpenCV中Blob检测示例代码如下:
#include"opencv2/opencv.hpp" #include演示效果如下:usingnamespacecv; usingnamespacestd; intmain(intargc,char**argv) { //加载图像 Matsrc=imread("D:/lena.jpg"); Matgray; cvtColor(src,gray,COLOR_BGR2GRAY); cv::imshow("输入图像",src); //初始化参数设置 SimpleBlobDetector::Paramsparams; params.minThreshold=10; params.maxThreshold=240; params.filterByArea=true; params.minArea=50; params.filterByCircularity=true; params.minCircularity=0.1; params.filterByConvexity=true; params.minConvexity=0.5; params.filterByInertia=true; params.minInertiaRatio=0.5; //创建BLOBDetetor Ptr detector=SimpleBlobDetector::create(params); //BLOB分析与显示 Matresult; vector keypoints; detector->detect(gray,keypoints); for(autokpt:keypoints){ std::cout<< "key point radius: " << kpt.size << std::endl; cv::circle(src, kpt.pt, 2, cv::Scalar(0, 255, 0), 2, 8, 0); cv::circle(src, kpt.pt, kpt.size/2, cv::Scalar(255, 0, 255), 3, 8, 0); } imshow("Blob检测-OpenCV学堂", src); waitKey(0); }
特殊使用技巧
SimpleBlobDetector 函数有两个很诡异的地方。 第一个是实现的默认参数支持与参数检查 OpenCV中SimpleBlobDetector函数默认的参数值如下:
thresholdStep = 10; minThreshold = 50; maxThreshold = 220; minRepeatability = 2; minDistBetweenBlobs = 10; filterByColor = true; blobColor=0; filterByArea = true; minArea = 25; maxArea=5000; filterByCircularity = false; minCircularity = 0.8f; maxCircularity=std::numeric_limits每次执行之前都会进行断言检查,但是OpenCV中同时提供了是否启用Blob各种过滤开关选项,但是无论开关选项是否启用,这个断言检查都是检查全部属性值,这个就导致你设置选项为false的时候,必须填写对应选项的选项值,否则就无法执行Blob检测函数。对应的源码文件 blobdetector.cpp发现了这段代码作为佐证:::max(); filterByInertia = true; //minInertiaRatio = 0.6; minInertiaRatio = 0.1f; maxInertiaRatio=std::numeric_limits ::max(); filterByConvexity = true; //minConvexity = 0.8; minConvexity = 0.95f; maxConvexity = std::numeric_limits ::max(); collectContours = false;
staticvoidvalidateParameters(constSimpleBlobDetector::Params&p) { if(p.thresholdStep<= 0) CV_Error(Error::StsBadArg, "thresholdStep>0"); if(p.minThreshold>p.maxThreshold||p.minThreshold< 0) CV_Error(Error::StsBadArg, "0<=minThreshold<=maxThreshold"); if (p.minDistBetweenBlobs <=0 ) CV_Error(Error::StsBadArg, "minDistBetweenBlobs>0"); if(p.minArea>p.maxArea||p.minArea<=0) CV_Error(Error::StsBadArg, "0p.maxCircularity||p.minCircularity<= 0) CV_Error(Error::StsBadArg, "0 p.maxInertiaRatio||p.minInertiaRatio<= 0) CV_Error(Error::StsBadArg, "0 p.maxConvexity||p.minConvexity<= 0) CV_Error(Error::StsBadArg, "0 第二个是现实的默认输入图像的背景必须是白色 如果是黑色背景图像输入,Blob检测所有的参数就直接失效了,但是官方开发教程示例代码与函数文档都没有说明这点,导致很多新手小白不明所以就直接掉坑了,然后就放弃使用这个函数了。 审核编辑:黄飞
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
函数
+关注
关注
3文章
4350浏览量
63051 -
OpenCV
+关注
关注
31文章
635浏览量
41615 -
图像分析
+关注
关注
0文章
82浏览量
18728 -
BLOB
+关注
关注
0文章
13浏览量
10175
原文标题:OpenCV4图像分析之BLOB特征分析
文章出处:【微信号:CVSCHOOL,微信公众号:OpenCV学堂】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
Vivado HLS实现OpenCV图像处理的设计流程与分析
,或者在更大的图像中对需要的特征或区域进行处理是,OpenCV似乎足以满足很多应用的要求,但对于高分辨率高帧率实时处理的场景下,OpenCV很难满足高性能和低功耗的需求。基于视频流的架
发表于 07-08 08:30
CMake在Linux 6.1.1-1.0.0中搜索包opencv损坏了吗?
] 但是这个文件不存在。
并尝试使用图像 imx-image-full 的 SDK,我收到以下错误:
sysroots/armv8a-poky-linux/usr/lib/cmake/opencv4
发表于 05-09 11:32
基于OpenCV的图像特征智能识别系统设计
对于图像监控而言,多数监控只是简单的捕捉图像、处理图像,最后再通过人工进行识别,缺少智能监控,特别是针对某一特定需求的特征识别。本文设计一种基于Op
发表于 12-31 09:20
•20次下载
基于OpenCV如何提取中心线
问题 前几天有个人问了我一个问题,问题是这样的,他有如下的一张二值图像: 怎么得到白色Blob中心线,他希望的效果如下: 显然OpenCV中常见的轮廓分析无法获得上面的中心红色线段,本
基于opencv4和Yolo-Fastest,实现PC和单片机通信,控制步进电机捕获目标
效果视频 基于opencv4和yolo,实现PC和单片机通信,控制步进电机捕获目标
发表于 11-23 17:36
•16次下载
![基于<b class='flag-5'>opencv4</b>和Yolo-Fastest,实现PC和单片机通信,控制步进电机捕获目标](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
如何在Raspberry Pi 3上安装OpenCV4库
今天我们将学习如何在 Raspberry Pi 3 上安装 OpenCV4 库,以便我们可以将其用于计算机视觉应用程序。这将允许 OpenCV 在像 Pi 这样的便携式设备上运行,从而打开许多可能性的大门。所以让我们开始吧
![如何在Raspberry Pi 3上安装<b class='flag-5'>OpenCV4</b>库](https://file.elecfans.com/web2/M00/68/50/pYYBAGMZovqAROdhAAHN3YJj2GU513.png)
OpenCV二值图像分析
二值图像分析最常见的一个主要方式就是轮廓发现与轮廓分析,其中轮廓发现的目的是为轮廓分析做准备,经过轮廓分析我们可以得到轮廓各种有用的属性信息
评论