2017-06-27 5 views
0

Je suis nouveau à opencv et en essayant de faire omr scanner à partir de zéro et avoir un extrait qui est censé détecter les cercles remplis mais il fait tout à fait opposé et de détecter un cercle vide. S'il vous plaît montrez-moi mon erreur dans le code.ne pas détecter cercle rempli, montrant le cercle vide à la place- Opencv

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; 
} 
} 

image de sortie output image

Répondre

0

pour une détection plus précise du cercle plein.

étape 1: détecter des contours sur l'image

étape 2: créer un rectangle autour des contours détectés.

étape 3: en fonction de la hauteur et de la largeur du rectangle, choisissez uniquement les contours souhaités.

pour la détection de cercle se réfèrent à cette rempli question Detect filled circle using opencv4Android