- Technology overview
PenReader handwriting recognition technology started as early as 1968, when a group of Russian scientists established the idea of handwritten text machine recognition and worked out the fundamental Zenkin-Petrov’s recognition algorithm. This algorithm underlies the first and most primitive handwriting recognition instrument Optical Correcting Recognition Universal System (OCRUS). This tool was used to recognize ancient Tibetan text automatically and convert it into the digital format for further detailed scientific analysis.
While a user is writing with a fingertip on a touchscreen surface, PenReader is doing a great job – it collects and analyzes coordinates of the finger movements, then converting the data into print characters. Sound easy, doesn't it? But in fact this work is unbelievably resource-consuming. PenReader calculates about 5630 execution paths to get the most precise coordinates and performs 66852 statements to convert these coordinates into print-like text.
Moreover PenReader has its own specific set of recognition rules for 42 languages and this list is constantly is being populated.
PenReader history
Optical Character Recognition Universal System (OCRUS) created
1968 1984 1996 1997 1999 2001 2004 2007 2011 2014
Zenkin-Petrov’s Algorithm of handwritten recognition Optical Character Recognition Universal System (OCRUS) created PenReader development started at Paragon Software The first version was released for Apple Newton PenReader was ported on Windows Mobile PenReader engine was able to recognize 28 languages Orthographical correction of recognition results was added. Added cursive text recognition to PenReader for Windows Mobile devices. PenReader became available for Android and iOS devices. PenReader is coming for Tizen multi-device platform. PenReader engine now supports In-Vehicle
Infotainment systems integration.
- Albanian
- Arabic
- Armenian
- Belarusian
- Bulgarian
- Catalan
- Chinese
- Croatian
- Czech
- Danish
- Dutch
- English
- Esperanto
- Estonian
- Finnish
- French
- Georgian
- German
- Greek
- Hebrew
- Hungarian
- Icelandic
- Italian
- Japanese
- Kazakh
- Korean
- Latvian
- Lithuanian
- Maltese
- Norwegian
- Polish
- Portuguese
- Romanian
- Russian
- Slovak
- Slovenian
- Spanish
- Swedish
- Thai
- Turkish
- Ukrainian
- Welsh
- Online API
PenReader SDK
PenReader Handwriting Recognition SDK is a set of necessary core engine APIs and instructions for interaction with the recognition engine, and includes:
- Core PenReader engine
- API for C language
- Set of examples
Online API
In order to receive access to the PenReader Online API, please contact our managers at penreader_sdk@penreader.com to receive login and password information for the online version of the SDK once it is available. You will receive a set of http commands to send strokes and receive recognition results, which will allow you to evaluate the quality of PenReader’s handwriting recognition.
1. Request format
HTTP POST request is sent to http://engine.penreader.com/api, its body should be a JSON of the following format:
{"language":"english", "mode":"letter", "points":[[[0,0], [100,100]],[[0,0]]], "auth_token":"your_hex_token"}
language* - language name, case insensitive
mode - recognition mode, may have one of the following values:
letter - letter-by-letter recognition
separated - separate characters recognition
solid** - joint-up recognition
points* - an array of strokes. Each stroke is an array of points. A point is represented by a two-element array of coordinates [x, y].
auth_token* -a key containing 32-character hex-sequence
* - is mandatory for each request
** - used as a default value
2. Response format
In case a request has been successfully processed, the service sends status 200 OK along with a recognized phrase in JSON format:
{"data":"recognized phrase"}
In the case of an error response is of the following format:
{"error":"error message"}
3. api usage example
#!/bin/ruby
require 'json'
require 'net/http'language = 'english'
token = '0123456789abcdef0123456789abcdef' # this is like login/password pair
host = 'engine.penreader.com'
port = 80# parsing the file with data. it contains points coordinates and initial phrase, separated by \t
line = File.read('./data.txt')
points, char_codes = line.split("\t").map {|json| JSON.parse(json)}
should_be = char_codes.map{|code| code.chr(Encoding::UTF_8)}.join# making http post request
start_time = Time.now
http = Net::HTTP.new(host, port)
request = Net::HTTP::Post.new('/api')
request.body = {:language => language, :points => points, :auth_token => token}.to_json
raw_response = http.start {|h| h.request(request)}
response = JSON.parse raw_response.body # response body is also in json format
recognition_time = (Time.now.to_f - start_time.to_f).round(2)text = response['data']
puts "should be: #{should_be}"
puts "response : #{text}"
# sometimes case may differ
if text.downcase == should_be.downcase
puts "Success!!"
else
puts "Test failed!!"
end
puts "Recognition time: #{recognition_time}"The following archive contains a file with input data to be used in the example: penreader_sdk.zip
- Demo Recognition
Язык:
Режим:
Таймаут:Text field:
- Contacts
Contact us
If you would like to know more about PenReader SDK or have any cooperation offers, please mail us: technology@penreader.com
Address:
Paragon Software GmbH,
Heinrich-von-Stephan-Str. 5c
79100 Freiburg, Germany
9:00 a.m. - 5:00 p.m.
Monday - Friday (except holidays)Sales:
Tel: +49-(0)761-59018-201
Corporate Sales:
Tel: +49-(0)761-59018-202
Fax: +49-(0)761-59018-130