"InvalidImageSize", "message": "Размер изображения слишком мал."
Попытка использовать Microsoft Face API в Node.js, но я не могу загрузить локальные изображения. Что я делаю неправильно? Спасибо
Я подключаюсь к веб-камере и рисую видео на холст.
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."
}
}
Как еще я должен де / кодировать изображение?
1 ответ
"InvalidImageSize", "message": "Размер изображения слишком мал".
В соответствии с Face API - V1.0, мы могли бы знать, что Faces можно обнаружить, когда его размер составляет от 36x36 до 4096x4096 пикселей. Если необходимо определить очень маленькие, но четкие лица, попробуйте увеличить входное изображение. Если ваше изображение с четкими лицами, вы можете увеличить локальное изображение с помощью онлайн-инструмента.
Более высокое качество изображения лица означает лучшую точность распознавания и распознавания. Обратите внимание на качественные лица: фронтальный, четкий, размер лица составляет 200x200 пикселей (100 пикселей между глазами) или больше.
Поддерживаются форматы JPEG, PNG, GIF (первый кадр) и BMP. Допустимый размер файла изображения составляет от 1 КБ до 6 МБ.
Лица обнаруживаются при размере от 36x36 до 4096x4096 пикселей. Если необходимо определить очень маленькие, но четкие лица, попробуйте увеличить входное изображение.
Я знаю, что опаздываю сюда, но я нашел кое-что, что наверняка тебе поможет. К сожалению, API-интерфейсы Emotion и Face не поддерживают частичную передачу, как указано здесь. "Обходной путь" - это синхронная загрузка битов изображения перед отправкой веб-запроса. Фрагмент кода для этого должен быть таким:
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;
}