将一串文本和数字更改为正数

时间:2015-10-22 22:40:35

标签: java ocr sikuli

我目前正在使用Sikuli API中的OCR工具从以下屏幕中查找交易ID:

Expected Text from Application

找到文本并在稍作清理后返回以下内容:

Characters returned from Sikuli OCR

我的问题是......如何才能最好地用正确的数字替换OCR生成的字母字符?从我所看到的,它与解读字母的方式相当一致。例如,' 0' 0通常会结束' 1J',' 6'变成了一个'和一个' 7'变成了一个'。'

对于那些感兴趣的人,我会发布用于让OCR工作的代码,因为大多数关于此的通信都超过2年。

1)将您的Sikuli库导入您的Java项目

2)在班级的顶部,将设置设置为TRUE

Settings Image

3)设置图像以锚定并执行以下代码的变体。

enter image description here

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

我使用与@zerotres自己提出的相同的解决方案,同时没有找到更好的方法。只需要考虑几点就可以提高检测质量:

选项1

  1. 确保包含文本的区域不包含任何不相关的区域,例如文本周围的框架(如问题中所示)等等......

  2. 有时它会有助于在感兴趣的区域周围稍微移动该区域。

  3. 在这两种情况下,使用- (void)exportUsers { NSLog(@"exportUsers method reached"); NSFetchRequest *request = [[NSFetchRequest alloc] init]; [request setEntity:[NSEntityDescription entityForName:@"Account" inManagedObjectContext:_context]]; NSError *error = nil; NSArray *objectsForExport = [_context executeFetchRequest:request error:&error]; NSArray *exportKeys = [NSArray arrayWithObjects:@"username", @"pin", @"credit", @"email", @"lastLogin", @"rfid", @"phoneNumber", nil]; NSMutableArray *csvObjects = [NSMutableArray arrayWithCapacity:[objectsForExport count]]; for (NSManagedObject *object in objectsForExport) { NSMutableArray *anObjectArray = [NSMutableArray arrayWithCapacity:[exportKeys count]]; for (NSString *key in exportKeys) { id value = [object valueForKey:key]; if (!value) { value = @""; } [anObjectArray addObject:[value description]]; } [csvObjects addObject:anObjectArray]; } NSLog(@"The output:%@",csvObjects); // need to figure out how to fetch the DeviceID and append it to the file name NSString *idfv = [[[UIDevice currentDevice] identifierForVendor] UUIDString]; // write array to CSV file // CHCSVWriter *csvWriter=[[CHCSVWriter alloc]initForWritingToCSVFile:[NSHomeDirectory() stringByAppendingPathComponent:@"KegCop-users.csv"]]; CHCSVWriter *csvWriter=[[CHCSVWriter alloc]initForWritingToCSVFile:[NSHomeDirectory() stringWithFormat:@"KegCop-users-%@",idfv]]; [csvWriter writeLineOfFields:csvObjects]; [csvWriter closeStream]; [self uploadCSV]; } 可以帮助确定该地区究竟涵盖的内容。

    选项2

    有时,检测到的文本是不可撤销的,并且字符替换不起作用。在这种情况下,可以考虑采用不同的方法。如果您在感兴趣的区域附近有一些静态视觉图案,则可以将其用作枢轴来定位文本区域。然后,如果您要搜索的文本是可点击的,您只需选择文本(例如双击),然后从剪贴板中读取它。这将导致100%正确的结果。

答案 1 :(得分:1)

为此找出解决方案......

    String transactionId = "1lJ1BT0357317IJ253 ";

    System.out.println("Before Conversion: " + transactionId);

    transactionId = transactionId.replace("lJ","0");
    transactionId = transactionId.replace("IJ","0");
    transactionId = transactionId.replace("B","8");
    transactionId = transactionId.replace("T","7");
    transactionId = transactionId.replace(" ","");

    System.out.println("After Conversion: " + transactionId);

似乎为我完成了工作......希望这有助于其他人。