以下原图中,物体连靠在一起,目的是将其分割开,再提取轮廓和定位
原图:
最终效果:
麻烦的地方是,分割开右下角部分,两个连在一起的目标物体,下图所示:
基本方法:BoxFilter滤波、二值化、轮廓提取,凸包检测,图像的矩
代码如下:
/// /// 获取分割点 /// /// /// /// /// /// public List GetSplitPoints(Point[][] contours, List contourCount, int arcLength, int farDistance) { #region 凸包检测 List lArc = new List(); //Mat src = srcImage.Clone(); List lpContours = new List(); List hulls = new List(); Point lastP = new Point(); Point firstP = new Point(); Point farLastP = new Point(); List lps = new List(); int dot = 1; List depth = new List(); for (int i = 0; i farDistance) //(4500 length)//(rect1.Width > range1 && rect1.Height 1) { Cv2.Line(bitwiseMat, lps[0], lps[1], Scalar.Black, 2, LineTypes.Link8); } Cv2.ImShow("bitwiseMat2", bitwiseMat); //轮廓提取 contourCount.Clear(); // 注意:不同大小的图像处理时,需要修改length参数 Point[][] newContours = GetImageContours(bitwiseMat, 550, out contourCount); List rotatedRects = GetMinRects(newContours, contourCount); for (int i = 0; i灰度图像后图像二值化:
图像取反
绘制轮廓
凸包检测,查找分割点,下图黄色点标记处即找到的分割点位置
将找到的分割点在二值化图像中,连接一条线后,重新轮廓识别即可分割
最小轮廓矩形提取和绘制,以及绘制质心位置
到此,已将连接处分隔开
注意:使用以上方法是需要根据图像大小设置部分参数,例如二值化处理参数、过滤轮廓形状大小,凸包检测点的获取等位置,需要根据实际情况设置参数;