Rilevamento di versi arabi su più righe


12

Devo creare un'app Corano e voglio leggere i versetti quando un utente la tocca. Il problema che sto affrontando è che alcuni versi possono espandersi a una e mezza riga (verso rosso evidenziato) o semplicemente adattarsi a un quarto di riga (verso verde evidenziato). Quindi l'aggiunta di ogni verso alla visualizzazione di testo o ad un'altra vista non funzionerà, a quanto pare.

Voglio rilevare versi come quelli rossi nella seconda immagine. Ho i file audio per i versetti, quindi non ho bisogno di conversione da sintesi vocale


1
La pagina viene fornita come dati immagine o testo Unicode renderizzato?

Sintesi vocale .. Ma poi, per favore, mostraci la tua ricerca.

Ho provato ad aggiungere dinamicamente ogni immagine di versi a imageview, ma il problema si pone è che la visualizzazione dell'immagine non si espanderà a una linea e mezza del genere. A volte alcuni versi possono richiedere una riga e mezza, spero che tu abbia capito cosa intendevo dire. Ho bisogno di qualche suggerimento per superare questo.

1
Usa due linee e hai un po 'di spese generali?

1
Con una riga e mezza vuoi dire che occupa la larghezza dello schermo, quindi metà della riga successiva in basso?

Risposte:


9

Questo può essere risolto in modo abbastanza semplice con una semplice corrispondenza del modello. Non so esattamente come lo hai impostato, quindi descriverò l'algoritmo in generale e userò le illustrazioni.

  • Osserva che i numeri dei versetti hanno un bordo distintivo che può essere facilmente utilizzato per rilevare l'inizio e la fine di un versetto. Quindi crea un modello binarizzato per quel modello e salvalo. Qualcosa come questo:

    inserisci qui la descrizione dell'immagine

  • Poiché il numero di linee in una schermata è noto in anticipo (stai formattando la pagina) e ogni verso ha un'altezza costante, puoi facilmente dedurre (algoritmicamente) dove le coordinate Y per le linee centrali dei versetti dovrebbero essere sullo schermo . Questo dimostra l'idea:

    inserisci qui la descrizione dell'immagine

  • Quando l'utente tocca un verso, ottieni le coordinate XY e aggancia la coordinata Y al centro del verso più vicino.

  • Quindi, iniziando con la coordinata X, esegui una corrispondenza del modello semplice (correlazione incrociata) su quella riga. La prima corrispondenza (picco nella correlazione incrociata) nella direzione in avanti (a sinistra), sarà il punto finale del verso. Se non ci sono corrispondenze nella direzione inversa (a destra), spostati verso l'alto di un verso (cosa che puoi fare, perché conosci la coordinata Y della linea centrale) e ripeti. La prima partita dall'estremità sinistra sarà il punto iniziale del verso. Allo stesso modo, se sulla linea non è presente alcuna corrispondenza in avanti, spostarsi in basso di una riga e ripetere.

    Ecco una breve illustrazione dell'idea. La casella gialla è dove l'utente tocca il verso. Quindi fai la correlazione incrociata con il tuo modello e i cerchi blu saranno la corrispondenza.

    inserisci qui la descrizione dell'immagine

    Uso anche la corrispondenza del modello in questa risposta , se sei interessato a vederlo in azione.

  • Dopo aver determinato il punto iniziale per il verso, utilizzare un riconoscitore di testi in arabo per inferire il numero del verso all'interno di quel bordo e riprodurre il file audio corrispondente.


Soluzione più semplice:

Una soluzione più semplice, se non vuoi passare attraverso questo è quella di memorizzare le coordinate XY dei punti di partenza del verso (mantienila semplice e usa i punti centrali) e una volta ottenute le coordinate dell'input dell'utente, puoi di nuovo scattare sulla linea centrale e poi cammina indietro per vedere dove inizia il verso. Questo potrebbe avere il vantaggio di essere più veloce.

Non l'ho presentato come la prima soluzione perché sembra che tu abbia rifiutato un'idea simile nei commenti. Alla fine, dipende dai tuoi vincoli - preferiresti fare un lavoro di calcolo (corrispondenza del modello - che, tra l'altro, richiede anche che tu memorizzi il modello) o usare la memoria (memorizzazione delle coordinate).

Se fossi in te, probabilmente sceglierei questo, ma la soluzione di elaborazione delle immagini può essere divertente da provare.


yoda o chiunque altro, puoi spiegare un po 'meglio questo problema, per favore .?In realtà ciò che voglio sapere e che non capisco è solo come o come prendere i numeri all'interno dei cerchi blu.?! Molte grazie!

@xmenus Una volta che hai bloccato il cerchio (cosa che fai in base al modello corrispondente al bordo distintivo), dovrai usare una libreria di riconoscimento di testo / numero arabo per identificare il contenuto all'interno. Non conosco l'arabo e quindi non posso raccomandare nulla. Potresti provare a chiedere all'OP ...
Lorem Ipsum,

@xmenus Se hai bisogno di aiuto con l'arabo puoi chiedermelo, ma da quello che stai chiedendo se volessi semplicemente rilevare un numero arabo puoi presumibilmente fare lo stesso modello corrispondente per loro come stai facendo con i cerchi.
Spacey,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.