Skip to content

Commit

Permalink
Add getWords API
Browse files Browse the repository at this point in the history
  • Loading branch information
nguyenq committed Dec 5, 2015
1 parent 80b4feb commit ba52362
Show file tree
Hide file tree
Showing 6 changed files with 131 additions and 117 deletions.
15 changes: 12 additions & 3 deletions src/main/java/net/sourceforge/tess4j/ITesseract.java
Original file line number Diff line number Diff line change
Expand Up @@ -219,9 +219,18 @@ public enum RenderedFormat {
* Gets segmented regions.
*
* @param bi input image
* @param level TessPageIteratorLevel enum
* @return
* @param pageIteratorLevel TessPageIteratorLevel enum
* @return list of <code>Rectangle</code>
* @throws TesseractException
*/
List<Rectangle> getSegmentedRegions(BufferedImage bi, int level) throws TesseractException;
List<Rectangle> getSegmentedRegions(BufferedImage bi, int pageIteratorLevel) throws TesseractException;

/**
* Gets recognized words at specific page iterator level.
*
* @param bi input image
* @param pageIteratorLevel TessPageIteratorLevel enum
* @return list of <code>Word</code>
*/
List<Word> getWords(BufferedImage bi, int pageIteratorLevel);
}
58 changes: 54 additions & 4 deletions src/main/java/net/sourceforge/tess4j/Tesseract.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import java.awt.image.*;
import java.io.*;
import java.nio.ByteBuffer;
import java.nio.IntBuffer;
import java.util.*;
import javax.imageio.IIOImage;
import net.sourceforge.lept4j.Box;
Expand All @@ -32,6 +33,8 @@

import net.sourceforge.tess4j.ITessAPI.TessBaseAPI;
import net.sourceforge.tess4j.ITessAPI.TessOcrEngineMode;
import net.sourceforge.tess4j.ITessAPI.TessPageIterator;
import net.sourceforge.tess4j.ITessAPI.TessResultIterator;
import net.sourceforge.tess4j.ITessAPI.TessResultRenderer;

