【问题标题】:not detecting filled circle, showing empty circle instead- Opencv没有检测到实心圆圈,而是显示空圆圈-Opencv
【发布时间】:2017-07-31 17:38:22
【问题描述】:

我是 opencv 的新手,并试图从头开始制作 omr 扫描仪,并使用 sn-p 来检测实心圆圈,但它的作用恰恰相反,它检测的是空心圆圈。请告诉我我在代码中的错误。

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

【问题讨论】:

    标签: opencv4android


    【解决方案1】:

    为了更精确地检测实心圆。

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

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

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

    实心圆检测参考这个问题 Detect filled circle using opencv4Android

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-06
      相关资源
      最近更新 更多