尝试在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."
}
}
我还应该如何对图像进行解码/编码?
答案 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