Latest Post

Khái niệm Low Code và kiến thức cơ bản về Low Code Khái niệm Web Development và lý do chọn nghề Web Developer

Để áp dụng OpenCV trong JavaScript và tính toán khoảng cách giữa hai điểm trong ảnh dựa trên bài toán bạn đề cập, bạn có thể thực hiện như sau:


Ý tưởng giải quyết bài toán

  1. Tính toán kích thước thực tế của một pixel (SS):
    • Dựa trên thông số của camera (FOV, khoảng cách ZZ, độ phân giải ảnh).
    • Công thức như đã đề cập: S=2⋅Z⋅tan⁡(FOV/2)ResolutionS = \frac{2 \cdot Z \cdot \tan(\text{FOV} / 2)}{\text{Resolution}}
    • Kết quả: SS là kích thước thực tế mỗi pixel.
  2. Chấm hai điểm trong ảnh (tọa độ pixel):
    • Người dùng chọn hai điểm trên ảnh, lưu tọa độ (x1,y1)(x_1, y_1) và (x2,y2)(x_2, y_2).
  3. Tính khoảng cách Euclidean giữa hai điểm trong ảnh: distance_pixels=(x2−x1)2+(y2−y1)2\text{distance\_pixels} = \sqrt{(x_2 – x_1)^2 + (y_2 – y_1)^2}
  4. Chuyển đổi khoảng cách pixel sang khoảng cách thực tế:
    • Khoảng cách thực tế: distance_real=distance_pixels⋅S\text{distance\_real} = \text{distance\_pixels} \cdot S

Triển khai với OpenCV.js

Dưới đây là ví dụ minh họa sử dụng OpenCV.js trong JavaScript:

Bước 1: Tải OpenCV.js

Bước 2: Code JavaScript

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Distance Calculation</title>
</head>
<body>
    <h1>Distance Between Two Points</h1>
    <canvas id="canvas" style="border:1px solid black;"></canvas>
    <p id="output"></p>

    <script async src="https://docs.opencv.org/4.x/opencv.js" type="text/javascript"></script>
    <script>
        // Tải ảnh lên canvas
        const canvas = document.getElementById('canvas');
        const ctx = canvas.getContext('2d');
        const image = new Image();
        image.src = 'your_image.jpg'; // Đường dẫn ảnh
        image.onload = () => {
            canvas.width = image.width;
            canvas.height = image.height;
            ctx.drawImage(image, 0, 0);
        };

        // Các thông số camera
        const Z = 50; // Khoảng cách từ camera đến vật thể (cm)
        const FOV = 70; // Góc nhìn ngang của camera (độ)
        const resolution = 1920; // Độ phân giải ngang của ảnh (pixel)
        const S = (2 * Z * Math.tan((FOV / 2) * Math.PI / 180)) / resolution; // Kích thước thực tế của một pixel

        // Chọn hai điểm
        const points = [];
        canvas.addEventListener('click', (e) => {
            const rect = canvas.getBoundingClientRect();
            const x = e.clientX - rect.left;
            const y = e.clientY - rect.top;
            points.push({ x, y });

            // Vẽ điểm lên ảnh
            ctx.beginPath();
            ctx.arc(x, y, 5, 0, 2 * Math.PI);
            ctx.fillStyle = 'red';
            ctx.fill();

            // Khi có đủ 2 điểm, tính khoảng cách
            if (points.length === 2) {
                const dx = points[1].x - points[0].x;
                const dy = points[1].y - points[0].y;
                const distancePixels = Math.sqrt(dx * dx + dy * dy);
                const distanceReal = distancePixels * S; // Chuyển đổi sang khoảng cách thực tế (cm)

                document.getElementById('output').innerText = `
                    Distance (pixels): ${distancePixels.toFixed(2)} pixels
                    Distance (real): ${distanceReal.toFixed(2)} cm
                `;
            }
        });
    </script>
</body>
</html>

Giải thích từng phần

  1. Canvas để hiển thị ảnh:
    • Người dùng có thể chấm hai điểm trên canvas.
    • Tọa độ x,yx, y được lấy từ sự kiện click (canvas.addEventListener('click')).
  2. Tính toán kích thước thực tế mỗi pixel (SS):
    • Dựa trên thông số camera (Z,FOV,ResolutionZ, FOV, \text{Resolution}).
  3. Tính khoảng cách giữa hai điểm:
    • Dựa trên công thức Euclidean: distance_pixels=(x2−x1)2+(y2−y1)2\text{distance\_pixels} = \sqrt{(x_2 – x_1)^2 + (y_2 – y_1)^2}
  4. Chuyển đổi khoảng cách sang thực tế:
    • Kích thước thực tế mỗi pixel (SS) được dùng để tính distance_real\text{distance\_real}.
  5. Hiển thị kết quả:
    • Khoảng cách pixel và khoảng cách thực tế (cm) được hiển thị ra màn hình.

Ưu điểm của OpenCV.js

Nếu bạn muốn tích hợp xử lý ảnh nâng cao (ví dụ: phát hiện vật thể, cải thiện độ chính xác), OpenCV.js có thể cung cấp nhiều công cụ mạnh mẽ hơn như:

  • Phát hiện cạnh (Canny Edge Detection).
  • Phát hiện vật thể bằng các thuật toán như Hough Circles, Contours.

Bạn có thể dễ dàng mở rộng mã nguồn để kết hợp các thuật toán này.

One thought on “Áp dụng OpenCV trong JavaScript và tính toán khoảng cách giữa hai điểm trong ảnh

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *