“ InvalidImageSize”,“消息”:“图像大小太小。”

时间:2018-07-20 01:02:12

标签: javascript azure face-api

尝试在Node.js中使用Microsoft的Face 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."
  }
}

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

2 个答案:

答案 0 :(得分:0)

  

“ InvalidImageSize”,“消息”:“图像大小太小。”

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

  
      
  • 更高的面部图像质量意味着更好的检测和识别精度。请考虑使用高质量的面孔:正面,清晰且面孔尺寸为200x200像素(两眼之间为100像素)或更大。

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

  •   
  • 当面孔的大小为 36x36 4096x4096 像素时,可以检测到面孔。如果需要检测很小但清晰的面部,请尝试放大输入图像。

  •   

答案 1 :(得分:0)

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

@app.route("/status/<status_id>", methods=['GET'])
def get_status(status_id):
    data = [{
        "id": 5,
        "name": "Meghan"
    },
        {
            "id": 6,
            "name": "Julia"
        }
    ]
    name = None
    for entry in data:
        if entry['id'] == status_id:
            name = entry['name']
            break
    if name is not None:
        print('The name for status_id {} is {}'.format(status_id,name))
        return name, 200
        # or, if you want to return both use Flask jsonify and send a dict
        # see http://flask.pocoo.org/docs/1.0/api/#flask.json.jsonify
    else:
        print('Can not find a name for status id {}'.format(status_id))
        return "Not Found in Dictionary", 404