2012-07-14 7 views
8

Attualmente sto giocando con OCR su Android. Perciò ho scritto una piccola app con un'anteprima di Camera e ora sto alimentando le immagini di tessearact (tess-two) dal mio metodo onPreviewFrame. Ora voglio visualizzare i reticoli rilegati dall'OCR sulla mia anteprima della fotocamera. TessBaseAPI fornisce metodi che restituiscono caselle di caratteri/parole. Il tipo dell'oggetto restituito è Pixa, come nella libreria leptonica fornita con tess-two.Tesseract di Android OCR: utilizzo di dati da oggetti Pixa per visualizzare caselle di delimitazione

Quindi la mia domanda è: Come faccio ad avere le coordinate utilizzabili che posso usare per disegnare i rettangoli di selezione sulla mia macchina fotografica anteprima dagli oggetti Pixa restituiti da getCharacters() o estraiParole() dalla TessBaseAPI?

GetCharacters() and getWords() in the BaseAPI

leptonicas Pixa class

Importante:

Perché le anteprime supportati solo immagine-formato è YUV N21 e come lontano da quello che ho letto il tess-API richiede ARGB_8888 Bitmap I avere la seguente soluzione alternativa nel mio metodo onPreviewFrame appena prima di alimentare la bitmap su TessAPI: (Sto anche ruotando di 90 gradi in senso orario perché sto usando la fotocamera con orientamento verticale, ma le fotocamere previe telai W sono disponibili in paesaggio)

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

Quindi, in pratica, ho comprimere il byte NV21 [] Ho avuto dalla telecamera in un YuvImage, poi in un jpeg, e da lì in una bitmap. Ho cercato il web molto per la soluzione su come ottenere bitmap/jpeg dall'array NV21 e questo è stato il più semplice che ho trovato. Questa bitmap verrà inviata agli strumenti tesseract OCR. Questo mi porta alla mia seconda domanda:

Come, dopo queste compressioni e una rotazione di 90 gradi, trovo dove devo disegnare le finestre sullo schermo? (relativo a prima delle compressioni e della rotazione)

Questo potrebbe non essere il migliore o anche un buon modo per fornire l'OCR con fotogrammi live, apprezzo moltissimo commenti, altre soluzioni o suggerimenti di ottimizzazione.

Ho iniziato questo progetto due giorni fa e sono un principiante nella programmazione per android e ocr. Durante questi due giorni questa pagina mi ha aiutato molto e ha risposto a domande che avevo finora molto bene, quindi grazie per questo e grazie in anticipo per avermi aiutato con il mio problema attuale. Se ti piacerebbe vedere più codice o avere domande, fornirò e sarò lieto di rispondere a qualsiasi cosa io possa.

Saluti

È possibile navigare attraverso l'intero codice sorgente API su github trogolo della classe e GetCharacters Pixa() link, cant inserire altri collegamenti ipertestuali.

risposta

14

TessTBaseApi.getWords().getBoxRects() restituirà un ArrayList del riquadro di delimitazione Rects con le coordinate relative al bitmap bmp.

+0

grazie, esattamente quello che stavo cercando! È un peccato che non ti abbia mai superato. – Jones