[java] TALN et OCR

nonossa -  
Erick26100b Messages postés 1 Statut Membre -
salut tous le monde j'ai besion d'aide
mon projet de fin d'etude est sur le TALN et la reconnaissance des caractéres imprimées(OCR) en java
si quelqu'un peut me donne des sites qui parle de ce sujet et aussi des logiciels implemente en java sur OCR et merci
A voir également:

9 réponses

toema
 
Bonjour nonossa,

Je suis à la recherche de solutions OCR en Java. As-tu avancé sur la question depuis que tu as posté ton message il y a un an ?

D'ailleurs, au delà de la solution technologique, je suis à la recherche de compétences technologiques sur la question. Si quelqu'un a ces compétences, merci de me répondre.
1
Ayesh
 
Salut,

J'ai cherché à faire de l'OCR en Java également, et en fouillant, je suis tombé sur les éternels JavaOCR/Asprise, certes fonctionnels mais trop chers pour être utilisés dans un projet non-commercial.

Je me suis alors tourné vers des programme tiers. Et j'ai trouvé GOCR, permettant de faire l'OCR en ligne de commande. J'utilise personnellement la version compilée pour Windows.

http://jocr.sourceforge.net/

Malheureusement cette version en ligne de commande ne prend que les fichiers au format PPM (ou j'ai mal compris son utilisation ce qui n'est pas impossible ;) )

D'où l'utilisation d'un autre programme auparavant nconvert, qui permet de transformer une image en image ppm (entre autre)

http://pagesperso-orange.fr/pierre.g/xnview/fr_nconvert.html

Avec ces deux outils j'ai écrit deux classes statiques que je vous colle ici.

Alors c'est loin d'être une solution optimale ou quoique ce soit de robuste. Mais pour faire de l'OCR sur des polices informatique c'est largement suffisant.

A noter qu'il est important de transformer le texte (Noir sur Blanc) avant de le fournir a gocr.

J'espère que cela aidera certains d'entre vous ;)

**********************************************************************************************
import java.awt.Color;
import java.awt.Point;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

