Создание видеопотока
Объект p5.VideoCapture представляет потоковое видео с
камеры пользователя и является частью библиотеки p5.js. Он обеспечивает
доступ к видеопотоку в реальном времени и позволяет интегрировать его с
функциями машинного обучения в ml5.js. Создание видеопотока выполняется
с помощью функции createCapture().
let video;
function setup() {
createCanvas(640, 480);
video = createCapture(VIDEO);
video.size(640, 480);
video.hide(); // скрывает стандартный HTML-элемент видео
}
Ключевые моменты при работе с
p5.VideoCapture:
VIDEO как параметр функции createCapture()
указывает на использование камеры.hide() нужен для того, чтобы работать с
видеопотоком как с изображением на канвасе, а не как с
HTML-элементом.size(width, height); это важно для точного сопоставления
входных данных с моделями ml5.js.Использование HTMLVideoElement в контексте
ml5.js
HTMLVideoElement является стандартным элементом HTML
<video> и также может быть источником данных для
моделей ml5.js. Использование напрямую позволяет работать с видеофайлами
или потоками, не создавая объект p5.js, что полезно в случаях, когда
требуется контроль над HTML и DOM.
const videoElement = document.createElement('video');
videoElement.src = 'video.mp4';
videoElement.autoplay = true;
videoElement.loop = true;
videoElement.width = 640;
videoElement.height = 480;
document.body.appendChild(videoElement);
Взаимодействие с ml5.js
Большинство моделей ml5.js (например,
ml5.imageClassifier, ml5.poseNet,
ml5.handpose) могут принимать как
p5.VideoCapture, так и HTMLVideoElement в
качестве источника изображений. Пример использования модели
классификации:
let classifier;
let video;
function setup() {
createCanvas(640, 480);
video = createCapture(VIDEO);
video.hide();
classifier = ml5.imageClassifier('MobileNet', video, modelReady);
}
function modelReady() {
console.log('Модель загружена');
classifyVideo();
}
function classifyVideo() {
classifier.classify(gotResult);
}
function gotResult(error, results) {
if (error) {
console.error(error);
return;
}
console.log(results[0].label, results[0].confidence);
classifyVideo(); // постоянная классификация в цикле
}
Сравнение p5.VideoCapture и
HTMLVideoElement
| Свойство | p5.VideoCapture |
HTMLVideoElement |
|---|---|---|
| Источник | Камера | Камера, видеофайл, поток |
| Интеграция с p5.js | Полная | Требует обертки через createCapture или
loadPixels |
| Скрытие потока | video.hide() |
CSS display:none или canvas |
| Совместимость с ml5.js | Прямая | Прямая, через DOM элемент |
| Управление размером | video.size(w, h) |
video.width, video.height или CSS |
Оптимизация потокового видео
При использовании видеопотока важно учитывать нагрузку на браузер:
frameRate(fps) позволяет управлять количеством кадров,
обрабатываемых в секунду.video.loadPixels() позволяет
работать с отдельными пикселями для кастомной обработки до подачи данных
в ml5.js.function draw() {
video.loadPixels();
image(video, 0, 0); // отображение на канвасе
}
Синхронизация с моделями ml5.js
Для корректной работы моделей с видеопотоком важно:
video.loadedmetadata или
modelReady для моделей).draw() или через рекурсивные функции
поддерживать поток классификации или детекции.Пример работы с HTMLVideoElement и ml5.js
const videoElement = document.createElement('video');
videoElement.src = 'video.mp4';
videoElement.autoplay = true;
videoElement.loop = true;
videoElement.width = 640;
videoElement.height = 480;
document.body.appendChild(videoElement);
const classifier = ml5.imageClassifier('MobileNet', videoElement, () => {
console.log('Модель готова к работе с HTMLVideoElement');
});
function classifyVideo() {
classifier.classify((err, results) => {
if (err) {
console.error(err);
return;
}
console.log(results[0].label, results[0].confidence);
requestAnimationFrame(classifyVideo); // рекурсивный вызов для непрерывной классификации
});
}
videoElement.onp lay = classifyVideo;
Особенности обработки потокового видео
p5.VideoCapture) всегда актуален в
реальном времени, поэтому задержка минимальна.<video> может иметь буферизацию,
задержку или пропущенные кадры, что следует учитывать при детекции
движения или поз.Интеграция с другими функциями ml5.js
Объекты видео часто комбинируются с:
ml5.poseNet(video, modelReady) для отслеживания позы
человека.ml5.handpose(video, modelReady) для детекции
кистей.ml5.objectDetector('cocossd', video, modelReady) для
распознавания объектов в кадре.Такой подход обеспечивает гибкость в обучении моделей и создании интерактивных приложений на базе браузера, позволяя сочетать прямую работу с камерой и воспроизведение видеофайлов без ограничения функционала ml5.js.