2012-07-14 11 views
8

Actualmente estoy jugando con OCR en Android. Por lo tanto, escribí una pequeña aplicación con una vista previa de la cámara y ahora estoy alimentando las herramientas de Tessearact (tess-two) de mi método onPreviewFrame. Ahora quiero mostrar los círculos rectas del OCR en mi Vista previa de la cámara. TessBaseAPI proporciona métodos que devuelven cuadros de caracteres/palabra que se inclinan. El tipo del objeto devuelto es Pixa, como en la biblioteca leptonica provista con tess-two.Android tesseract OCR: el uso de datos de objetos Pixa para mostrar recuadros delimitantes

Así que mi pregunta es: ¿Cómo obtengo las coordenadas utilizables que puedo usar para dibujar los cuadros delimitadores en la vista previa de mi cámara de los objetos Pixa devueltos por getCharacters() o getWords() de TessBaseAPI?

GetCharacters() and getWords() in the BaseAPI

leptonicas Pixa class

Importante:

Debido a las vistas previas sólo se admite la imagen a formato es YUV N21 y en la medida de lo que he leído el Tess-API requiere ARGB_8888 mapas de bits I Tengo la siguiente solución en mi método onPreviewFrame justo antes de alimentar el mapa de bits a TessAPI: (También estoy girando 90 grados en el sentido de las agujas del reloj porque estoy usando la cámara en orientación vertical, pero las cámaras previenen w marcos vienen en el paisaje)

//byte[] bmpdata <- the image in a byte array (NV21 Imageformat) in onPreviewFrame 
YuvImage yuvimage = new YuvImage(bmpdata,ImageFormat.NV21,width,height,null); 

ByteArrayOutputStream outStream = new ByteArrayOutputStream(); 
Rect rect = new Rect(0, 0, width, height); 
yuvimage.compressToJpeg(rect, 100, outStream); 

Bitmap bmp = BitmapFactory.decodeByteArray(outStream.toByteArray(),0,outStream.size()); 

Matrix mtx = new Matrix(); 
mtx.preRotate(90); 
bmp = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), mtx, false); 
bmp = bmp.copy(Bitmap.Config.ARGB_8888, true); 

TessTBaseApi.setImage(bmp); 

Así que, básicamente, que comprimen el byte NV21 [] Tengo por la cámara en un YuvImage, a continuación, en un jpeg, y de allí a un mapa de bits. Busqué mucho en la web la solución sobre cómo obtener bitmap/jpeg de la matriz NV21 y esta fue la más fácil que encontré. Este mapa de bits se alimentará a las herramientas de tesseract OCR. Esto me lleva a mi segunda pregunta:

¿Cómo, después de estas compresiones y la rotación de 90 grados, puedo ubicar dónde tengo que dibujar los cuadros en la pantalla? (relativo a antes de las compresiones y la rotación)

Puede que esta no sea la mejor ni la mejor manera de suministrar el OCR con marcos en vivo, agradezco mucho los comentarios, otras soluciones o sugerencias de formas de optimización.

Inicié este proyecto hace dos días y soy un principiante en la programación de android y ocr. Durante estos dos días, esta página me ayudó mucho y respondió muy bien las preguntas que hasta ahora había tenido, así que gracias por eso y gracias de antemano por ayudarme con mi problema actual. Si desea ver más código o tiene preguntas, proporcionaré y estaré encantado de responder cualquier cosa que pueda.

Saludos

Usted puede navegar Trough todo el código fuente API en github Trough la clase y GetCharacters Pixa (enlaces), no puedo insertar más hipervínculos.

Respuesta

14

TessTBaseApi.getWords().getBoxRects() volverá un ArrayList de la caja Rects que limita con coordenadas relativas a su bmp mapa de bits.

+0

gracias, ¡exactamente lo que estaba buscando! Es una pena que no pueda votarte. – Jones

Cuestiones relacionadas