You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动