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