Узел Js Microsoft Cognitive Services

У меня проблема с вызовом Cognitive Services от NodeJs. Я довольно новичок в Node, поэтому переход с простого JavaScript на Node был непростой задачей. Когда я использую изображение, которое находится в Интернете, оно работает, но мне нужно использовать изображение, которое находится на локальном сервере и перепробовало много вещей, чтобы удовлетворить требование, что он является необработанным двоичным файлом. Вот что я пытался...

    const cognitiveServices = require('cognitive-services');
    var fs = require('fs');
    var apiKey = "myapikey";
    var apiUrl="https://westus.api.cognitive.microsoft.com/vision/v1.0/analyze"
    const FRIENDS_IMAGE_URL ='http://az616578.vo.msecnd.net/files/2016/10/09/636115830685164048-686058602_friends.jpg';

    const parameters ={ "visualFeatures": "Tags","details": "Celebrities","language": "en"}
    //var body = { "url": FRIENDS_IMAGE_URL };

   var body = { "url":  getlocalimage()};
   //var body = getlocalimage();

   function getlocalimage()
    {
      var fn = "test.jpg"
      var base64 = fs.readFileSync(fn).toString('base64');
      //  var myimage = "data:image/jpeg:base64," + base64;
      var myimage =  base64;
      return new Buffer(myimage, 'base64').toString('binary');
     }

    function cogtest()
      {
        const chkImage = new cognitiveServices.computerVision({
                     apiKey: apiKey,
                     endpoint: "westus.api.cognitive.microsoft.com"
      })

    chkImage.analyzeImage({  parameters,  body  })
      .then(response => { console.log(response); })
      .catch((err) => { console.log(err);});

      }

       cogtest();

Поскольку вызов может быть успешно выполнен при использовании изображения из Интернета, и я получаю следующую ошибку:

   { StatusCodeError: 400 - {"code":"InvalidImageUrl","requestId":"96432967-59d8-4851-a039-1e5b281b4cb7","message":"Can't fetch the image."}
    at new StatusCodeError (/Users/Tim/Downloads/0PiNode/node_modules/request-promise-core/lib/errors.js:32:15)
    at /Users/Tim/Downloads/0PiNode/node_modules/request-promise-core/lib/plumbing.js:97:41
    at tryCatcher (/Users/Tim/Downloads/0PiNode/node_modules/bluebird/js/release/util.js:16:23)
    at Promise._settlePromiseFromHandler (/Users/Tim/Downloads/0PiNode/node_modules/bluebird/js/release/promise.js:512:31)
    at Promise._settlePromise (/Users/Tim/Downloads/0PiNode/node_modules/bluebird/js/release/promise.js:569:18)
    at Promise._settlePromiseCtx (/Users/Tim/Downloads/0PiNode/node_modules/bluebird/js/release/promise.js:606:10)
    at Async._drainQueue (/Users/Tim/Downloads/0PiNode/node_modules/bluebird/js/release/async.js:138:12)
    at Async._drainQueues (/Users/Tim/Downloads/0PiNode/node_modules/bluebird/js/release/async.js:143:10)
    at Immediate.Async.drainQueues [as _onImmediate] (/Users/Tim/Downloads/0PiNode/node_modules/bluebird/js/release/async.js:17:14)
    at runCallback (timers.js:800:20)
    at tryOnImmediate (timers.js:762:5)
    at processImmediate [as _immediateCallback] (timers.js:733:5)
  name: 'StatusCodeError',
  statusCode: 400,
  message: '400 - {"code":"InvalidImageUrl","requestId":"96432967-59d8-4851-a039-1e5b281b4cb7","message":"Can\'t fetch the image."}',
  error: 
   { code: 'InvalidImageUrl',
     requestId: '96432967-59d8-4851-a039-1e5b281b4cb7',
     message: 'Can\'t fetch the image.' },
  options: 
   { uri: 'https://westus.api.cognitive.microsoft.com/vision/v1.0/analyze',
     method: 'POST',
     headers: 
      { 'Ocp-Apim-Subscription-Key': 'KEY' },
     qs: 
      { visualFeatures: 'Tags',
        details: 'Celebrities',
        language: 'en' },
     json: true,

есть идеи? я считаю, что это связано с передачей необработанного двоичного изображения в теле. По модулю https://github.com/joshbalfour/node-cognitive-services

https://github.com/joshbalfour/node-cognitive-services/tree/v0.2.0#computer-vision---analyze-image

спасибо за любую помощь

1 ответ

Решение

Вам не нужно конвертировать изображение в представление base64. Вы можете просто сделать это:

var parameters = {
    "visualFeatures": "Tags",
    "details": "Celebrities",
    "language": "en"
}

var body = fs.readFileSync("test.jpg");

var chkImage = new cognitiveServices.computerVision({
    apiKey: "myapikey",
    endpoint: "westus.api.cognitive.microsoft.com"
})

chkImage.analyzeImage({
    parameters,
    body
})
    .then(response => {
        console.log(response);
    })
    .catch((err) => {
        console.log(err);
    });

Т.е. просто перешлите результат fs.readFileSync как тело запроса.

Другие вопросы по тегам