成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【譯】PHP OCR實戰(zhàn):用Tesseract從圖像中讀取文字

Miracle / 1905人閱讀

摘要:實戰(zhàn)用從圖像中讀取文字即光學字符辨識是把打印文本轉(zhuǎn)換成一個數(shù)字表示的過程??梢杂霉雀桦娫拵靵泶_定一個數(shù)字串是否是合法電話號碼?,F(xiàn)在我們可以如下使用我們需要給谷歌電話庫提供一個提示來說明這個號碼是哪個國家的。

PHP OCR實戰(zhàn):用Tesseract從圖像中讀取文字

Optical Character Recognition (OCR)即光學字符辨識是把打印文本轉(zhuǎn)換成一個數(shù)字表示的過程。它有各種各樣的實際應(yīng)用--從數(shù)字化印刷書籍、創(chuàng)建收據(jù)的電子記錄,到車牌識別甚至破解基于圖像的驗證碼。

Tesseract是一個能實現(xiàn)OCR開源項目。你能在*Nix系統(tǒng),Mac系統(tǒng)和Windows系統(tǒng)上跑這個項目,但是使用一個庫的話,我們就能在php項目中使用它了。本教程的目的是教你如何使用。

安裝 準備

為了讓事情變得簡單和一致的, 我們將使用虛擬機(本文使用Vagrant)來運行應(yīng)用程序,這會涉及到安裝PHP和Nginx,我們將安裝Tesseract來分別演示過程。如果你想自己基于現(xiàn)有Debian-based系統(tǒng)安裝Tesseract,你可以跳過下一部分—或者查看the README來獲得在其他*nix上,Mac系統(tǒng)或者Windows的安裝指導.

配置Vagrant

為了配置Vagrant以跟上本教程,完成如下步驟?;蛘吣阋部梢院唵蔚膹腉ithub獲得代碼。

輸入以下命令來下載Homestead Improved Vagrant配置到一個文件夾 ocr:

git clone https://github.com/Swader/homestead_improved ocr

把Nginx配置文件Homestead.yml由

 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 Improved 使用debian,我們可以在使用vagrant ssh登陸虛擬機后使用apt-get 來安裝它,簡單如下:

sudo apt-get install tesseract-ocr

正如上文提到的,此處有其他的操作系統(tǒng)對應(yīng)教程。

測試并定制安裝

我們將使用PHP包裝,但是之前我們可以在命令行測試Tesseract。
首先保存這個圖片sign.png (圖片由剪紙藝術(shù)熊貓?zhí)峁?

在虛擬機中,執(zhí)行如下命令來從圖片中讀取文字

tesseract sign.png out

這將在當前文件夾創(chuàng)建一個文件:out.txt里面應(yīng)該有單詞:CAUTION
現(xiàn)在嘗試sign2.jpg,連接如下:
https://s3.amazonaws.com/f.cl...

tesseract sign2.jpg out

這次產(chǎn)生單詞Einbahnstral’ie。很接近但不正確—雖然圖像中的文字相當清晰,它沒能識別?。
為了獲使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/tessdata
cp deu.traineddata /usr/share/tesseract-ocr/tessdata

現(xiàn)在我們再次執(zhí)行原來的命令但是要用 –l

tesseract sign2.jpg out -l deu

“deu” 是德語的 ISO 639-3碼.
這次,文字應(yīng)該是Einbahnstra?e(正確的)。
可以通過重復上述過程來使用任意語言。

配置應(yīng)用程序

我們將使用這個庫來用PHP使用Tesseract。
我們將建立一個極簡的web應(yīng)用:用戶上傳圖片,并查看OCR處理結(jié)果。我們將使用Silex microframework 來實現(xiàn)。不要擔心你不熟悉它,這個應(yīng)用本身很簡單。
記住這篇教程的所有代碼都能在Github上獲得。
第一步是用Composer來安裝依賴文件:

composer require silex/silex twig/twig thiagoalessio/tesseract_ocr:dev-master

然后建立三個文件夾:

- public
- uploads
- views

我們需要上傳表單(viewsindex.twig):


  
    OCR
  
  
    

需要一個結(jié)果展示頁面(viewsresults.twig)::


  
    OCR
  
  
    

Results


← Go back

現(xiàn)在建立skeleton Silex app (publicindex.php):

