最近公司要新做一个项目,需要用到从图片上识别文字,刚开始做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时如果知道图片上的文字语言,最好指定成正确的语言参数。