Верните контуры аккуратно - OpenCV / Java - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть это изображение ниже как ссылка для изучения будущего проекта, который я создам, используя findContours(). Я добился успеха практически во всем, но у меня была проблема и другой вопрос (который не является проблемой, но может быть улучшен). Проблема в том, что контуры не в правильном порядке, как на изображении, чье «H» должно возвращаться первым, «i» - вторым, «n» - третьим и т. Д. Он возвращается ко мне, "niodHe". Чего мне не хватает в приведенном ниже коде? Или что я должен добавить, чтобы исправить это?

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

1 Ответ

0 голосов
/ 04 февраля 2020

findContours() обрабатывает изображение от снизу вверх И справа налево , если я не ошибаюсь.

Просто создайте ограничивающую рамку вокруг каждого контура и добавьте их в список.

Позже рассортируйте их, используя их позицию x,y, и у вас будут буквы в том порядке, в котором вы хотите их прочитать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...