register(new SilexProviderTwigServiceProvider(), [
  "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();

如果你在瀏覽器訪問這個應(yīng)用,你應(yīng)該能看到一個文件上傳表單。如果你在使用
Homestead Improved Vagrant,你可以通過如下鏈接訪問該應(yīng)用。

http://homestead.app/

下一步是實現(xiàn)文件上傳。Silex使得這項工作非常簡單;
$request包含一個files組件,我們可以通過它來獲得任意上傳的文件,代碼:

// 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); 

如你所見,我們產(chǎn)生隨機文件名來減少文件名沖突—但在本應(yīng)用中,我們怎么命名文件是不重要的。
一旦我們在本地有一份文件拷貝,我們就可以產(chǎn)生一個Tessearct庫的實例,然后進行分析:

// Instantiate the Tessearct library
$tesseract = new TesseractOCR(__DIR__ . "/../uploads/" . $filename);

在圖像上實現(xiàn)OCR相當簡單,我們只需調(diào)用方法recognize()。

// Perform OCR on the uploaded image
$text = $tesseract->recognize();

最后我們把結(jié)果展示到結(jié)果頁面:

return $app["twig"]->render(
    "results.twig",
    [
        "text"  =>  $text,
    ]
);

在一些圖片上嘗試,看看它效果怎樣。如果你有困難,可以參考

一個實際的例子

讓我們來看OCR一個更實用的例子。在本例中,我們嘗試在圖像中找到一個格式化的電話號碼。
看看下面一幅圖,上傳到你的應(yīng)用:

結(jié)果應(yīng)該如下:

:ii‘i
Customer Service Helplines

British Airways Helpline
09040 490 541

它沒有挑出正文文本,這是我們能料到的,因為圖片質(zhì)量太差。雖然識別了號碼但是也有一些“噪聲”。
為了提取相關(guān)信息,有如下幾件事我們可以做。
你可以讓Tesseract 把它的結(jié)果限制在一定的字符集內(nèi),所以我們告訴它只返回數(shù)字型的內(nèi)容代碼如下:

$tesseract->setWhitelist(range(0,9));

但這樣有個問題。它常常把非數(shù)字字符解釋成數(shù)字而非忽略它們。比如“Bob”可能被解釋稱數(shù)字“808”。
所以我們采用兩步處理。

嘗試提取可能是電話號碼的數(shù)字串。

用一個庫輪流評估每一個候選字符,一旦找到一個有效電話號碼則停止。

第一步,我們可以用一個基本的正則表達式??梢杂霉雀桦娫拵靵泶_定一個數(shù)字串是否是合法電話號碼。
備注:我已在Sitepoint 寫過關(guān)于谷歌電話庫的內(nèi)容:文章
讓我們給谷歌電話庫添加一個PHP 端口,修改composer.json,添加:

"giggsey/libphonenumber-for-php": "~7.0"

別忘了升級:

composer update

現(xiàn)在我們可以寫一個函數(shù),輸入為一個字符串,嘗試提取一個合法的電話號碼

function findPhoneNumber($text, $country_code = "GB") {
      // Get an instance of Google"s libphonenumber
      $phoneUtil = libphonenumberPhoneNumberUtil::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, libphonenumberPhoneNumberFormat::E164);
            }
          } catch (libphonenumberNumberParseException $e) {
            // Ignore silently; getting here simply means we found something that isn"t a phone number
          }
        }
      }
      return null;
    }



希望注釋能解釋這個函數(shù)在干什么。注意如果這個庫沒能從字符串中解析出一個合法的電話號碼它會拋出一個異常。這不是什么問題;我們直接忽略它并繼續(xù)下一個候選字符。
如果我們找到一個電話號碼,我們以E.164的形式返回它。這提供了一個國際化的號碼,我們可以用來打電話或者發(fā)送SMS。
現(xiàn)在我們可以如下使用:

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,
    ]
  );
}); 

我們現(xiàn)在有簡單的API的基礎(chǔ)—-也就是JSON響應(yīng)-—我們可以用來作為一個簡單的移動應(yīng)用的后端,這款應(yīng)用可以用來從一幅圖中添加聯(lián)系人,打電話。

總結(jié)

OCR有許多應(yīng)用—并且很容易整合進你的應(yīng)用(超過你的預(yù)期)。本文中,我們安裝了開源OCR包;并使用一個包裝器庫,把它整合進一個非常簡單的PHP應(yīng)用。我們只是觸及到了所有可能性的表面,希望這能給你一些想法,幫你想想怎么在你自己的應(yīng)用中使用OCR。

標記:captcha, ocr, OOPHP, PHP, robot vision, silex, tesseract, twig

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/21379.html

相關(guān)文章

  • []OpenCV OCR and text recognition with Tesseract

    摘要:納入深度學習模型來進一步提升準確率只是時間問題,事實上,這個時間已經(jīng)到來。最新版本支持基于深度學習的,準確率顯著提高。該函數(shù)使用基于深度學習的文本檢測器來檢測不是識別圖像中的文本區(qū)域。高效使用概率最高的文本區(qū)域,刪除其他重疊區(qū)域。 By Adrian Rosebrock on September 17, 2018 in Deep Learning, Optical Character ...

    gnehc 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<