Я новичок, и я пытаюсь сделать модуль Android для процесса OCR.Чтобы оптимизировать процесс, я пытаюсь автоматически обрезать текстовую часть изображения.Я боролся, но я просто не могу это сделать.Я нашел пару обучающих программ, таких как , этот , но он не в java, и мой мозг просто не будет работать.Любая помощь будет оценена, я все еще пытаюсь учиться.Уже несколько дней занимаюсь исследованиями.
В настоящее время использую openCV для некоторой постобработки для повышения точности и извлечения данных из изображения (поступления от некоторых машин). Я использую регулярные выражения для получения соответствующих данных (данных,время, номер машины 5 цифр и некоторые цифры, которые 6 цифр, а иногда это не работает, это все, что я мог придумать на данный момент).
Попытка максимально улучшить процесс.При необходимости я могу предоставить код, но это полный беспорядок.Я создал отдельный андроид студийный проект только для обработки opencv.
Извините за длинный текст, ищущий улучшения (я думаю, я действительно новичок).Большое спасибо!
Забыл упомянуть - Используя TESSERACT для процесса распознавания, openCV для обработки изображений.Приложение будет использоваться некоторыми не очень технически подкованными людьми, я хотел использовать инструмент ручной обрезки, но он не принесет особой пользы.Все сделано на устройстве, подключение к интернету невозможно.
Необходимо обрезать текстовую часть изображения
Прикрепленный код, который создает поля на тексте (со степеньюточность)
Все еще открыты для предложений о том, как повысить точность, спасибо!
public Vector<Rect> detectLetters(Mat img){
Mat img_gray = new Mat();
Mat img_sobel = new Mat();
Mat img_threshold = new Mat();
Mat element = new Mat();
Mat contourOutput = new Mat();
Vector<Rect> boundRect = new Vector<>();
Imgproc.cvtColor(img, img_gray, Imgproc.COLOR_BGR2GRAY);
Imgproc.Sobel(img_gray, img_sobel, CvType.CV_8U, 1,0,3,1,0,BORDER_DEFAULT);
Imgproc.threshold(img_sobel, img_threshold, 0, 255, Imgproc.THRESH_OTSU+Imgproc.THRESH_BINARY);
element = getStructuringElement(MORPH_RECT, new Size(30,30));
Imgproc.morphologyEx(img_threshold, img_threshold, 3, element);
List<MatOfPoint> contours = new ArrayList<>();
Imgproc.findContours(img_threshold, contours, contourOutput, 0, 1);
Iterator<MatOfPoint> iterator = contours.iterator();
List<MatOfPoint> contours_poly = new ArrayList<>(contours.size());
for (int i=0; i<contours.size(); i++){
if(contours.get(i).toArray().length > 100){
double epsilon = 0.1*Imgproc.arcLength(new MatOfPoint2f(contours.get(1).toArray()),true);
MatOfPoint2f approx = new MatOfPoint2f();
Imgproc.approxPolyDP(new MatOfPoint2f(contours.get(1).toArray()),approx,epsilon,true);
Rect appRect = Imgproc.boundingRect(contours.get(i));
if(appRect.width > appRect.height);
boundRect.add(appRect);
}
}
return boundRect;
}