我目前正在使用Sikuli API中的OCR工具从以下屏幕中查找交易ID:
找到文本并在稍作清理后返回以下内容:
我的问题是......如何才能最好地用正确的数字替换OCR生成的字母字符?从我所看到的,它与解读字母的方式相当一致。例如,' 0' 0通常会结束' 1J',' 6'变成了一个'和一个' 7'变成了一个'。'
对于那些感兴趣的人,我会发布用于让OCR工作的代码,因为大多数关于此的通信都超过2年。
1)将您的Sikuli库导入您的Java项目
2)在班级的顶部,将设置设置为TRUE
3)设置图像以锚定并执行以下代码的变体。
提前感谢您的帮助!
答案 0 :(得分:2)
我使用与@zerotres自己提出的相同的解决方案,同时没有找到更好的方法。只需要考虑几点就可以提高检测质量:
选项1 :
确保包含文本的区域不包含任何不相关的区域,例如文本周围的框架(如问题中所示)等等......
有时它会有助于在感兴趣的区域周围稍微移动该区域。
在这两种情况下,使用- (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);
似乎为我完成了工作......希望这有助于其他人。