Android中使用Google Cloud Vision API提取图片价格信息方法咨询
如何从Google Cloud Vision提取的文本中过滤价格信息
嘿,这个需求我之前帮朋友调过类似的,其实核心就是在Google Cloud Vision返回的全量文本里,用正则表达式精准筛选带货币符号的价格条目,下面给你拆解具体步骤和我踩过的几个坑:
1. 先处理Vision API的响应结构
不管你用哪种语言调用API,Vision返回的文本都会拆分成textAnnotations数组:第一个元素是整张图的全文本,后面的元素是独立的单词/短语区块。这里有两种筛选思路:
- 遍历独立单词:精度更高,因为Vision已经帮你拆分了元素,不容易把无关文本凑成价格(比如把“$”和旁边的随机数字误判)
- 全文本全局匹配:实现更简单,适合图片排版规范、价格和其他文本区分明显的场景
2. 编写适配多货币的正则表达式
这是关键,要覆盖常见的价格格式:货币符号在数字前/后、带千分位、带小数等。给你一个通用的正则模板,你可以按需扩展:
(\$|Rs|€|₹)\s?\d+(?:,\d{3})*(?:\.\d{2})?|\d+(?:,\d{3})*(?:\.\d{2})?\s?(\$|Rs|€|₹)
正则解释:
(\$|Rs|€|₹):匹配你需要的货币符号(可以加£、¥等其他符号)\s?:匹配符号和数字之间可能存在的空格(比如Rs 1000)\d+(?:,\d{3})*:匹配整数部分,支持千分位逗号(比如$1,234)(?:\.\d{2})?:匹配可选的两位小数(比如价格的分位,$19.99)- 后半段:专门处理符号在数字后面的情况(比如
1000 Rs)
3. 代码实现示例(以Java为例,可适配你的开发语言)
假设你已经拿到了Vision API的响应对象:
// 从Vision响应中获取文本注解列表 List<EntityAnnotation> textAnnotations = visionResponse.getResponses().get(0).getTextAnnotations(); // 编译正则模式 Pattern pricePattern = Pattern.compile("(\\$|Rs|€|₹)\\s?\\d+(?:,\\d{3})*(?:\\.\\d{2})?|\\d+(?:,\\d{3})*(?:\\.\\d{2})?\\s?(\\$|Rs|€|₹)"); // 方式1:遍历独立单词(跳过第一个全文本元素) for (int i = 1; i < textAnnotations.size(); i++) { String singleText = textAnnotations.get(i).getDescription(); Matcher matcher = pricePattern.matcher(singleText); if (matcher.find()) { String price = matcher.group(); // 这里将提取到的价格存入你的数据模型 System.out.println("提取到有效价格:" + price); } } // 方式2:全文本全局匹配(适合快速实现) String fullText = textAnnotations.get(0).getDescription(); Matcher fullMatcher = pricePattern.matcher(fullText); while (fullMatcher.find()) { String price = fullMatcher.group(); System.out.println("提取到有效价格:" + price); }
4. 优化建议(避坑指南)
- 排除误匹配:比如有些文本里的
$是变量名、Rs是缩写,这时可以结合Vision返回的boundingPoly(边界框)判断,比如优先提取和“Total”、“Price”、“Amount”等关键词距离近的价格 - 扩展货币支持:如果需要更多货币,直接把符号加到正则的符号组里就行,比如
(\$|Rs|€|₹|£|¥) - 处理模糊识别:Vision偶尔会把
$识别成S或其他类似字符,你可以在正则里加备选,比如(\$|S|\$)(根据实际识别情况调整)
内容的提问来源于stack exchange,提问作者R.sam




