使用ocrad.js

时间:2017-12-06 14:35:38

标签: javascript android angularjs ionic-framework ocr

我开发了一个应用程序,它捕获图像并处理它以提取一些数据。 这是图像:

enter image description here

当我在Chrome调试器中运行代码时,我清楚地收到了所需的文字

  

批号#170814

enter image description here

但是,当我运行与Android应用程序相同的相同代码时,我会收到一些乱码。 enter image description here

常用功能:

function OCRImage(image) {
  var canvas = document.createElement('canvas')
  canvas.width = image.naturalWidth;
  canvas.height = image.naturalHeight;
  canvas.getContext('2d').drawImage(image, 0, 0)
  return OCRAD(canvas)
}

function OCRPath(url, callback) {
  var image = new Image()
  image.src = url;
  image.onload = function () {
    callback(OCRImage(image))
  }
}

Chrome的JS代码:

 OCRPath('img.png', function (words) {
    alert(words)
  })

Android的JS代码:

  var options = {
    quality: 100,
    destinationType: Camera.DestinationType.FILE_URI,
    sourceType: Camera.PictureSourceType.PHOTOLIBRARY,
    encodingType: Camera.EncodingType.PNG,
    mediaType: Camera.MediaType.PICTURE,
    allowEdit: true,
    correctOrientation: true
  }      
$cordovaCamera.getPicture(options)
        .then(
          function (imageURI) {
            OCRPath('img.png',
              function (words) {
                alert(words)
              })},
              function (err) {
                alert('Error');
              });
      }

有什么区别?它实际上是相同的图像和相同的图像处理代码。有什么建议?可能是,任何其他方式来制作OCR?

1 个答案:

答案 0 :(得分:1)

  

字面上相同的图像和相同的图像处理代码

不是 - 在网络中您将'img.png'加载到<img>,然后加载复制到<canvas>,然后传递给OCRAD

在Android上,您首先调用$cordovaCamera.getPicture(options)以获得一个用户选择图片后以imageURI解析的承诺。

如果有,请忽略imageURI并直接加载'img.png'

结果已访问图片,但可能有缩放版或其他较低分辨率版本 - 例如Lot # 170814变为_l # 1 TO81,但FISSURE DIAMOND似乎在较大的标题文字中找到好。

可能的解决方案:

使用destinationType : Camera.DestinationType.DATA_URL

切换到base-64编码图像
var options = {
    quality: 100,
    destinationType: Camera.DestinationType.DATA_URL,
    sourceType: Camera.PictureSourceType.PHOTOLIBRARY,
    encodingType: Camera.EncodingType.PNG,
    mediaType: Camera.MediaType.PICTURE,
    allowEdit: true,
    correctOrientation: true
}      
$cordovaCamera.getPicture(options)
    .then(
         function (imageURI) {
             OCRPath(imageURI, alert, alert);
         });

或者你不需要稍微迂回的方法来加载<img>然后把它放到<canvas>中 - 你这样做的唯一原因是将图像的字节变为{ {1}}。这是在网络上执行此操作的最佳方式,但在Android上您已经拥有该文件 - 您应该可以将其直接传递给OCRAD