android 修改内存阈值,android - 改善Tesseract的阈值结果 - 堆栈内存溢出

我有点困惑这个问题,我知道在堆栈溢出方面有很多问题,但在我的情况下。 什么都没有给出预期的结果。

上下文:

我使用Android OpenCV和Tesseract,所以我可以阅读护照中的MRZ区域。 当相机启动时,我将输入帧传递给AsyncTask,处理帧,成功提取MRZ区域,我将提取的MRZ区域传递给函数prepareForOCR(inputImage),将MRZ区域作为灰色Mat并输出带有阈值图像的位图,我将传递给Tesseract。

问题:

问题是在对图像进行阈值处理时,我使用blockSize = 13和C = 15的自适应阈值处理,但是给出的结果并不总是相同的,这取决于图像的光照和拍摄帧的一般条件。

我尝试过的:

首先,我将图像大小调整为特定大小(871,108),因此输入图像始终相同,并且不依赖于使用哪种手机。 调整大小后,我尝试使用不同的BlockSize和C值

//toOcr contains the extracted MRZ area

Bitmap toOCRBitmap = Bitmap.createBitmap(bitmap);

Mat inputFrame = new Mat();

Mat toOcr = new Mat();

Utils.bitmapToMat(toOCRBitmap, inputFrame);

Imgproc.cvtColor(inputFrame, inputFrame, Imgproc.COLOR_BGR2GRAY);

TesseractResult lastResult = null;

for (int B = 11; B < 70; B++) {

for (int C = 11; C < 70; C++){

if (IsPrime(B) && IsPrime(C)){

Imgproc.adaptiveThreshold(inputFrame, toOcr, 255, Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C, Imgproc.THRESH_BINARY, B ,C);

Bitmap toOcrBitmap = OpenCVHelper.getBitmap(toOcr);

TesseractResult result = TesseractInstance.extractFrame(toOcrBitmap, "ocrba");

if (result.getMeanConfidence()> 70) {

if (MrzParser.tryParse(result.getText())){

Log.d("Main2Activity", "Best result with " + B + " : " + C);

return result;

}

}

}

}

}

使用下面的代码,阈值结果图像是黑白图像,它给出了大于70的置信度,出于隐私原因我无法真正发布整个图像,但这里是一个剪辑的和一个虚拟密码。

aHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9TbHkzZS5wbmc=

2c3845f2abcf1a7e316edcec4dad0ea7.png

使用MrzParser.tryParse函数在MRZ中添加对字符位置及其有效性的检查,能够纠正一些出现,如包含8而不是B的名称,并获得良好的结果,但它需要花费很多时间,这是正常,因为在循环中阈值处理了近255个图像,增加了Tesseract调用。

我已经尝试获得最多出现的C和B值列表,但结果不同。

问题:

有没有办法定义一个C和blocksize值,以便它总是给出相同的结果,可能添加更多的OpenCV调用所以输入图像像增加对比度等等,我在网上搜索了2周,现在我找不到一个可行的解决方案,这是唯一能够提供准确结果的解决方案

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值