阿里云图像搜索服务--以图搜图,拍立淘功能实现

先放上成果:阿里云图像搜索查询成功后将会按照相似度降序返回给我们图片信息
如果你想了解一下阿里云图像搜索服务的大概内容,可以看我之前写的文章 阿里云图像搜索

阿里云图像搜索服务--以图搜图,拍立淘功能实现_第1张图片

前期准备:

注册阿里云账号,购买ECS服务,购买图像搜索服务。注意ECS服务地址跟图像搜索服务地址需要在同一个区域内,不然查询不到。

步骤:
1、导入sdk包:

在你的项目根目录下跑以下命令:
composer require alibabacloud/imagesearch-20200212

2、导入相关依赖:
declare (strict_types=1);

use AlibabaCloud\SDK\ImageSearch\V20200212\ImageSearch;
use AlibabaCloud\SDK\OpenPlatform\V20191219\OpenPlatform;
use AlibabaCloud\SDK\OpenPlatform\V20191219\OpenPlatform\AuthorizeFileUploadRequest;
use AlibabaCloud\Tea\Exception\TeaUnableRetryError;
use AlibabaCloud\Tea\FileForm\FileForm\FileField;
use AlibabaCloud\Tea\Rpc\Rpc\Config;
use AlibabaCloud\Tea\RpcUtils\RpcUtils;
use AlibabaCloud\Tea\Utils\Utils\RuntimeOptions;
use GuzzleHttp\Psr7\Stream;

注意declare()需要置顶

2、复刻sdk查询代码:
 - function _getImageByPic()
 - {
 - 
 -     $config = new Config();
 -     $config->accessKeyId = ""; 
 -     $config->accessKeySecret = "";
 -     $config->regionId = "";
 -     $config->endpoint = "imagesearch.[regionId].aliyuncs.com";
 -     $client = new ImageSearch($config);
 -     $request = new ImageSearch\SearchImageByPicAdvanceRequest();
 -     // 必填,图像搜索实例名称。
 -     $request->instanceName = "xxxxx";
 -     $imageStream = new Stream(fopen("", 'r+'));
 -     $request->picContentObject = $imageStream;
 - 
 -     $runtime = new RuntimeOptions();
 -     $runtime->maxIdleConns = 3;
 -     $runtime->connectTimeout = 3000;
 -     $runtime->readTimeout = 3000;
 -     try {
 -         $response = $client->searchImageByPicAdvance($request, $runtime);
 -         var_dump($response->toMap());
 -     } catch (TeaUnableRetryError $e) {
 -         var_dump($e->getLastException(), $e->getLastRequest());
 -     } catch (Exception $e) {
 -     }
 - }

注意:复刻你需要补充的东西有:

  • 注册阿里云账号,获得accessKeyIdAccessKey Secret
  • 购买ECS服务,购买图像搜索服务,注意地址要一致,不然会查询不到。将regionId ,就是你买的服务地址,不清楚可以对照下表:

地域名称

地域名称 所在城市 RegionID 可用区数量
华北 1 青岛 cn-qingdao 2
华北 2 北京 cn-beijing 7
华北 3 张家口 cn-zhangjiakou 2
华北 5 呼和浩特 cn-huhehaote 1
华东 1 杭州 cn-hangzhou 7
华东 2 上海 cn-shanghai 5
华南 1 深圳 cn-shenzhen 4
  • 将endpoint中的[regionId]替换成你的真实地址,注意php的拼接语法,不懂你可以把它换成{你的regionId地址}
  • xxxxx换成你购买的服务的实例名称

注意第13行,这里很容易出错,我是将filePath内容直接当作参数传给该方法调用的。
你只需要注意阿里云图像搜索对图片内容有以下要求:
图片内容,Base64编码。最多支持:
2MB大小图片以及5s的传输等待时间。仅支持jpg和png格式图片;
对于商品、商标、通用图片搜索,图片长和宽的像素必须都大于等于200,并且小于等于1024;
对于布料搜索,图片长和宽的像素必须都大于等于448,并且小于等于1024;图像中不能带有旋转信息。

3、对结果进行过滤

阿里云允许你对图片查询结果进行过滤,利用以下方法设置。

$request->filter="int_attr= $intAttr ";

$intAttr 是整型字段,用自己设置的整型将它替换。
$strAttr是string类型,用自己设置的字符串将它替换,设置成功后你就能只查询到设置的图片。

你还可以组合过滤,如下:

  1. 根据IntAttr过滤结果,int_attr>=100
    2.根据StrAttr过滤结果,str_attr!=“value1”
    3.根据IntAttr和StrAttr联合过滤结果,int_attr=1000 AND str_attr=“value1”

注意,该方法需要你在增加图片时设置了过滤属性。如下:

$request->intAttr = $intAttr; 
$request->strAttr = $strAttr; 

返回的结果将会在$response->toMap()中,因为设置了var_dump(),所以我们会在程序中看到打印结果。
如果你想对结果进行操作,可以将var_dump() 那一句换成 $results = $response->toMap();,然后对$results进行操作。

如果还有不清楚的
可以评论留言,我也在这上面踩了很多坑,欢迎交流。

你可能感兴趣的:(其他)