Phát hiện chuyển động bằng thị giác máy tính – Cách hoạt động và logic phát hiện

phát hiện chuyển động bằng thị giác máy tính

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:

Hãy bỏ qua tất cả các vật thể không di chuyển, ví dụ như tranh vẽ. (Nguồn: Roboflow)

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:

  1. 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.
  2. 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.
  3. 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 đó.
  4. 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á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.

Tính năng phát hiện chuyển động cho camera thú cưng (Nguồn: Roboflow)

>> Xem thêm:

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:

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.

Ví dụ: Video thỏ với phát hiện chuyển động (Nguồn: Roboflow)

>> Xem thêm:

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 appviế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):

🌐 Website 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

Liên hệ

Bạn đã sẵn sàng chưa?

Cùng TOT bắt đầu hành trình xây dựng dự án ngay hôm nay!

Gửi tin nhắn cho chúng tôi. Chúng tôi sẽ đề xuất giải pháp để nâng tầm doanh nghiệp của bạn.

Sự khác biệt:

Đặt lịch tư vấn miễn phí