我有点困惑这个问题,我知道在堆栈溢出方面有很多问题,但在我的情况下。 什么都没有给出预期的结果。
上下文:
我使用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周,现在我找不到一个可行的解决方案,这是唯一能够提供准确结果的解决方案