OpenCv案例(九): 基于OpenCvSharp图像分割提取目标区域和定位

慈云数据 8个月前 (03-12) 技术支持 150 0

以下原图中,物体连靠在一起,目的是将其分割开,再提取轮廓和定位

原图: 

 最终效果

麻烦的地方是,分割开右下角部分,两个连在一起的目标物体,下图所示: 

基本方法: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  

灰度图像后图像二值化:

图像取反

 

 绘制轮廓

 凸包检测,查找分割点,下图黄色点标记处即找到的分割点位置

 将找到的分割点在二值化图像中,连接一条线后,重新轮廓识别即可分割

最小轮廓矩形提取和绘制,以及绘制质心位置

 到此,已将连接处分隔开

注意:使用以上方法是需要根据图像大小设置部分参数,例如二值化处理参数、过滤轮廓形状大小,凸包检测点的获取等位置,需要根据实际情况设置参数;

微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon