Imagen de limpieza para ayudar a tesseract en Android
Estoy tratando de extraer los dígitos de un tablero de sudoku. Después de detectar el tablero, sus esquinas y transformar, me quedo con una imagen bastante alineada de sólo el tablero. Ahora estoy tratando de reconocer los dígitos usando la implementación de Tesseract android, Tess-Two. Divido la imagen a 9 partes por
currentCell = undistortedThreshed.submat(rect);
Donde rect
es el rectángulo que rodea la imagen.
- C ++ OpenCV imread no funciona en Android
- Android: Grabación y transmisión simultánea
- Android Yuv420sp a ARGB en OpenCV
- OpenCV de Android: No se encontró identificador de recurso para el atributo 'camera_id' en el paquete
- ClassNotFoundException: android.hardware.camera2.CameraAccessException con OpenCV 3.1.0
Ahora al reconocimiento de dígitos.
Algunos dígitos, como 4, reconocen perfectamente. Algunos, sobre todo 6,7,8 se reconocen como 0s o nada.
Quiero ayudar a tesseract tanto como puedo limpiando la imagen de currentCell
. En este momento se parece a esto . (También intentado sin el umbral invertido). Quiero deshacerme de las líneas blancas (las líneas de sudoku). He intentado algo como esto (tomado de aquí )
Imgproc.Canny(currentCell, currentCell, 80, 90); Mat lines = new Mat(); int threshold = 50; int minLineSize = 5; int lineGap = 20; Imgproc.HoughLinesP(currentCell, lines, 1, Math.PI / 180, threshold, minLineSize, lineGap); for (int x = 0; x < lines.cols() && x < 1; x++) { double[] vec = lines.get(0, x); double x1 = vec[0], y1 = vec[1], x2 = vec[2], y2 = vec[3]; Point start = new Point(x1, y1); Point end = new Point(x2, y2); Core.line(currentCell, start, end, new Scalar(255), 10); }
Pero no dibuja nada, he intentado jugar con el ancho de la línea y el color, pero todavía nada. Trate de dibujar la línea en la imagen grande, en la imagen unthreshed, nada funciona ..
¿Alguna sugerencia?
EDITAR
Por alguna razón, no parece encontrar líneas. Esto es lo que la imagen se ve después de aplicar canny a ella Pero el HoughLines
no detecta ninguna línea. Probado tanto HoughLines
y HoughLinesP
con diferentes valores, como se muestra en la documentación de OpenCV, pero nada funciona … Esas son líneas bastante obvias .. ¿Qué estoy haciendo mal? ¡Gracias!
- La cámara no está abierta - Inicialización estática en OpenCV Android
- Rotación de imagen con opencv en android corta los bordes de una imagen
- Android Studio con opencv para android ndk, archivos de cabecera opencv no encontrados
- Substracción de fondo de OpenCV Android
- SURF Feature Extraction con Android OpenCV SDK - Obtener algunos errores
- Convertir mapa de bits a Mat después de capturar la imagen con la cámara de Android
- Detección de objetos para android con tesseract o OpenCV
- Android 4.2 ndk: error de carga de la biblioteca: load_library (linker.cpp: 750) || soinfo_link_image || libhoudini.so || opencv
Acabé haciendo algo diferente.
Utilicé findContours
para obtener el contorno más grande, que es el dígito.
Tiene su caja boundingRect
usando boundingRect
.
Extraído esto usando submat
y voilla. Tengo sólo el dígito.
Por desgracia, parece no hacer ninguna diferencia en absoluto. Tesseract todavía no puede reconocer los dígitos correctamente. A veces no da ningún resultado, a veces, después de dilatar los dígitos que reconoce el 6 como 0. Pero eso es un problema para otra pregunta.
Esta es una idea de la parte superior de mi cabeza:
Guarde el código que calcula las líneas de Hough en la imagen. Lo que significa que puede obtener las líneas correspondientes a la cuadrícula.
Ahora, simplemente dibuje esas líneas en la imagen original, pero ajuste el color a NEGRO.
La mayoría de las líneas blancas ahora estarían cubiertas con las líneas negras recién dibujadas. Como las posiciones de la línea de Hough no coinciden exactamente con las líneas reales, podrían quedar unos pocos puntos pequeños de blanco. Eliminarlos a través de componentes conectados (y descartar los componentes que son demasiado pequeños) o incluso algunas operaciones morfológicas – teniendo cuidado de que el dígito real permanece inalterado – podría manejar estas imperfecciones.
Prueba y házmelo saber. Espero que esto te ayude.