如何有效处理Google Vision API客户端库响应?

时间:2018-08-25 12:28:24

标签: php json google-cloud-platform response google-cloud-vision

我是Google Vision API客户端库的新手

我正在使用Vision API Client Lib for PHP来检测图像中的文本,这是我的代码:

<?php
require 'vendor/autoload.php';

use Google\Cloud\Vision\VisionClient;
function object_to_array($object) {
    return (array) $object;
}
$vision = new VisionClient(
['keyFile' => json_decode(file_get_contents("smartcity-credentials.json"), true)]
);
$img = file_get_contents('img2.jpg');
$image=$vision->image($img,['DOCUMENT_TEXT_DETECTION']);
$result=$vision->annotate($image);
$res=object_to_array($result);
var_dump($res);
?>

我所需要的只是将响应用作处理数组,但是$ result返回类似对象/对象的数组(抱歉,因为我对OOP /对象了解不多)

尽管我将$ result转换为数组$ res,但是如果我使用foreach循环

foreach ($res as $key=>$value){
    echo $value;
    echo '<br>';
}

我明白了

  

可捕获的致命错误:Google \ Cloud \ Vision \ Annotation \ Document类的对象无法转换为字符串

我们如何在上面的响应中获得使用价值(检测到文本)?

2 个答案:

答案 0 :(得分:3)

您应该使用fullText()和text()方法来访问检测到的文本,如下所示:

Scaffold(
  appBar: AppBar(title: Text(title)),
  body: Center(child: Text('My Page!')),
  drawer: Drawer(
    // Add a ListView to the drawer. This ensures the user can scroll
    // through the options in the Drawer if there isn't enough vertical
    // space to fit everything.
    child: ListView(
      // Important: Remove any padding from the ListView.
      // padding: EdgeInsets.zero,
      children: <Widget>[
        DrawerHeader(
          child: Text('Drawer Header'),
          decoration: BoxDecoration(
            color: Colors.blue,
          ),
        ),
        ExpansionTile(
          title: Text('Item0'),
          children: <Widget>[
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: Text('subHeading1'),
            ),
            Text('subheading2')
          ],
        ),
        ListTile(
          title: Text('Item 1'),
          onTap: () {
            // Update the state of the app
            // ...
            // Then close the drawer
            Navigator.pop(context);
          },
        ),
        ListTile(
          title: Text('Item 2'),
          onTap: () {
            // Update the state of the app
            // ...
            // Then close the drawer
            Navigator.pop(context);
          },
        ),
      ],
    ),
  ),
);

请参阅这些类AnnotationDocument的规范。

答案 1 :(得分:2)

您不能将$value类型的Document用作echo的字符串。 使用print_r($annotation);查看您的退货。 这个document text detection example看起来很相似,请注意那里的嵌套foreach循环。另请参见documentation

use Google\Cloud\Vision\VisionClient;

$vision = new VisionClient();
$imageResource = fopen(__DIR__.'/assets/the-constitution.jpg', 'r');
$image = $vision->image($imageResource, ['DOCUMENT_TEXT_DETECTION']);

$annotation = $vision->annotate($image);
$document = $annotation->fullText();

$info = $document->info();
$pages = $document->pages();
$text = $document->text();

这里还有更多examples;尤其是detect_document_text.php