一、简介
计算机视觉中的Blob是指图像中的一块连通区域,Blob分析就是对前景/背景分离后的二值图像,进行连通域提取和标记。标记完成的每一个Blob都代表一个前景目标,然后就可以计算Blob的一些相关特征,如:面积、质心、外接矩形等几何特征,还可以计算Blob的颜色、纹理特征,这些特征都可以作为跟踪的依据。
二、实战
1、今天以一个装有电芯的模块为例,检测出电芯装反的负极电芯出来,如下图,有三颗电芯是负极,是错误的,我们利用Blob分析,把它检测标记出来;
2、部分代码如下:
Mat mat_BitwiseNot = new Mat();
mat_Src.CopyTo(mat_DetectedCircles);
Cv2.BitwiseNot(mat_Dilate, mat_BitwiseNot);
var circleParams = new SimpleBlobDetector.Params
{
MinThreshold = 140,
MaxThreshold =255,
ThresholdStep=1,
// The area is the number of pixels in the blob.
FilterByArea = true,
MinArea =Convert.ToSingle(textBox4.Text) ,
MaxArea = Convert.ToSingle(textBox5.Text),
// Circularity is a ratio of the area to the perimeter. Polygons with more sides are more circular.
FilterByCircularity = true,
MinCircularity = 0.5f,
// Convexity is the ratio of the area of the blob to the area of its convex hull.
FilterByConvexity = true,
MinConvexity = 0.5f,
// A circle's inertia ratio is 1. A line's is 0. An oval is between 0 and 1.
FilterByInertia = true,
MinInertiaRatio = 0.5f
};
var circleDetector = SimpleBlobDetector.Create(circleParams);
var circleKeyPoints = circleDetector.Detect(mat_BitwiseNot);
//Cv2.DrawKeypoints(mat_BitwiseNot, circleKeyPoints, detectedCircles, Scalar.Red, DrawMatchesFlags.DrawRichKeypoints);
foreach (var item in circleKeyPoints)
{
OpenCvSharp.Point p = new OpenCvSharp.Point();
p.X = (int)item.Pt.X;
p.Y = (int)item.Pt.Y;
Cv2.Circle(mat_DetectedCircles, p,50,Scalar.Red,10,LineTypes.Link8);
}
//Cv2.PutText(mat_DetectedCircles, "共找到负极电芯:"+ circleKeyPoints.Length.ToString(), new OpenCvSharp.Point(10, 260),HersheyFonts.HersheySimplex, 10,Scalar.Red);
Bitmap bitmap_detectedCircles = BitmapConverter.ToBitmap(mat_DetectedCircles);
pictureBox4.Image = bitmap_detectedCircles;
3、实现效果如下:
4、完整代码已上传网盘,如需完整代码,关注点赞后私信发“Blob”即可自动回复。