Why Tesseract OCR library (iOS) cannot recognize text at all?
Make sure you have the latest tessdata file from Google code
http://code.google.com/p/tesseract-ocr/downloads/list
This will provide you with a list of tessdata files that you need to download and include in your app if you haven't already. In your case you will need tesseract-ocr-3.02.eng.tar.gz as you are looking for the English language files
The following article will show you where you need to install it. I read through this tutorial when I built my first Tesseract project and found it really useful
http://lois.di-qual.net/blog/install-and-use-tesseract-on-ios-with-tesseract-ios/
How to recognise the accurate text from an image using Tesseract OCR Library in iOS?
For my case Tesseract Library was not accurate most of the time. instead Abby was kind of ok. but abby is not offline
Abby Stackoverflow Channel
Linker errors when using tesseract
I have used below link for my image processing task that may help you
https://github.com/gali8/Tesseract-OCR-iOS
And follow these steps. Why Tesseract OCR library (iOS) cannot recognize text at all?
iPhone OCR doesn't recognize all the captured images text, But can recognize the predefined Text images
Tesseract library is open source library. I don't think it is that much accurate.OCR gives best results for image more than 150 px resolution with black and white image .The image which you are capture with the camera of iPad or iPhone is saved with 72px that tesseract cannot give best results.If you are more interested then there are some paid libraries with good accuracy you can try out some :here
iOS Tesseract: bad results
There's nothing wrong in the way your taking the pictures from your iPad per se. But you just can't throw in such a complex image and expect Tesseract to magically determine which text to extract. Take a closer look to the image and you'll notice it has no uniform lightning, it's extremely noisy so it may not be the best sample to start playing with.
In such scenarios it is mandatory to pre process the image in order to provide the tesseract library with something simpler to recognise.
Below find a very naive pre processing example that uses OpenCV (http://www.opencv.org), a popular image processing framework. It should give you and idea to get you started.
#import <TesseractOCR/TesseractOCR.h>
#import <opencv2/opencv.hpp>
#import "UIImage+OpenCV.h"
using namespace cv;
...
// load source image
UIImage *img = [UIImage imageNamed:@"tesseract.jpg"];
Mat mat = [img CVMat];
Mat hsv;
// convert to HSV (better than RGB for this task)
cvtColor(mat, hsv, CV_RGB2HSV_FULL);
// blur is slightly to reduce noise impact
const int blurRadius = img.size.width / 250;
blur(hsv, hsv, cv::Size(blurRadius, blurRadius));
// in range = extract pixels within a specified range
// here we work only on the V channel extracting pixels with 0 < V < 120
Mat inranged;
inRange(hsv, cv::Scalar(0, 0, 0), cv::Scalar(255, 255, 120), inranged);
Mat inrangedforcontours;
inranged.copyTo(inrangedforcontours); // findContours alters src mat
// now find contours to find where characters are approximately located
vector<vector<cv::Point> > contours;
vector<Vec4i> hierarchy;
findContours(inrangedforcontours, contours, hierarchy, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cv::Point(0, 0));
int minX = INT_MAX;
int minY = INT_MAX;
int maxX = 0;
int maxY = 0;
// find all contours that match expected character size
for (size_t i = 0; i < contours.size(); i++)
{
cv::Rect brect = cv::boundingRect(contours[i]);
float ratio = (float)brect.height / brect.width;
if (brect.height > 250 && ratio > 1.2 && ratio < 2.0)
{
minX = MIN(minX, brect.x);
minY = MIN(minY, brect.y);
maxX = MAX(maxX, brect.x + brect.width);
maxY = MAX(maxY, brect.y + brect.height);
}
}
// Now we know where our characters are located
// extract relevant part of the image adding a margin that enlarges area
const int margin = img.size.width / 50;
Mat roi = inranged(cv::Rect(minX - margin, minY - margin, maxX - minX + 2 * margin, maxY - minY + 2 * margin));
cvtColor(roi, roi, CV_GRAY2BGRA);
img = [UIImage imageWithCVMat:roi];
Tesseract *t = [[Tesseract alloc] initWithLanguage:@"eng"];
[t setVariableValue:@"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" forKey:@"tessedit_char_whitelist"];
[t setImage:img];
[t recognize];
NSString *recognizedText = [[t recognizedText] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
if ([recognizedText isEqualToString:@"1234567890"])
NSLog(@"Yeah!");
else
NSLog(@"Epic fail...");
Notes
- The
UIImage+OpenCV
category can be found here. If you're under ARC check this. - Take a look at this to get you started with OpenCV in Xcode. Note that OpenCV is a C++ framework which can't be imported in plain C (or Objective-C) source files. The easiest workaround is to rename your view controller from .m to .mm (Objective-C++) and reimport it in your project.
Related Topics
How to Convert .Dae to .Scn Files in Scenekit
Which Tasks Are More Suitable to Nsoperation Than Gcd
How to Make Sure API Requests Come from Our Mobile (Ios/Android) App
Profile Doesn't Match the Entitlements File's Value for the Application-Identifier Entitlement
App Crashes Only on Testflight Build
Swift - iOS - Dates and Times in Different Format
How to Loop Over Struct Properties in Swift
No Round Rect Button in Xcode 5
Warning: Attempt to Present Viewcontroller Whose View Is Not in the Window Hierarchy
How to Track User Location in Background
How to Get the Custom Overlay for Uiimagepicker Camera to Be Full Screen in iOS 7
Using Global Variables in Objective-C