public class OCR {
static public String recognize(Point hg, Point bd, Color color, boolean isColorEcriture){
String res = null;
File fImg = new File("screenshot.png");
while(res == null){
BufferedImage img = ScreenHandler.getScreen(hg, bd);
if(isColorEcriture)
img = changeWithColorEcriture(img, color);
else
img = changeWithColorFond(img, color);
try {
ImageIO.write(img, "PNG", fImg);
Process p = Runtime.getRuntime().exec("nconvert -out ppm -o text.ppm screenshot.png");
p.waitFor();
p.destroy();
p = Runtime.getRuntime().exec("gocr045 text.ppm");
p.waitFor();
if(p.getInputStream().available()>0)
res = IOHandler.getResponse(p.getInputStream());
p.destroy();
}catch (InterruptedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
if(fImg.exists())
fImg.delete();
File texte = new File("text.ppm");
if(texte.exists())
texte.delete();
return res.replace("l", "1").replace("O", "0").trim();
}

private static BufferedImage changeWithColorEcriture(BufferedImage bi, Color ecriture) {
if (bi != null) {
int w = bi.getWidth();
int h = bi.getHeight();
int pixel;
BufferedImage bitmp = new BufferedImage(w, h, bi.getType());
BufferedImage biOut = new BufferedImage(w, h, bi.getType());

for (int x = 0; x < w; x++) {
for (int y = 0; y < h; y++) {
pixel = bi.getRGB(x, y);
if(pixel != ecriture.getRGB())
pixel = Color.BLUE.getRGB();
else
pixel = Color.BLACK.getRGB();
bitmp.setRGB(x, y, pixel);
}
}

for (int x = 0; x < w; x++) {
for (int y = 0; y < h; y++) {
pixel = bitmp.getRGB(x, y);
if(pixel == Color.BLUE.getRGB())
pixel = Color.WHITE.getRGB();
biOut.setRGB(x, y, pixel);
}
}

return biOut;
} else {
return bi;
}
}

private static BufferedImage changeWithColorFond(BufferedImage bi, Color fond) {
if (bi != null) {
int w = bi.getWidth();
int h = bi.getHeight();
int pixel;
BufferedImage bitmp = new BufferedImage(w, h, bi.getType());
BufferedImage biOut = new BufferedImage(w, h, bi.getType());

for (int x = 0; x < w; x++) {
for (int y = 0; y < h; y++) {
pixel = bi.getRGB(x, y);
if(pixel == fond.getRGB())
pixel = Color.BLUE.getRGB();
else
pixel = Color.WHITE.getRGB();
bitmp.setRGB(x, y, pixel);
}
}

for (int x = 0; x < w; x++) {
for (int y = 0; y < h; y++) {
pixel = bitmp.getRGB(x, y);
if(pixel == Color.BLUE.getRGB())
pixel = Color.WHITE.getRGB();
biOut.setRGB(x, y, pixel);
}
}

return biOut;
} else {
return bi;
}
}
}


**********************************************************************************************
package t3x.tnn.utility;

import java.awt.AWTException;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.image.BufferedImage;

public class ScreenHandler {

public static Color getPixelColor(Point p){
return getPixelColor(p.x, p.y);
}

public static BufferedImage getScreen(Point hg, Point bd){
checkNano();
return nano.createScreenCapture(new Rectangle(hg, new Dimension(bd.x-hg.x, bd.y-hg.y)));
}

public static boolean areImagesEqual(BufferedImage img1, BufferedImage img2){
int[] timg1 = getPixels(img1);
int[] timg2 = getPixels(img2);
for(int i = 0 ; i < timg1.length; i++){
if(timg1[i]!=timg2[i]){
return false;
}
}
return true;
}

public static Color analyse(Point depart, int deviation, Color fond){
for(int i= depart.x; i < depart.x+deviation; i++){
Color col = ScreenHandler.getPixelColor(i, depart.y);
if(!col.equals(fond))
return col;
}
//IOHandler.abort("[ScreenHandler.analyse] : Aucune couleur de jeu trouvée");
return null;
}
///////////////////////////////////////////////////////////////////////////////////
private static Robot nano;

private static Color getPixelColor(int x, int y){
checkNano();
return nano.getPixelColor(x, y);
}

private static int[] getPixels(BufferedImage img){
return img.getRaster().getPixels(img.getRaster().getMinX(), img.getRaster().getMinY(), img.getRaster().getWidth(), img.getRaster().getHeight(), new int[ img.getRaster().getWidth()*img.getRaster().getHeight()*10]);
}

private static void checkNano(){
if(nano == null)
try {
nano = new Robot();
} catch (AWTException e) {
e.printStackTrace();
}
}
}
1
sssccc
 
Bonjour,
Je ne comprends pas ce qu'il faut mettre comme paramètres à ta fonction recognize?
Merci
0
Ayesh > sssccc
 
Salut et désolé du temps de réponse,

La fonction recognize prend 4 parametres qui correspondent à :

hg : le point Haut Gauche sur l'ecran du rectangle à analyser
bf : le coin Bas Droit de ce meme rectangle
color : soit la couleur de fond de l'image soit la couleur du texte
isCouleurEcriture : true si c'est la couleur d ecriture, false si c est la couleur du fond.

Les deux derniers parametres sont un peu etranges mais il permettent de mettre l'image dans un format comprehensible pour l'OCR (Noir sur fond blanc).

Il vaut mieux mettre la couleur unie. Si tu as un fond multicolore avec une ecriture monocolore, alors il vaut mieux mettre la couleur de l ecriture et vice versa ;)

@ plus
0
hosna > Ayesh
 
salut
svp est ce que je peux vous donner question a prpos votre code souce
j besoin de votre aide a prpos ce sujet.
mon mail c hosnaghazel2007@yahoo.fr
0
Liethane
 
Bonjour,

http://www.javaocr.com
http://asprise.com/product/javapdf/

librairie java : jpedal

les versions complètes doivent être payantes mais les démos sont gratuites.

Cdt
0
aymen2 Messages postés 14 Statut Membre 1
 
Bonjour,
il ya qui peut m'aider de plus je me plainte là ?
marci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
aymen2 Messages postés 14 Statut Membre 1
 
voila enfin je trouve la solution avec l'api asprise elle fait tout
vous été besoin que de télécharger le fichier asprise.jar et l'ajouter
.....
et ça fonction très bien
0
walou
 
Bonjour !
je crois que vous avez presque le même probléme,l 'OCR sur Java avec toutes ces fonctionnalités est bien trop chére pour vous,vous avez raison.et bien je suis un revendeur.et si vous voulez on discute sur le prix,je vous assure c pas trop chére,c presque gratos
Ciao
0
yassine
 
bonjour
j'ai besoin de acheté une OCR sur JAVA et j'ai besoin en urgence je veux prix temps ?
yassine
0
Erick26100b Messages postés 1 Statut Membre
 
Bonjour, je sais que la discution date d'il y a quelques temps mais j'ai un petit problème sous Nebeans lorsque j'ajoute les deux classes, j'ai une erreur sur cette ligne :

res = IOHandler.getResponse(p.getInputStream());

j'aimerais savoir si quelqu'un a trouver une réponse à se problème car je cherche la bonne classe IOHandler pour pouvoir utiliser cette classe ou une autre méthode capable de réaliser cette procedure .....

Merci pour les futurs réponses !!
0
incoonnu
 
pas d'aide
-1
aymen2
 
aymenbenmoussa@hotmail.com
-1