在Ruby on Rails项目中用tesseract ocr读取图片上文字

最近公司要新做一个项目,需要用到从图片上识别文字,刚开始做demo时用的是百度OCR API(http://apistore.baidu.com/apiworks/servicedetail/146.html  ),但考虑到项目上线后这个功能的使用次数和处理速度,最后决定找一个开源项目来实现该功能。通过比较,最后选择google的tesseract-ocr。

整个功能的实现环境:ubuntu 14.04 + Ruby on Rails,整个项目的搭建步骤如下:

1,在ubuntu上安装imagemagick 和 tesseract-ocr
sudo apt-get install imagemagick
sudo apt-get install libmagickwand-dev

sudo apt-get install tesseract-ocr
sudo apt-get install tesseract-ocr-chi-sim  #简体中文包
//下面这个gimagereader是网上同学说装一下,但本人目前不知道这个有什么用
sudo add-apt-repository ppa:sandromani/gimagereader
sudo apt-get update
sudo apt-get install gimagereader

我们先用tesseract命令行来识别一下图片

doorder@ubuntu-doorder:~/workspace/image_kit/public/cuts$ tesseract 1.png image_1
Tesseract Open Source OCR Engine v3.03 with Leptonica
doorder@ubuntu-doorder:~/workspace/image_kit/public/cuts$ tesseract -l chi_sim 10.jpg image_10
Tesseract Open Source OCR Engine v3.03 with Leptonica

我们看一下生成的image_1.txt和image_10.txt发现两个图片都识别成功了。这里需要注意的是识别中文时我们需要通过参数-l指定言语为简体中文,所以确保在此之前你已安装了tesseract-ocr-chi-sim,验证tesseract-ocr-chi-sim是否成功安装可以通过查看/usr/share/tesseract-ocr/tessdata/chi_sim.traineddata是否存在。

2,安装ruby gem

(本人使用的ruby版本是2.2,rails版本是4.2.4),因为用到的gem文件已经写在rails的Gemfile里了所以只需要执行bundle install就可以。主要用到的gem如下

gem "rmagick"
gem "rtesseract"
3,测试tesseract-ocr,先来一个英文识别
img_path = File.join(Rails.root, "public/cuts/1.png")
rt_img = RTesseract.new(img_path)
rt_img.to_s

不出所料,程序识别出来了1.png文件里的字是“Hello, World"。

4,再来试一个中文的
img_path = File.join(Rails.root, "public/cuts/10.jpg")
rt_img = RTesseract.new(img_path, :lang => "chi_sim")
rt_img.to_s

很好,这个也识别出来了。识别中文时需要指定lang参数为chi_sim

5,对比一下tesseract-ocr和百度OCR

接下来我们对比一下tesseract-ocr和百度OCR识别结果,百度OCR识别我们用的是baidu_ocr这个gem。

[
    ["1.png", "Hello, World"],
    ["2.png", "AutoprefiXer required for Less/Sass"],
    ["10.jpg", "战略合作伙伴"],
    ["m8.jpg", "产品系列"],
    ["m12.jpg", "精品工程"],
    ["m14.jpg", "效果体验"],
    ["m18.jpg", "加盟合作"]
  ].each do |arr_item|
    img_path = File.join(Rails.root, "public/cuts/#{arr_item[0]}")
    if File.exist?(img_path)
      rt_img = RTesseract.new(img_path, :lang => "chi_sim")
      rt_text = rt_img.to_s

      BaiduOcr.init_baidu_ocr(apikey: "66a70da7aeb00b24e2a3e73eb6ecf1e1",
                              image: img_path,
                              imagetype: 1)
      baidu_text = BaiduOcr.recognize rescue baidu_text = "读取失败"

      puts "#{arr_item[0]} real text: #{arr_item[1]}, baidu result: #{baidu_text}, Tesseract result: #{rt_text}"
    else
      puts "#{arr_item[0]} is not present"
    end
  end

通过对比发现两个的识别率基本差不多,但发现之前tesseract-ocr能准确识别出来1.png上的文字,但通过指定lang是chi_sim后却识别出来的结果不对。所以我们在使用tesseract-ocr时如果知道图片上的文字语言,最好指定成正确的语言参数。





转载于:https://my.oschina.net/laifuzi/blog/541339

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值