【问题标题】:Microsoft Cognitive API Image Search微软认知 API 图像搜索
【发布时间】:2017-01-05 02:46:20
【问题描述】:

我正在尝试使用here 描述的 Bing 图像的 Microsoft API

我只想通过在帖子请求的正文中发送图像来使用图像洞察力来查找相似图像,因为文档说我可以提供 url 或图像。

图像由手机摄像头捕获并发送到 api,目的是最终获得相似的图像结果。

起初我收到一个错误,说需要“q”参数,但我不想只使用图像搜索查询。

所以我将 ContentType 更改为“multipart/form-data”并使用“/search?modulesRequested=similarimages”

这似乎做了一些事情,因为现在我没有收到任何错误,api 响应只是一个空字符串,所以我真的在这里迷路了......

这是我发送请求的代码。

        public async Task<string> GetImageInsights(byte[] image)
    {
        var uri = "https://api.cognitive.microsoft.com/bing/v5.0/images/search?modulesRequested=similarimages";

        var response = await RequestHelper.MakePostRequest(uri, new string(Encoding.UTF8.GetChars(image)), key, "multipart/form-data");

        var respString = await response.Content.ReadAsStringAsync();

        return respString;
    }
    public static async Task<HttpResponseMessage> MakePostRequest(string uri, string body, string key, string contentType)
    {
        var client = new HttpClient();

        // Request headers
        client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", key);

        // Request body
        byte[] byteData = Encoding.UTF8.GetBytes(body);

        using (var content = new ByteArrayContent(byteData))
        {
            content.Headers.ContentType = new MediaTypeHeaderValue(contentType);
            return await client.PostAsync(uri, content);
        }
    }

我在 Android 上使用 C# 和 Xamarin

【问题讨论】:

    标签: c# android image microsoft-cognitive


    【解决方案1】:

    为了使服务正常工作,表单部分需要名称和文件名:

    public async Task<string> GetImageInsights(byte[] image)
    {
        var uri = "https://api.cognitive.microsoft.com/bing/v5.0/images/search?modulesRequested=similarimages";
    
        var response = await RequestHelper.MakePostRequest(uri, image, key);
    
        var respString = await response.Content.ReadAsStringAsync();
    
        return respString;
    }
    
    class RequestHelper
    { 
        public static async Task<HttpResponseMessage> MakePostRequest(String uri, byte[] imageData, string key)
        {
            using (var client = new HttpClient())
            {
                client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", key);
    
                var content = new MultipartFormDataContent();
                content.Add(new ByteArrayContent(imageData), "image", "image.png");
    
                return await client.PostAsync(uri, content);
            }
        }
    }
    

    【讨论】:

    • 还是不行,只是返回一个空字符串,什么意思?它不应该返回某种错误吗?
    • 我假设空结果意味着未找到类似图像。如果您尝试使用互联网上的普通图片会怎样?
    • 原来空结果是服务器返回 404 并且是由于我的图像大于 1MB 引起的,一旦修复了我因为缺少“q”参数而收到错误,如果我使用 imgurl 它不询问为什么使用帖子正文?
    • 您在使用我发布的代码吗?根据documentation,> > 如果您将 modulesRequested 查询参数设置为 RecognizedEntities,您可以通过将 imgUrl 查询参数设置为图像的 URL 来指定图像,或者您可以在 POST 请求的正文中指定图像的二进制文件.如果您在 POST 请求的正文中指定图像,则必须指定此标头并将其值设置为 multipart/form-data。
    猜你喜欢
    • 2017-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-01
    • 2018-08-11
    • 2017-12-04
    • 1970-01-01
    相关资源
    最近更新 更多