没有检测到填充圆圈,而是显示空圆圈 - Opencv

时间:2017-06-27 08:54:22

标签: opencv4android

我是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 个答案:

答案 0 :(得分:0)

用于更精确地检测实心圆。

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

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

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

对于实心圆检测,请参考此问题 Detect filled circle using opencv4Android