import net.sourceforge.tess4j.util.ImageIOHelper;
Expand Down Expand Up @@ -568,20 +571,20 @@ private void createDocuments(String filename, TessResultRenderer renderer) throw
* Gets segmented regions.
*
* @param bi input image
* @param level TessPageIteratorLevel enum
* @return
* @param pageIteratorLevel TessPageIteratorLevel enum
* @return list of <code>Rectangle</code>
* @throws TesseractException
*/
@Override
public List<Rectangle> getSegmentedRegions(BufferedImage bi, int level) throws TesseractException {
public List<Rectangle> getSegmentedRegions(BufferedImage bi, int pageIteratorLevel) throws TesseractException {
init();
setTessVariables();

try {
List<Rectangle> list = new ArrayList<Rectangle>();
setImage(bi, null);

Boxa boxes = api.TessBaseAPIGetComponentImages(handle, level, TRUE, null, null);
Boxa boxes = api.TessBaseAPIGetComponentImages(handle, pageIteratorLevel, TRUE, null, null);
Leptonica leptInstance = Leptonica.INSTANCE;
int boxCount = leptInstance.boxaGetCount(boxes);
for (int i = 0; i < boxCount; i++) {
Expand All @@ -602,6 +605,53 @@ public List<Rectangle> getSegmentedRegions(BufferedImage bi, int level) throws T
}
}

/**
* Gets recognized words at specific page iterator level.
*
* @param bi input image
* @param pageIteratorLevel TessPageIteratorLevel enum
* @return list of <code>Word</code>
*/
public List<Word> getWords(BufferedImage bi, int pageIteratorLevel) {
this.init();
this.setTessVariables();

List<Word> words = new ArrayList<Word>();

try {
setImage(bi, null);

api.TessBaseAPIRecognize(handle, null);
TessResultIterator ri = api.TessBaseAPIGetIterator(handle);
TessPageIterator pi = api.TessResultIteratorGetPageIterator(ri);
api.TessPageIteratorBegin(pi);

do {
Pointer ptr = api.TessResultIteratorGetUTF8Text(ri, pageIteratorLevel);
String text = ptr.getString(0);
api.TessDeleteText(ptr);
float confidence = api.TessResultIteratorConfidence(ri, pageIteratorLevel);
IntBuffer leftB = IntBuffer.allocate(1);
IntBuffer topB = IntBuffer.allocate(1);
IntBuffer rightB = IntBuffer.allocate(1);
IntBuffer bottomB = IntBuffer.allocate(1);
api.TessPageIteratorBoundingBox(pi, pageIteratorLevel, leftB, topB, rightB, bottomB);
int left = leftB.get();
int top = topB.get();
int right = rightB.get();
int bottom = bottomB.get();
Word word = new Word(text, confidence, new Rectangle(left, top, right - left, bottom - top));
words.add(word);
} while (api.TessPageIteratorNext(pi, pageIteratorLevel) == TRUE);

return words;
} catch (Exception e) {
return words;
} finally {
dispose();
}
}

/**
* Releases all of the native resources used by this instance.
*/
Expand Down
56 changes: 52 additions & 4 deletions src/main/java/net/sourceforge/tess4j/Tesseract1.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import java.awt.image.*;
import java.io.*;
import java.nio.ByteBuffer;
import java.nio.IntBuffer;
import java.util.*;
import javax.imageio.IIOImage;
import net.sourceforge.lept4j.Box;
Expand Down Expand Up @@ -536,20 +537,20 @@ private void createDocuments(String filename, TessResultRenderer renderer) throw
* Gets segmented regions.
*
* @param bi input image
* @param level TessPageIteratorLevel enum
* @return
* @param pageIteratorLevel TessPageIteratorLevel enum
* @return list of <code>Rectangle</code>
* @throws TesseractException
*/
@Override
public List<Rectangle> getSegmentedRegions(BufferedImage bi, int level) throws TesseractException {
public List<Rectangle> getSegmentedRegions(BufferedImage bi, int pageIteratorLevel) throws TesseractException {
init();
setTessVariables();

try {
List<Rectangle> list = new ArrayList<Rectangle>();
setImage(bi, null);

Boxa boxes = TessBaseAPIGetComponentImages(handle, level, TRUE, null, null);
Boxa boxes = TessBaseAPIGetComponentImages(handle, pageIteratorLevel, TRUE, null, null);
int boxCount = Leptonica1.boxaGetCount(boxes);
for (int i = 0; i < boxCount; i++) {
Box box = Leptonica1.boxaGetBox(boxes, i, L_CLONE);
Expand All @@ -569,6 +570,53 @@ public List<Rectangle> getSegmentedRegions(BufferedImage bi, int level) throws T
}
}

/**
* Gets recognized words at specific page iterator level.
*
* @param bi input image
* @param pageIteratorLevel TessPageIteratorLevel enum
* @return list of <code>Word</code>
*/
public List<Word> getWords(BufferedImage bi, int pageIteratorLevel) {
this.init();
this.setTessVariables();

List<Word> words = new ArrayList<Word>();

try {
setImage(bi, null);

TessBaseAPIRecognize(handle, null);
TessResultIterator ri = TessBaseAPIGetIterator(handle);
TessPageIterator pi = TessResultIteratorGetPageIterator(ri);
TessPageIteratorBegin(pi);

do {
Pointer ptr = TessResultIteratorGetUTF8Text(ri, pageIteratorLevel);
String text = ptr.getString(0);
TessAPI1.TessDeleteText(ptr);
float confidence = TessResultIteratorConfidence(ri, pageIteratorLevel);
IntBuffer leftB = IntBuffer.allocate(1);
IntBuffer topB = IntBuffer.allocate(1);
IntBuffer rightB = IntBuffer.allocate(1);
IntBuffer bottomB = IntBuffer.allocate(1);
TessPageIteratorBoundingBox(pi, pageIteratorLevel, leftB, topB, rightB, bottomB);
int left = leftB.get();
int top = topB.get();
int right = rightB.get();
int bottom = bottomB.get();
Word word = new Word(text, confidence, new Rectangle(left, top, right - left, bottom - top));
words.add(word);
} while (TessPageIteratorNext(pi, pageIteratorLevel) == TRUE);

return words;
} catch (Exception e) {
return words;
} finally {
dispose();
}
}

/**
* Releases all of the native resources used by this instance.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
import java.awt.Rectangle;

/**
* Encapsulates Tesseract results.
* Encapsulates Tesseract OCR results.
*/
class Word {

Expand Down
59 changes: 7 additions & 52 deletions src/test/java/net/sourceforge/tess4j/Tesseract1Test.java
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,7 @@ public void testDoOCR_SkewedImage() throws Exception {
}

/**
* Test of createDocuments method, of class Tesseract.
* Test of createDocuments method, of class Tesseract1.
*
* @throws java.lang.Exception
*/
Expand All @@ -219,25 +219,22 @@ public void testCreateDocuments() throws Exception {
}

/**
* Test of extending Tesseract1.
* Test of getWords method, of class Tesseract1.
*
* @throws Exception while processing image.
*/
@Test
public void testExtendingTesseract1() throws Exception {
logger.info("Extends Tesseract1");
public void testGetWords() throws Exception {
logger.info("getWords");
File imageFile = new File(this.testResourcesDataPath, "eurotext.tif");

String expResult = "The (quick) [brown] {fox} jumps!\nOver the $43,456.78 <lazy> #90 dog";
String[] expResults = expResult.split("\\s");

Tess1Extension instance1 = new Tess1Extension();
instance1.setDatapath(new File(datapath).getPath());
int pageIteratorLevel = TessPageIteratorLevel.RIL_WORD;
logger.info("PageIteratorLevel: "
+ Utils.getConstantName(pageIteratorLevel, TessPageIteratorLevel.class));
logger.info("PageIteratorLevel: " + Utils.getConstantName(pageIteratorLevel, TessPageIteratorLevel.class));
BufferedImage bi = ImageIO.read(imageFile);
List<Word> result = instance1.getWords(bi, pageIteratorLevel);
List<Word> result = instance.getWords(bi, pageIteratorLevel);

// print the complete result
for (Word word : result) {
Expand All @@ -252,53 +249,11 @@ public void testExtendingTesseract1() throws Exception {
assertArrayEquals(expResults, text.toArray());
}

class Tess1Extension extends Tesseract1 {

public List<Word> getWords(BufferedImage bi, int pageIteratorLevel) {
this.init();
this.setTessVariables();

List<Word> words = new ArrayList<Word>();
try {
setImage(bi, null);

TessBaseAPIRecognize(this.getHandle(), null);
TessResultIterator ri = TessBaseAPIGetIterator(this.getHandle());
TessPageIterator pi = TessResultIteratorGetPageIterator(ri);
TessPageIteratorBegin(pi);

do {
Pointer ptr = TessResultIteratorGetUTF8Text(ri, pageIteratorLevel);
String text = ptr.getString(0);
TessAPI1.TessDeleteText(ptr);
float confidence = TessResultIteratorConfidence(ri, pageIteratorLevel);
IntBuffer leftB = IntBuffer.allocate(1);
IntBuffer topB = IntBuffer.allocate(1);
IntBuffer rightB = IntBuffer.allocate(1);
IntBuffer bottomB = IntBuffer.allocate(1);
TessPageIteratorBoundingBox(pi, pageIteratorLevel, leftB, topB, rightB, bottomB);
int left = leftB.get();
int top = topB.get();
int right = rightB.get();
int bottom = bottomB.get();
Word word = new Word(text, confidence, new Rectangle(left, top, right - left, bottom - top));
words.add(word);
} while (TessPageIteratorNext(pi, pageIteratorLevel) == TRUE);

return words;
} catch (Exception e) {
return words;
} finally {
this.dispose();
}
}
}

/**
* Test of getSegmentedRegions method, of class Tesseract1.
*/
@Test
public void testGetRegions() throws Exception {
public void testGetSegmentedRegions() throws Exception {
logger.info("getRegions at given TessPageIteratorLevel");
File imageFile = new File(testResourcesDataPath, "eurotext.png");
BufferedImage bi = ImageIO.read(imageFile);
Expand Down
58 changes: 5 additions & 53 deletions src/test/java/net/sourceforge/tess4j/TesseractTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -235,24 +235,22 @@ public void testCreateDocuments() throws Exception {
}

/**
* Test of extending Tesseract.
* Test of getWords method, of class Tesseract.
*
* @throws java.lang.Exception
*/
@Test
public void testExtendingTesseract() throws Exception {
logger.info("Extends Tesseract");
public void testGetWords() throws Exception {
logger.info("getWords");
File imageFile = new File(this.testResourcesDataPath, "eurotext.tif");

String expResult = "The (quick) [brown] {fox} jumps!\nOver the $43,456.78 <lazy> #90 dog";
String[] expResults = expResult.split("\\s");

TessExtension instance1 = new TessExtension();
instance1.setDatapath(new File(datapath).getPath());
int pageIteratorLevel = TessPageIteratorLevel.RIL_WORD;
logger.info("PageIteratorLevel: " + Utils.getConstantName(pageIteratorLevel, TessPageIteratorLevel.class));
BufferedImage bi = ImageIO.read(imageFile);
List<Word> result = instance1.getWords(bi, pageIteratorLevel);
List<Word> result = instance.getWords(bi, pageIteratorLevel);

//print the complete result
for (Word word : result) {
Expand All @@ -267,57 +265,11 @@ public void testExtendingTesseract() throws Exception {
assertArrayEquals(expResults, text.toArray());
}

/**
* Extends Tesseract.
*/
class TessExtension extends Tesseract {

public List<Word> getWords(BufferedImage bi, int pageIteratorLevel) {
this.init();
this.setTessVariables();

List<Word> words = new ArrayList<Word>();
try {
setImage(bi, null);

TessAPI api = this.getAPI();
api.TessBaseAPIRecognize(this.getHandle(), null);
TessResultIterator ri = api.TessBaseAPIGetIterator(this.getHandle());
TessPageIterator pi = api.TessResultIteratorGetPageIterator(ri);
api.TessPageIteratorBegin(pi);

do {
Pointer ptr = api.TessResultIteratorGetUTF8Text(ri, pageIteratorLevel);
String text = ptr.getString(0);
api.TessDeleteText(ptr);
float confidence = api.TessResultIteratorConfidence(ri, pageIteratorLevel);
IntBuffer leftB = IntBuffer.allocate(1);
IntBuffer topB = IntBuffer.allocate(1);
IntBuffer rightB = IntBuffer.allocate(1);
IntBuffer bottomB = IntBuffer.allocate(1);
api.TessPageIteratorBoundingBox(pi, pageIteratorLevel, leftB, topB, rightB, bottomB);
int left = leftB.get();
int top = topB.get();
int right = rightB.get();
int bottom = bottomB.get();
Word word = new Word(text, confidence, new Rectangle(left, top, right - left, bottom - top));
words.add(word);
} while (api.TessPageIteratorNext(pi, pageIteratorLevel) == TRUE);

return words;
} catch (Exception e) {
return words;
} finally {
this.dispose();
}
}
}

/**
* Test of getSegmentedRegions method, of class Tesseract.
*/
@Test
public void testGetRegions() throws Exception {
public void testGetSegmentedRegions() throws Exception {
logger.info("getRegions at given TessPageIteratorLevel");
File imageFile = new File(testResourcesDataPath, "eurotext.png");
BufferedImage bi = ImageIO.read(imageFile);
Expand Down

0 comments on commit ba52362

Please sign in to comment.