motion-ocr 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +16 -1
- data/Rakefile +1 -2
- data/lib/motion-ocr/ocr.rb +19 -0
- data/lib/motion-ocr/version.rb +1 -1
- data/spec/motion_ocr_spec.rb +52 -6
- data/spec/support/deu.traineddata +0 -0
- data/spec/support/phototest_german.gif +0 -0
- data/vendor/MotionOCR/MotionOCR/MotionOCR.h +1 -0
- data/vendor/MotionOCR/MotionOCR/MotionOCR.mm +30 -26
- metadata +13 -10
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a274f9c83916a0294a98708646178a2a6ca2964d
|
4
|
+
data.tar.gz: 029fbbfd7614ba1d36f8dc2fcf7ec3c90f55f21a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: fb68853812fcef42a7d352676e32da6526c03dd3a25729c33df4c5c95877e9dcd3cb378b3357080e21cc6e6bb3cf59309a34a7ee25f88d4100c844b15cd0b581
|
7
|
+
data.tar.gz: d70e53de63da7bee37206ddf18d93698e5e05c275835292163c209a2a11ad41a07ad6bdfdb6b49631cf908d5d48476f5806bd99bc540d447c3615f9e9674a63a
|
data/README.md
CHANGED
@@ -10,13 +10,28 @@ First, install the gem:
|
|
10
10
|
|
11
11
|
Then, reference it in your RubyMotion project Rakefile:
|
12
12
|
|
13
|
+
# -*- coding: utf-8 -*-
|
14
|
+
$:.unshift("/Library/RubyMotion/lib")
|
15
|
+
require 'motion/project/template/ios'
|
16
|
+
|
13
17
|
require 'motion-ocr'
|
14
18
|
|
15
19
|
And that's it. Build your project and MotionOCR will be ready for action.
|
16
20
|
|
17
21
|
### Use
|
18
22
|
|
19
|
-
ocr =
|
23
|
+
ocr = Motion::OCR.new
|
20
24
|
image_with_text = UIImage.imageNamed('phototest.gif').CGImage
|
21
25
|
|
22
26
|
ocr.scan(image_with_text) # returns a String containing the detected text in the image
|
27
|
+
|
28
|
+
### Options
|
29
|
+
|
30
|
+
You use your own Tesseract language file
|
31
|
+
(available at https://code.google.com/p/tesseract-ocr/downloads/list).
|
32
|
+
|
33
|
+
Put the language file (e.g., `spa.traineddata`) into your app's
|
34
|
+
`ressources/tessdata` directory.
|
35
|
+
Then pass the language to MotionOCR:
|
36
|
+
|
37
|
+
ocr = Motion::OCR.new language: 'spa'
|
data/Rakefile
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
require "bundler/gem_tasks"
|
3
3
|
$:.unshift("/Library/RubyMotion/lib")
|
4
|
-
require 'motion/project'
|
4
|
+
require 'motion/project/template/ios'
|
5
5
|
|
6
6
|
Bundler.setup
|
7
7
|
Bundler.require
|
@@ -14,4 +14,3 @@ Motion::Project::App.setup do |app|
|
|
14
14
|
app.deployment_target = '5.0'
|
15
15
|
|
16
16
|
end
|
17
|
-
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Motion
|
2
|
+
class OCR
|
3
|
+
def initialize(options={})
|
4
|
+
options[:language] ||= "eng"
|
5
|
+
@motion_ocr = MotionOCR.alloc.initWithOptions stringify(options)
|
6
|
+
end
|
7
|
+
|
8
|
+
def scan(image)
|
9
|
+
@motion_ocr.scan image
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def stringify(hash)
|
15
|
+
stringified = hash.flatten.map(&:to_s)
|
16
|
+
Hash[*stringified]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/motion-ocr/version.rb
CHANGED
data/spec/motion_ocr_spec.rb
CHANGED
@@ -1,13 +1,45 @@
|
|
1
|
-
|
1
|
+
# encoding: UTF-8
|
2
2
|
|
3
|
-
|
4
|
-
@ocr = MotionOCR.new
|
5
|
-
end
|
3
|
+
describe Motion::OCR do
|
6
4
|
|
7
5
|
it "can detect the text in the sample image" do
|
8
|
-
|
6
|
+
ocr = Motion::OCR.new
|
7
|
+
|
8
|
+
ocr.scan(image 'phototest').should == <<-EOF.gsub(/^\W\W+/, '')
|
9
|
+
This is a lot of 12 point text to test the
|
10
|
+
ocr code and see if it works on all types
|
11
|
+
of file format.
|
12
|
+
The quick brown dog jumped over the
|
13
|
+
lazy fox. The quick brown dog jumped
|
14
|
+
over the lazy fox. The quick brown dog
|
15
|
+
jumped over the lazy fox. The quick
|
16
|
+
brown dog jumped over the lazy fox.
|
17
|
+
|
18
|
+
EOF
|
19
|
+
end
|
20
|
+
|
21
|
+
it "accepts the language as parameter" do
|
22
|
+
install_language :deu
|
23
|
+
ocr = Motion::OCR.new language: "deu"
|
24
|
+
|
25
|
+
ocr.scan(image 'phototest_german').should == <<-EOF.gsub(/^\W\W+/, '')
|
26
|
+
Weit hinten, hinter den Wortbergen,
|
27
|
+
fern der Länder Vokalien und Konsonantien
|
28
|
+
leben die Blindtexte.
|
29
|
+
Abgeschieden wohnen sie in Buchstabhausen
|
30
|
+
an der Küste des Semantik,
|
31
|
+
eines großen Sprachozeans.
|
32
|
+
Ein kleines Bächlein namens Duden
|
33
|
+
fließt durch ihren Ort
|
34
|
+
und versorgt sie mit den nötigen Regelialien.
|
35
|
+
|
36
|
+
EOF
|
37
|
+
end
|
9
38
|
|
10
|
-
|
39
|
+
it "still works with the old constructor" do
|
40
|
+
ocr = MotionOCR.new
|
41
|
+
|
42
|
+
ocr.scan(image 'phototest').should == <<-EOF.gsub(/^\W\W+/, '')
|
11
43
|
This is a lot of 12 point text to test the
|
12
44
|
ocr code and see if it works on all types
|
13
45
|
of file format.
|
@@ -20,4 +52,18 @@ describe MotionOCR do
|
|
20
52
|
EOF
|
21
53
|
end
|
22
54
|
|
55
|
+
def image(image_name)
|
56
|
+
UIImage.imageWithContentsOfFile(file("#{image_name}.gif")).CGImage
|
57
|
+
end
|
58
|
+
|
59
|
+
def file(file_name)
|
60
|
+
File.expand_path("../support/#{file_name}", __FILE__)
|
61
|
+
end
|
62
|
+
|
63
|
+
def install_language(language)
|
64
|
+
documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, true)
|
65
|
+
targetPath = "#{documentPaths.first}/tessdata/#{language}.traineddata"
|
66
|
+
fileManager = NSFileManager.defaultManager
|
67
|
+
fileManager.copyItemAtPath file("#{language}.traineddata"), toPath: targetPath, error: nil
|
68
|
+
end
|
23
69
|
end
|
Binary file
|
Binary file
|
@@ -16,32 +16,36 @@
|
|
16
16
|
@implementation MotionOCR
|
17
17
|
|
18
18
|
- (id)init {
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
19
|
+
return [self initWithOptions:@{}];
|
20
|
+
}
|
21
|
+
|
22
|
+
- (id)initWithOptions:(NSDictionary*)options {
|
23
|
+
self = [super init];
|
24
|
+
|
25
|
+
if (self) {
|
26
|
+
// Set up the tessdata path. This is included in the application bundle
|
27
|
+
// but is copied to the Documents directory on the first run.
|
28
|
+
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
|
29
|
+
NSString *documentPath = ([documentPaths count] > 0) ? [documentPaths objectAtIndex:0] : nil;
|
30
|
+
|
31
|
+
NSString *dataPath = [documentPath stringByAppendingPathComponent:@"tessdata"];
|
32
|
+
NSFileManager *fileManager = [NSFileManager defaultManager];
|
33
|
+
// If the expected store doesn't exist, copy the default store.
|
34
|
+
if (![fileManager fileExistsAtPath:dataPath]) {
|
35
|
+
// get the path to the app bundle (with the tessdata dir)
|
36
|
+
NSString *bundlePath = [[NSBundle mainBundle] bundlePath];
|
37
|
+
NSString *tessdataPath = [bundlePath stringByAppendingPathComponent:@"tessdata"];
|
38
|
+
if (tessdataPath) {
|
39
|
+
[fileManager copyItemAtPath:tessdataPath toPath:dataPath error:NULL];
|
40
|
+
}
|
41
|
+
}
|
42
|
+
|
43
|
+
setenv("TESSDATA_PREFIX", [[documentPath stringByAppendingString:@"/"] UTF8String], 1);
|
44
|
+
|
45
|
+
tesseract = new tesseract::TessBaseAPI();
|
46
|
+
tesseract->Init([dataPath cStringUsingEncoding:NSUTF8StringEncoding], [options[@"language"] UTF8String]);
|
47
|
+
}
|
48
|
+
return self;
|
45
49
|
}
|
46
50
|
|
47
51
|
- (void)dealloc {
|
metadata
CHANGED
@@ -1,15 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: motion-ocr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
5
|
-
prerelease:
|
4
|
+
version: 0.1.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Fernando Espinosa Jiménez
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2014-10-09 00:00:00.000000000 Z
|
13
12
|
dependencies: []
|
14
13
|
description: Allows to perform text detection inside images in an easy way.
|
15
14
|
email:
|
@@ -18,7 +17,7 @@ executables: []
|
|
18
17
|
extensions: []
|
19
18
|
extra_rdoc_files: []
|
20
19
|
files:
|
21
|
-
- .gitignore
|
20
|
+
- ".gitignore"
|
22
21
|
- Gemfile
|
23
22
|
- Gemfile.lock
|
24
23
|
- LICENSE
|
@@ -26,12 +25,15 @@ files:
|
|
26
25
|
- Rakefile
|
27
26
|
- app/app_delegate.rb
|
28
27
|
- lib/motion-ocr.rb
|
28
|
+
- lib/motion-ocr/ocr.rb
|
29
29
|
- lib/motion-ocr/version.rb
|
30
30
|
- motion-ocr.gemspec
|
31
31
|
- resources/tessdata/configs/nodict
|
32
32
|
- resources/tessdata/eng.traineddata
|
33
33
|
- spec/motion_ocr_spec.rb
|
34
|
+
- spec/support/deu.traineddata
|
34
35
|
- spec/support/phototest.gif
|
36
|
+
- spec/support/phototest_german.gif
|
35
37
|
- vendor/MotionOCR/MotionOCR.bridgesupport
|
36
38
|
- vendor/MotionOCR/MotionOCR.xcodeproj/project.pbxproj
|
37
39
|
- vendor/MotionOCR/MotionOCR.xcodeproj/project.xcworkspace/contents.xcworkspacedata
|
@@ -86,28 +88,29 @@ files:
|
|
86
88
|
- vendor/MotionOCR/MotionOCR/build_dependencies/dependencies/lib/libtesseract_all.a
|
87
89
|
homepage: https://github.com/ferdev/motion-ocr
|
88
90
|
licenses: []
|
91
|
+
metadata: {}
|
89
92
|
post_install_message:
|
90
93
|
rdoc_options: []
|
91
94
|
require_paths:
|
92
95
|
- lib
|
93
96
|
required_ruby_version: !ruby/object:Gem::Requirement
|
94
|
-
none: false
|
95
97
|
requirements:
|
96
|
-
- -
|
98
|
+
- - ">="
|
97
99
|
- !ruby/object:Gem::Version
|
98
100
|
version: '0'
|
99
101
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
100
|
-
none: false
|
101
102
|
requirements:
|
102
|
-
- -
|
103
|
+
- - ">="
|
103
104
|
- !ruby/object:Gem::Version
|
104
105
|
version: '0'
|
105
106
|
requirements: []
|
106
107
|
rubyforge_project:
|
107
|
-
rubygems_version:
|
108
|
+
rubygems_version: 2.2.2
|
108
109
|
signing_key:
|
109
|
-
specification_version:
|
110
|
+
specification_version: 4
|
110
111
|
summary: A RubyMotion wrapper for the OCR engine, Tesseract
|
111
112
|
test_files:
|
112
113
|
- spec/motion_ocr_spec.rb
|
114
|
+
- spec/support/deu.traineddata
|
113
115
|
- spec/support/phototest.gif
|
116
|
+
- spec/support/phototest_german.gif
|