J'ai cette image ci-dessous comme référence pour étudier un futur projet que je vais créer, en utilisant findContours(). J'ai réussi à pratiquement tout, mais j'ai eu un problème et une autre question (qui n'est pas un problème, mais peut être améliorée). Le problème est que les contours ne sont pas dans le bon ordre, comme dans l'image, dont le "H" doit revenir en premier, "i" en second, "n" en troisième et ainsi de suite. Il me revient, "niodHe". Qu'est-ce que je manque dans le code ci-dessous? Ou que dois-je ajouter pour résoudre ce problème ?

enter image description here

      Mat image = Imgcodecs.imread("C:\\Users\\deskadmin\\Desktop\\CONSTRUCAO\\1.png");
      Mat original = image.clone();
      Mat imageHSV = new Mat(image.size(), CvType.CV_8UC4);
      Mat imageBlurr = new Mat(image.size(), CvType.CV_8UC4);
      Mat imageA = new Mat(image.size(), CvType.CV_32F);
      Imgproc.cvtColor(image, imageHSV, Imgproc.COLOR_BGR2GRAY);
      Imgproc.GaussianBlur(imageHSV, imageBlurr, new Size(5,5), 0);
      Imgproc.adaptiveThreshold(imageBlurr, imageA, 255,Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY,7, 5);

      List<MatOfPoint> contours = new ArrayList<MatOfPoint>();    
      Imgproc.findContours(imageA, contours, new Mat(), Imgproc.RETR_LIST,Imgproc.CHAIN_APPROX_SIMPLE);
      //Collections.sort(contours, Comparator.comparingDouble(Imgproc::contourArea));
      for(int i = 0, j = 2; i < (contours.size()-1); i++, j++){
         System.out.println("Imgproc.contourArea(contours.get(i)): "+Imgproc.contourArea(contours.get(i)));
       //if(Imgproc.contourArea(contours.get(i)) > 50 ){
        Rect rect = Imgproc.boundingRect(contours.get(i));
         //if(rect.height < 100 & rect.height > 11){
          Imgproc.rectangle(image, new Point(rect.x,rect.y), new Point(rect.x+rect.width,rect.y+rect.height),new Scalar(0,0,255));
          Mat roi = original.submat(rect);
          Imgcodecs.imwrite("C:\\Users\\deskadmin\\Desktop\\CONSTRUCAO\\"+j+".png",roi);
         //}else if (rect.height >= 100){
          //Mat roi = image.submat(rect);
          //Imgcodecs.imwrite("C:\\Users\\deskadmin\\Desktop\\CONSTRUCAO\\marcacao.png",roi);
          //}
       //}
      }
0
L.Th 4 févr. 2020 à 00:59

1 réponse

Meilleure réponse

findContours() traite l'image de de bas en haut ET de de droite à gauche, si je ne me trompe pas.

Créez simplement un cadre de délimitation autour de chaque contour et ajoutez-les à une liste.

Plus tard, triez-les en utilisant leur position x,y et vous aurez les lettres dans l'ordre dans lequel vous souhaitez les lire.

0
karlphillip 4 févr. 2020 à 11:04