プログラミング
光学文字認識 (OCR) は、印刷されたテキストをデジタル表現に変換するプロセスです。印刷された書籍のデジタル化や領収書の電子記録の作成から、ナンバー プレートの認識、さらには画像ベースのキャプチャの解読まで、さまざまな実用的な用途があります。
安心 2016/01/15
Tesseract は OCR を実現できるオープンソースプロジェクトです。このプロジェクトは *Nix システム、Mac システム、Windows システムで実行できますが、ライブラリを使用することで PHP プロジェクトでも使用できます。このチュートリアルの目的は、その使用方法を教えることです。
インストール
準備
物事をシンプルかつ一貫性を保つために、アプリケーションを実行するために仮想マシン (この記事では Vagrant を使用します) を使用します。これには、PHP と Nginx のインストールが含まれます。プロセスを個別に説明します。既存の Debian ベースのシステムに自分で Tesseract をインストールする場合は、次のセクションをスキップするか、他の *nix、Mac、または Windows システムでのインストール手順について README を確認してください。このチュートリアルに従うように Vagrant を設定するには、次の手順を実行します。または、単に Github からコードを取得することもできます。
次のコマンドを入力して Homestead Enhanced Vagrant をダウンロードし、orc という名前のフォルダーに構成します: git clone https://github.com/Swader/homestead_improved ocr
sites: - map: homestead.app to: /home/vagrant/Code/Project/public
を次のように変更します:
sites: - map: homestead.app to: /home/vagrant/Code/public
hosts ファイルにも追加
192.168.10.10 homestead.app
Tesseract をインストールします
次のステップは Tesseract をインストールすることです
Homestead 改良版は debian を使用しているため、vagrant ssh を使用して仮想マシンにログインした後、apt-get を使用してインストールできます:
sudo apt-get install tesseract-ocr
インストールのテストとカスタマイズ
PHP ラッパーを使用しますが、その前にコマンド ラインから Tesseract をテストできます。
まずこの画像sign.pngを保存します
仮想マシンで次のコマンドを実行して画像からテキストを読み取ります
tesseract sign.png out
次に、sign2.jpg を試してください。
tesseract sign2.jpg out
Tesseract が文字列を正しく読み取るためには、いくつかの新しい言語ファイル (この場合はドイツ語) をインストールする必要があります。
利用可能な言語ファイルの包括的なリストがここにありますが、必要なものだけをダウンロードしましょう:
wget https://tesseract-ocr.googlecode.com/files/tesseract-ocr-3.02.deu.tar.gz
tar zxvf tesseract-ocr-3.02.deu.tar.gz
/usr/share/tesseract-ocr/tessdata
cp deu-frak.traineddata /usr/share/tesseract-ocr/tessdatacp deu.traineddata /usr/share/tesseract-ocr/tessdata
tesseract sign2.jpg out -l deu
今回のテキストは Einbahnstraße (正しい) である必要があります。
上記のプロセスを繰り返すことで、任意の言語を使用することができます。
アプリケーションの設定
PHP で Tesseract を使用するためにこのライブラリを使用します。
シンプルな Web アプリケーションを構築します。ユーザーは画像をアップロードし、OCR 処理の結果を表示します。これを実現するために、Silex マイクロフレームワークを使用します。アプリ自体はシンプルなので、慣れていなくても心配する必要はありません。
このチュートリアルのコードはすべて Github で入手できることに注意してください。
最初のステップは、Composer を使用して依存ファイルをインストールすることです:
composer require silex/silex twig/twig thiagoalessio/tesseract_ocr:dev-master
- public- uploads- views
<html> <head> <title>OCR</title> </head> <body> <form action="" method="post" enctype="multipart/form-data"> <input type="file" name="upload"> <input type="submit"> </form> </body></html>
<html> <head> <title>OCR</title> </head> <body> <h2>Results</h2> <textarea cols="50" rows="10">{{ text }}</textarea> <hr> <a href="/">← Go back</a> </body></html>
<?php require __DIR__.'/../vendor/autoload.php'; use Symfony\Component\HttpFoundation\Request; $app = new Silex\Application(); $app->register(new Silex\Provider\TwigServiceProvider(), [ 'twig.path' => __DIR__.'/../views',]);$app['debug'] = true; $app->get('/', function() use ($app) { return $app['twig']->render('index.twig');}); $app->post('/', function(Request $request) use ($app) { // TODO}); $app->run();
http://homestead.app/
// Grab the uploaded file$file = $request->files->get('upload'); // Extract some information about the uploaded file$info = new SplFileInfo($file->getClientOriginalName());// Create a quasi-random filename$filename = sprintf('%d.%s', time(), $info->getExtension());// Copy the file$file->move(__DIR__.'/../uploads', $filename);
// Instantiate the Tessearct library$tesseract = new TesseractOCR(__DIR__ . '/../uploads/' . $filename);
// Perform OCR on the uploaded image$text = $tesseract->recognize();
return $app['twig']->render( 'results.twig', [ 'text' => $text, ]);
実践的な例
OCR のより実践的な例を見てみましょう。この例では、画像内でフォーマットされた電話番号を検索しようとしています。
看看下面一幅图,上传到你的应用:
结果应该如下:
:ii‘iCustomer Service HelplinesBritish Airways Helpline09040 490 541
它没有挑出正文文本,这是我们能料到的,因为图片质量太差。虽然识别了号码但是也有一些“噪声”。
为了提取相关信息,有如下几件事我们可以做。
你可以让Tesseract 把它的结果限制在一定的字符集内,所以我们告诉它只返回数字型的内容代码如下:
$tesseract->setWhitelist(range(0,9));
但这样有个问题。它常常把非数字字符解释成数字而非忽略它们。比如“Bob”可能被解释称数字“808”。
所以我们采用两步处理。
第一步,我们可以用一个基本的正则表达式。可以用 谷歌电话库 来确定一个数字串是否是合法电话号码。
备注:我已在Sitepoint 写过关于 谷歌电话库的内容 。
让我们给谷歌电话库添加一个PHP 端口,修改composer.json,添加:
"giggsey/libphonenumber-for-php": "~7.0"
别忘了升级:
composer update
现在我们可以写一个函数,输入为一个字符串,尝试提取一个合法的电话号码
/** * Parse a string, trying to find a valid telephone number. As soon as it finds a * valid number, it'll return it in E1624 format. If it can't find any, it'll * simply return NULL. * * @param string $text The string to parse * @param string $country_code The two digit country code to use as a "hint" * @return string | NULL */function findPhoneNumber($text, $country_code = 'GB') { // Get an instance of Google's libphonenumber $phoneUtil = \libphonenumber\PhoneNumberUtil::getInstance(); // Use a simple regular expression to try and find candidate phone numbers preg_match_all('/(\+\d+)?\s*(\(\d+\))?([\s-]?\d+)+/', $text, $matches); // Iterate through the matches foreach ($matches as $match) { foreach ($match as $value) { try { // Attempt to parse the number $number = $phoneUtil->parse(trim($value), $country_code); // Just because we parsed it successfully, doesn't make it vald - so check it if ($phoneUtil->isValidNumber($number)) { // We've found a telephone number. Format using E.164, and exit return $phoneUtil->format($number, \libphonenumber\PhoneNumberFormat::E164); } } catch (\libphonenumber\NumberParseException $e) { // Ignore silently; getting here simply means we found something that isn't a phone number } } } return null;}
希望注释能解释这个函数在干什么。注意如果这个库没能从字符串中解析出一个合法的电话号码它会抛出一个异常。这不是什么问题;我们直接忽略它并继续下一个候选字符。
如果我们找到一个电话号码,我们以E.164的形式返回它。这提供了一个国际化的号码,我们可以用来打电话或者发送SMS。
现在我们可以如下使用:
$text = $tesseract->recognize();$number = findPhoneNumber($text, 'GB');
我们需要给谷歌电话库提供一个提示来说明这个号码是哪个国家的。你也可以改成你自己的国家。
我们把所有的这些打包在一个新的路由中:
$app->post('/identify-telephone-number', function(Request $request) use ($app) { // Grab the uploaded file $file = $request->files->get('upload'); // Extract some information about the uploaded file $info = new SplFileInfo($file->getClientOriginalName()); // Create a quasi-random filename $filename = sprintf('%d.%s', time(), $info->getExtension()); // Copy the file $file->move(__DIR__.'/../uploads', $filename); // Instantiate the Tessearct library $tesseract = new TesseractOCR(__DIR__ . '/../uploads/' . $filename); // Perform OCR on the uploaded image $text = $tesseract->recognize(); $number = findPhoneNumber($text, 'GB'); return $app->json( [ 'number' => $number, ] );});
我们现在有简单的API的基础—-也就是JSON响应-—我们可以用来作为一个简单的移动应用的后端,这款应用可以用来从一幅图中添加联系人,打电话。
总结
OCR有许多应用——并且很容易整合进你的应用(超过你的预期)。本文中,我们安装了开源OCR包;并使用一个包装器库,把它整合进一个非常简单的PHP应用。我们只是触及到了所有可能性的表面,希望这能给你一些想法,帮你想想怎么在你自己的应用中使用OCR。
来自: http://www.codeceo.com/article/php-ocr-tesseract-get-text.html