Для работы с ml5.js необходимо подключить библиотеку к проекту. Наиболее простой способ — использование CDN. В HTML-файле подключение выполняется следующим образом:
Важно подключать p5.js перед ml5.js, так как ml5.js зависит от функционала p5.js для работы с изображениями и видео.
После подключения библиотек создается базовая структура для работы с видео-потоком и моделью Handpose:
let video;
let handpose;
let predictions = [];
function setup() {
createCanvas(640, 480);
video = createCapture(VIDEO);
video.size(width, height);
video.hide();
}
Модель Handpose позволяет детектировать руки и возвращает координаты
ключевых точек кисти (21 точка на каждую руку). Инициализация модели
выполняется с использованием метода ml5.handpose():
function setup() {
createCanvas(640, 480);
video = createCapture(VIDEO);
video.size(width, height);
video.hide();
handpose = ml5.handpose(video, modelReady);
handpose.on('predict', results => {
predictions = results;
});
}
Ключевые моменты:
video — объект видеопотока, используемый для
анализа.modelReady — callback-функция, вызываемая после
успешной загрузки модели.'predict' срабатывает каждый раз, когда модель
возвращает результаты анализа текущего кадра.Пример функции modelReady:
function modelReady() {
console.log('Handpose модель загружена и готова к работе.');
}
Каждое предсказание представляет собой объект с информацией о найденной руке:
[
{
landmarks: [
[x0, y0, z0], [x1, y1, z1], ..., [x20, y20, z20]
],
annotations: {
thumb: [[x, y, z], ...],
indexFinger: [[x, y, z], ...],
middleFinger: [[x, y, z], ...],
ringFinger: [[x, y, z], ...],
pinky: [[x, y, z], ...],
palmBase: [[x, y, z]]
}
}
]
landmarks — массив из 21 ключевой точки кисти, каждая
точка содержит координаты [x, y, z].annotations — структурированное представление точек по
пальцам и основанию ладони. Удобно использовать для построения скелета
руки и распознавания жестов.Для визуализации точек кисти используется функция draw()
в p5.js:
function draw() {
image(video, 0, 0, width, height);
for (let i = 0; i < predictions.length; i++) {
const hand = predictions[i];
drawKeypoints(hand.landmarks);
drawSkeleton(hand.annotations);
}
}
function drawKeypoints(landmarks) {
fill(0, 255, 0);
noStroke();
for (let i = 0; i < landmarks.length; i++) {
const [x, y, z] = landmarks[i];
ellipse(x, y, 10, 10);
}
}
function drawSkeleton(annotations) {
stroke(255, 0, 0);
strokeWeight(2);
for (let finger in annotations) {
const points = annotations[finger];
for (let i = 0; i < points.length - 1; i++) {
const [x1, y1] = points[i];
const [x2, y2] = points[i + 1];
line(x1, y1, x2, y2);
}
}
}
Особенности визуализации:
drawKeypoints отображает точки суставов кисти.drawSkeleton соединяет точки, создавая скелет
пальцев.annotations облегчает создание
интерактивных жестов.Handpose работает в реальном времени, но обработка каждого кадра может быть ресурсоемкой. Для оптимизации рекомендуется:
video = createCapture(VIDEO);
video.size(320, 240);
frameRate():frameRate(15); // 15 кадров в секунду
Модель Handpose предоставляет события, которые упрощают интеграцию с анимациями и взаимодействиями:
'predict' — возвращает массив предсказаний для текущего
кадра.'load' — событие загрузки модели.Пример использования события загрузки:
handpose.on('load', () => {
console.log('Модель загружена, можно запускать предсказания.');
});