未检测到实心圆,而是显示空心圆 - Opencv

not detecting filled circle, showing empty circle instead- Opencv

我是 opencv 的新手,正在尝试从头开始制作 omr 扫描仪,并且有一个片段应该检测实心圆,但它的作用恰恰相反,检测的是未实心的圆。请告诉我我在代码中的错误。

public void showFilledCircles(Bitmap paramView)
{
    paramView = BitmapFactory.decodeFile(filename);
    Mat localMat1 = new Mat();
    Utils.bitmapToMat(paramView, localMat1);
    Object localObject1 = new Mat();
    double[] lo;
    Imgproc.GaussianBlur(localMat1, (Mat)localObject1, new Size(3.0D, 3.0D), 3.0D, 2.5D);
    Mat localMat2 = new Mat();
    Imgproc.cvtColor((Mat)localObject1, localMat2, 7);
    localObject1 = new ArrayList();
    Object localObject2 = new Mat();
    Mat localMat3 = new Mat();
    Imgproc.Canny(localMat2, localMat3, 140.0D, 255.0D);
    Imgproc.findContours(localMat3, (List)localObject1, (Mat)localObject2,1,2);
    int i = 0;
    while (i < ((List)localObject1).size())
    {
        Imgproc.drawContours(localMat2, (List)localObject1, i, new Scalar(0.0D, 0.0D, 255.0D), 2);
        //Log.i("Local Objects","Local Object Point -------------------"+localMat2);
        i += 1;
    }
    localObject1 = new Mat();
    Core.inRange(localMat2, new Scalar(70.0D, 70.0D, 70.0D), new Scalar(255.0D, 255.0D, 255.0D), (Mat)localObject1);
    localMat2 = localMat1.clone();
    Imgproc.HoughCircles((Mat)localObject1, localMat2, 3, 1.0D, 20.0D, 40.0D, 10.0D, 6, 18);

i = 0;
for (;;)
{
    if (i < localMat2.cols())
    {
        localObject1 = localMat2.get(0, i);
        lo = localMat2.get(0, i);
        if (localObject1 != null) {}
    }
    else
    {
        Utils.matToBitmap(localMat1, paramView);
        this.imageView.setImageBitmap(paramView);
        //this.imageView.setRotation(90.0F);
        return;
    }
    localObject2 = new Point(Math.round(lo[0]), Math.round(lo[1]));
    int j = (int)Math.round(lo[2]);
    Log.i("cicle Points ---------", localObject2 + " radius " + j);
    Imgproc.circle(localMat1, (Point)localObject2, 1, new Scalar(0.0D, 0.0D, 255.0D), 5);
    Imgproc.circle(localMat1, (Point)localObject2, j, new Scalar(255.0D, 0.0D, 0.0D), 5);
    i += 1;
}
}

输出图片 output image

更精确地检测实心圆。

第 1 步:检测图像上的轮廓

第 2 步:围绕检测到的轮廓创建矩形。

第 3 步:根据矩形的高度和宽度,只选择您想要的轮廓。

实心圆检测参考这个问题