Với hướng dẫn dưới đây, bạn sẽ hiểu được cách phát hiện chuyển động bằng thị giác máy tính trong video. Đây là một demo trực tuyến để bạn thử nghiệm.
Các mô hình phát hiện đối tượng có thể được sử dụng trên nguồn cấp video trực tiếp, video đã ghi sẵn, video YouTube, webcam, v.v. Giả sử bạn không muốn phát hiện tất cả các đối tượng trong video, bạn chỉ muốn phát hiện các đối tượng đang chuyển động.
>> Xem thêm:
- Trí tuệ nhân tạo (AI) là gì? Hiểu đúng về khái niệm & ứng dụng
- AI tạo sinh là gì? Cách hoạt động và Ứng dụng thực tế
- Các Nhiệm Vụ Của Thị Giác Máy Tính và cách thực hiện chúng nhanh chóng
- Mẹo tạo prompt cho LLM trong thị giác máy tính để tăng độ chính xác
Các trường hợp sử dụng tính năng phát hiện chuyển động (Motion Detection)
Bạn có thể muốn có một camera an ninh và không nhận diện các đối tượng nằm ở nền hoặc bạn có thể muốn thiết lập cảnh báo với camera theo dõi thú cưng để thông báo cho bạn khi thú cưng của bạn có thể gặp rắc rối (hoặc làm điều gì đó dễ thương).
Trong ví dụ trên, người thử nghiệm đang chạy một mô hình phát hiện đối tượng từ Roboflow Universe và chỉ muốn chạy nó trên các đối tượng đang chuyển động.
Cách thức hoạt động
Ở mức độ tổng quan, đây là cách thực hiện:
- Bạn khởi động công cụ inferenceJS như bình thường nhưng chạy riêng một hàm mới là captureMotion.
- captureMotion sẽ xem lại khung hình trước đó và khung hình hiện tại, sau đó tạo một khung chứa tất cả các điểm khác biệt được phát hiện vượt quá một ngưỡng nhất định.
- Sau đó, quá trình phát hiện đối tượng sẽ được lọc xuống chỉ còn những gì nằm trong khung đó.
- Quá trình này lặp lại mỗi 500 mili giây.
Bạn bắt đầu bằng cách thêm hàm setInterval trước khi tiến trình xử lý bắt đầu.
video.onplay = function() {
setInterval(captureMotion, 500);
inferEngine.startWorker(model_name, model_version, publishable_key, [{ scoreThreshold: confidence_threshold }])
.then((id) => {
// Start inference
detectFrame();
});
}
>> Xem thêm:
- Cách tạo ứng dụng AI với vibe coding trên Google AI Studio đơn giản
- TOP 10 AI thiết kế website miễn phí, trả phí, hiệu quả
Các biến toàn cục
Chúng ta sẽ thêm một loạt các biến có thể điều chỉnh. Nói chung, bạn chỉ muốn thay đổi pixelDiffThreshold và scoreThreshold.
pixelDiffThreshold có thể được coi là mức chênh lệch trước khi bạn xem xét đó là một sự thay đổi đã xảy ra.
scoreThreshold có thể được coi là số lần một sự khác biệt đã xảy ra.
// The canvas's are made and prepped for differencing
var isReadyToDiff = false;
// The pixel area of change
var diffWidth = 64;
var diffHeight = 48;
// Change these based on your preference of motion
var pixelDiffThreshold = 32;
var scoreThreshold = 16;
// The dict containing the box dimensions, width, and height to draw
var currentMotionBox;
// A canvas for just the difference calculation
var diffCanvas = document.createElement('canvas');
diffCanvas.width = diffWidth;
diffCanvas.height = diffHeight;
var diffContext = diffCanvas.getContext('2d', { willReadFrequently: true });
Hãy tạm dừng một chút và xem ví dụ video về mèo trước khi tiếp tục.
>> Xem thêm:
- Mã nguồn mở là gì? TOP 15 nền tảng mã nguồn mở thiết kế web phổ biến nhất hiện nay
- 18 cách ứng dụng AI cho ecommerce đạt hiệu quả cao
- Viết app Android/iOS dễ dàng, không cần biết lập trình
Logic phát hiện chuyển động
Đây là captureMotion mà không có bất kỳ đoạn code vẽ khung bổ sung nào. Chúng ta nhận được một hình ảnh đại diện cho sự khác biệt giữa các khung hình, thu nhỏ hình ảnh vào một canvas với kích thước diffWidth và diffHeight, và cuối cùng đưa nó vào một mảng để so sánh.
function captureMotion() {
diffContext.globalCompositeOperation = 'difference';
diffContext.drawImage(video, 0, 0, diffWidth, diffHeight);
var diffImageData = diffContext.getImageData(0, 0, diffWidth, diffHeight);
if (isReadyToDiff) {
var diff = processDiff(diffImageData);
if (diff.motionBox) {
// Draw rectangle
}
currentMotionBox = diff.motionBox;
}
}
Sau đó, chúng ta xử lý sự khác biệt với processDiff để xác định liệu có chuyển động xảy ra không và thiết lập motionBox nếu có trả về kết quả.
Nếu điểm số vượt quá scoreThreshold đã đặt của bạn, một chuyển động được phát hiện và nó được trả về. Phần còn lại của code chỉ là xác định kích thước khung và trả về giá trị đó.
function processDiff(diffImageData) {
var rgba = diffImageData.data;
// Pixel adjustments are done by reference directly on diffImageData
var score = 0;
var motionPixels = [];
var motionBox = undefined;
for (var i = 0; i < rgba.length; i += 4) {
var pixelDiff = rgba[i] * 0.3 + rgba[i + 1] * 0.6 + rgba[i + 2] * 0.1;
var normalized = Math.min(255, pixelDiff * (255 / pixelDiffThreshold));
rgba[i] = 0;
rgba[i + 1] = normalized;
rgba[i + 2] = 0;
if (pixelDiff >= pixelDiffThreshold) {
score++;
coords = calculateCoordinates(i / 4);
motionBox = calculateMotionBox(motionBox, coords.x, coords.y);
motionPixels = calculateMotionPixels(motionPixels, coords.x, coords.y, pixelDiff);
}
}
return {
score: score,
motionBox: score > scoreThreshold ? motionBox : undefined,
motionPixels: motionPixels
};
}
>> Xem thêm:
- Inference In Computer Vision: Suy luận trong thị giác máy tính là gì?
- Cách ứng dụng AI tối ưu trải nghiệm khách hàng
- Hướng dẫn tạo app bằng Low Code đơn giản, hiệu quả nhất
Vẽ khung chứa phát hiện chuyển động
Tất cả code đã có, nhưng chúng ta vẫn phải thực hiện việc lọc thực tế. Điều đó được thực hiện ở cấp độ vẽ.
Tóm lại, nếu chuyển động được phát hiện và dự đoán nằm trong khung được tạo ra, hãy hiển thị dự đoán đó.
function drawBoundingBoxes(predictions, ctx) {
if (currentMotionBox != undefined) {
// Draw motionBox
for (var i = 0; i < predictions.length; i++) {
if (confidence < user_confidence || !isCornerInside(motion_x, motion_y, motion_width, motion_height, x, y, width, height)) {
continue;
}
Đây là video ví dụ cuối cùng với những chú thỏ. Chúng có xu hướng đứng yên và đột nhiên di chuyển nên việc phát hiện chuyển động có thể được thể hiện rõ ràng.
>> Xem thêm:
- Xây dựng quy trình Vision AI nghiên cứu khoa học
- Top 7 Công cụ Theo dõi Đối tượng Mã nguồn mở Tốt Nhất
Kết luận
Quy trình phát hiện chuyển động bằng thị giác máy tính hơi khó hiểu nhưng sẽ dễ nắm bắt hơn nhiều nếu bạn thực hành với code và thay đổi mọi thứ để xem chúng làm gì. Bạn có thể thử các mô hình khác nhau và thay đổi các thanh trượt cho “Ngưỡng Khác Biệt Pixel” và “Ngưỡng Số Pixel Thay Đổi” và xem cách chúng thay đổi việc phát hiện chuyển động.
Nguồn tham khảo: Motion Detection with Computer Vision
TOT là đơn vị tiên phong trong hành trình chuyển đổi số. Chúng tôi mang đến giải pháp thiết kế website, mobile app và viết phần mềm theo yêu cầu với dịch vụ linh hoạt, tối ưu theo đúng nhu cầu của doanh nghiệp.
Lấy cảm hứng từ triết lý “Công nghệ vì con người”, TOT giúp doanh nghiệp vận hành hiệu quả hơn, nâng tầm trải nghiệm khách hàng và tạo dấu ấn bền vững cho thương hiệu.
Thông tin liên hệ TopOnTech (TOT):
📞 Hotline/WhatsApp/Zalo: 0906 712 137
✉️ Email: long.bui@toponseek.com
🏢 Địa chỉ: 31 Đường Hoàng Diệu, Phường Xóm Chiếu, TP. Hồ Chí Minh, Việt Nam