我开发了一个应用程序,它捕获图像并处理它以提取一些数据。 这是图像:
当我在Chrome调试器中运行代码时,我清楚地收到了所需的文字
批号#170814
但是,当我运行与Android应用程序相同的相同代码时,我会收到一些乱码。
常用功能:
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?
答案 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
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
。