Canvas является ключевым элементом для визуализации данных, получаемых при детекции объектов с помощью ml5.js. Основная цель — отображение обнаруженных объектов, их рамок, меток и вероятностей в реальном времени.
Для начала необходимо создать элемент в
HTML и получить его контекст в Jav * aScript:
const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d');
canvas.width = 640;
canvas.height = 480;
Важно: размеры canvas должны соответствовать размеру видео или изображения, которое анализируется, чтобы результаты детекции не искажались.
После получения результатов детекции, каждый объект содержит
координаты и размеры рамки (x, y,
width, height). Для отображения рамки
используется метод strokeRect:
ctx.strokeStyle = 'red';
ctx.lineWidth = 2;
ctx.strokeRect(object.x, object.y, object.width, object.height);
Ключевые моменты:
strokeStyle задаёт цвет рамки.lineWidth определяет толщину линии.x и y соответствуют верхнему
левому углу объекта на изображении.Для информативной визуализации рекомендуется выводить название класса
объекта и вероятность детекции. Для этого используется метод
fillText:
ctx.font = '16px Arial';
ctx.fillStyle = 'white';
ctx.fillText(`${object.label} (${(object.confidence * 100).toFixed(1)}%)`, object.x + 5, object.y - 5);
Особенности:
object.label — название класса (например, “person”,
“cat”).object.confidence — вероятность детекции в диапазоне
0–1.+5, -5)
предотвращает наложение текста на рамку.Чтобы избежать наложения старых и новых результатов, canvas очищается перед рисованием:
ctx.clearRect(0, 0, canvas.width, canvas.height);
Примечание: этот метод удаляет все предыдущие элементы на canvas, поэтому отрисовка видео и объектов должна выполняться после очистки.
При работе с видео детекция объектов обычно выполняется в цикле
requestAnimationFrame, что обеспечивает плавную
визуализацию:
function drawFrame() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
detections.forEach(object => {
ctx.strokeStyle = 'red';
ctx.lineWidth = 2;
ctx.strokeRect(object.x, object.y, object.width, object.height);
ctx.font = '16px Arial';
ctx.fillStyle = 'white';
ctx.fillText(`${object.label} (${(object.confidence * 100).toFixed(1)}%)`, object.x + 5, object.y - 5);
});
requestAnimationFrame(drawFrame);
}
drawFrame();
Ключевые моменты:
ctx.drawImage отображает текущий кадр видео на
canvas.detections обновляется после каждого вызова
модели детекции ml5.js.Для улучшения читаемости можно использовать разные цвета рамок для различных классов:
const colors = {
person: 'blue',
cat: 'green',
dog: 'orange'
};
ctx.strokeStyle = colors[object.label] || 'red';
Дополнительно можно добавлять прозрачные заливки внутри рамок:
ctx.fillStyle = 'rgba(255, 0, 0, 0.2)';
ctx.fillRect(object.x, object.y, object.width, object.height);
Эффект: прозрачная заливка помогает визуально отделять объекты, не закрывая фон.
При работе с видео высокой частоты кадров важно:
requestAnimationFrame вместо
setInterval.Эти меры обеспечивают плавную анимацию и своевременное обновление результатов.