[java] TALN et OCR
nonossa
-
Erick26100b Messages postés 1 Statut Membre -
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
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:
- [java] TALN et OCR
- Jeux java itel - Télécharger - Jeux vidéo
- Waptrick java football - Télécharger - Jeux vidéo
- Free ocr - Télécharger - Divers Bureautique
- Waptrick java voiture - Télécharger - Jeux vidéo
- Eclipse java - Télécharger - Langages
9 réponses
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.
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.
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();
}
}
}
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();
}
}
}
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
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
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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
vous été besoin que de télécharger le fichier asprise.jar et l'ajouter
.....
et ça fonction très bien
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
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
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 !!
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 !!