【发布时间】:2019-03-30 05:46:57
【问题描述】:
我有点被这个问题困扰,而且我知道在堆栈溢出方面有很多关于它的问题,但就我而言。没有给出预期的结果。
背景:
我正在使用 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,出于隐私原因,我无法真正发布整张图像,但这里有一个剪辑过的图像和一个虚拟密码。
使用 MrzParser.tryParse 函数添加了对字符位置及其在 MRZ 中的有效性的检查,能够更正一些出现的情况,例如包含 8 而不是 B 的名称,并获得良好的结果,但需要花费很多时间,这是正常的,因为我在循环中对近 255 个图像进行了阈值处理,并添加了 Tesseract 调用。
我已经尝试获取出现最多但结果不同的 C 和 B 值列表。
问题:
有没有办法定义一个 C 和 blocksize 值,这样它总是给出相同的结果,可能会添加更多的 OpenCV 调用,所以输入图像比如增加对比度等等,我在网上搜索了 2 周现在我可以'找不到可行的解决方案,这是唯一能给出准确结果的解决方案
【问题讨论】:
-
你尝试过简单的持股吗?
-
股份持有?是的,如果这就是您的意思,我经历了简单的阈值处理:D,但它永远不会给出相同的结果,除非所有用户拍摄的图像在照明、对比度和护照纹理方面都是相同的。如此简单的阈值并不是一个可行的解决方案。
-
哈哈是的,我的意思是阈值对不起。发布一些您的图像示例会很有帮助。例如,您得到的确切结果是什么,但并不令人满意?
标签: android opencv ocr tesseract opencv4android