2

尝试在 Node.js 中使用 Microsoft 的人脸 API,但我无法加载本地图像。我究竟做错了什么?谢谢

我正在与网络摄像头交互并将视频绘制到画布标签上。

var canvas = document.getElementById("myCanvas"); // get the canvas from the page
var ctx = canvas.getContext("2d");

我已经检查过我正在使用

var filename = new Date();
var imgData = canvas.toDataURL('image/jpeg');
var link = document.getElementById('saveImg');
link.href = imgData;
link.download = filename;
link.click();

并且图像保存得很好......但我然后尝试执行以下操作:

sendRequest(makeblob(imgData));

function sendRequest(imageURL) {
  var returnData;
  const request = require('request');
  const subscriptionKey = '...';

  const uriBase = 'https://eastus.api.cognitive.microsoft.com/face/v1.0/detect';

  // Request parameters.
  const params = {
    'returnFaceId': 'true',
    'returnFaceLandmarks': 'false',
    'returnFaceAttributes': ''
  };

  const options = {
    uri: uriBase,
    qs: params,
    body: '"' + imageURL + '"',
    headers: {
      'Content-Type': 'application/octet-stream',
      'Ocp-Apim-Subscription-Key': subscriptionKey
    }
  };

  request.post(options, (error, response, body) => {
    if (error) {
      console.log('Error: ', error);
      return;
    }
    let jsonResponse = JSON.stringify(JSON.parse(body), null, '  ');
    returnData = jsonResponse;
  });
  return returnData;
}

makeblob = function (dataURL) {
        var BASE64_MARKER = ';base64,';
        if (dataURL.indexOf(BASE64_MARKER) == -1) {
            var parts = dataURL.split(',');
            var contentType = parts[0].split(':')[1];
            var raw = decodeURIComponent(parts[1]);
            return new Blob([raw], { type: contentType });
        }
        var parts = dataURL.split(BASE64_MARKER);
        var contentType = parts[0].split(':')[1];
        var raw = window.atob(parts[1]);
        var rawLength = raw.length;

        var uInt8Array = new Uint8Array(rawLength);

        for (var i = 0; i < rawLength; ++i) {
            uInt8Array[i] = raw.charCodeAt(i);
        }

        return new Blob([uInt8Array], { type: contentType });
    }

这只是返回

{
  "error": {
    "code": "InvalidImageSize",
    "message": "Image size is too small."
  }
}

我还应该如何对图像进行解码/编码?

4

2 回答 2

0

“InvalidImageSize”、“message”:“图片尺寸太小。”</p>

根据人脸 API - V1.0,我们可以知道当人脸大小为36x364096x4096像素时,可以检测到人脸。如果需要检测非常小但清晰的人脸,请尝试放大输入图像。如果您的图像具有清晰的面孔,您可以使用在线工具放大本地图像。

  • 更高的人脸图像质量意味着更好的检测和识别精度。请考虑高质量的人脸:正面、清晰,人脸大小为 200x200 像素(两眼之间 100 像素)或更大。

  • 支持 JPEG、PNG、GIF(第一帧)和 BMP 格式。允许的图像文件大小为 1KB 到 6MB。

  • 当人脸大小为36x364096x4096像素时,可以检测到人脸。如果需要检测非常小但清晰的人脸,请尝试放大输入图像。

于 2018-07-20T09:32:23.483 回答
0

我知道我在这里迟到了,但我找到了一些肯定对你有帮助的东西。遗憾的是,Emotion 和 Face API 不支持分块传输,如此处所述。“解决方法”是在发出 Web 请求之前同步加载图像位。代码片段应该是这样的:

const request = require('request');
const fs = require('fs');

function sendRequest(imageData) {
    const uriBase = 'https://eastus.api.cognitive.microsoft.com/face/v1.0/detect';

    // Request parameters.
    const params = {
        'returnFaceId': 'true',
        'returnFaceLandmarks': 'false',
        'returnFaceAttributes': ''
    };

    const options = {
        uri: uriBase,
        qs: params,
        body: fs.readFileSync(imgData),
        headers: {
          'Content-Type': 'application/octet-stream',
          'Ocp-Apim-Subscription-Key': subscriptionKey
        }
    };

    request.post(options, (error, response, body) => {
      if (error) {
        console.log('Error: ', error);
        return;
      }
      let jsonResponse = JSON.stringify(JSON.parse(body), null, '  ');
      returnData = jsonResponse;
    });
    return returnData;
}
于 2019-07-10T17:37:09.243 回答