OpenCV:如何检测由点和线段组成的闭合轮廓?

z3yyvxxp  于 2023-02-13  发布在  其他
关注(0)|答案(1)|浏览(145)

我想使用OpenCV来检测二值图像中不完美的椭圆轮廓,但不幸的是,椭圆轮廓由彼此之间具有更大间隙(最多25个像素)的独立大点组成。
我尝试过OpenCV轮廓检测,但它不起作用。它只标记了单个点的位置,而不是为轮廓生成一个包围圈。
如何使用OpenCV检测轮廓?请帮助。Here's a sample image
我的最终目标是用椭圆拟合虚线环。附近的其他点是噪声数据点。我尝试获得每个点或点簇的轮廓中心,并将这些中心的xy坐标放入数组中。我希望FitEllipse将只捕获形成该环的轮廓中心。但当我执行FitEllipse时,我得到了一个异常“Emgu.CV.Util.CvException:'OpenCV:n〉= 0 &&(深度== CV_32F||深度== CV_32S)'“

private void btnGO_Click(object sender, EventArgs e)
{
    Mat pic = new Mat();
    pic = CvInvoke.Imread("test image.png", 
    Emgu.CV.CvEnum.ImreadModes.Grayscale);              

    VectorOfVectorOfPoint contours= new VectorOfVectorOfPoint();

    Mat hierarchy = new Mat();           

    CvInvoke.FindContours(pic, contours, hierarchy, 
    Emgu.CV.CvEnum.RetrType.Tree, 
    Emgu.CV.CvEnum.ChainApproxMethod.ChainApproxSimple);

    Moments moments = new Moments();            

    List<Point> contourCentersList = new List<Point>();

    for (int i = 0; i < contours.Size; i++)
    {
        int x;
        int y;
                            
        moments = CvInvoke.Moments(contours[i]);

        if (moments.M00 == 0)
        continue;

        x = Convert.ToInt32(moments.M10 / moments.M00);
        y = Convert.ToInt32(moments.M01 / moments.M00);

        ContourCentersList.Add(new Point(x, y));
    }

    Mat contourCenters = new Mat();
    contourCenters.SetTo(contourCentersList.ToArray());

    RotatedRect ellipse = new RotatedRect();

    ellipse = CvInvoke.FitEllipse(contourCenters);  
}
zf9nrax1

zf9nrax11#

为了获得一个轮廓,你可以预处理图像,以获得未连接的区域连接。
为此,您可以应用模糊,然后阈值图像。
在图像以及应用模糊和阈值的结果下面:
第一节第一节第一节第一节第一次

相关问题