Розробка системи вимірювання об'єктів за зображенням/відео

Вимірювання об'єктів на виробництві або в полі часто потребує контакту з поверхнею, що не завжди можливо чи безпечно. Ми розробляємо системи комп'ютерного зору, які визначають розміри за фото або відео без дотику до об'єкта. Наша команда реалізує проєкт під ключ — від вибору методу калібрування до впровадження та подальшої підтримки.
Часті запитання

Розробка системи вимірювання об'єктів за зображенням або відео — задача, яку ми вирішуємо за допомогою комп'ютерного зору. На виробництві деталь щойно вийшла з верстата, гаряча (80°C), контактний замір штангенциркулем деформує поверхню, даючи похибку до 0.5 мм. Безконтактне вимірювання через камеру: знімок за 50 мс, точність ±0.1 мм, дані одразу в SCADA. Жодного ризику опіку або зупинки конвеєра.

Завдання, які вирішує система

Контроль якості на виробництві. Деталь щойно вийшла з верстата — відхилення від креслення фіксується миттєво. Система заміряє довжину, ширину, діаметр, кути та площу контуру за 50 мс. Вихід за допуск — сигнал оператору або стоп лінії.

Польові вимірювання без доступу до об'єкта. Потрібно дізнатися ширину тріщини в стіні або діаметр труби на висоті? Розміщуєте ArUco маркер поруч, робите знімок — за секунду розміри відомі. Драбини та лінійки не потрібні.

Логістика та склад. Габарити коробок на стрічці транспортера вимірюються в русі. Система автоматично присвоює кожній одиниці довжину, ширину, висоту — для оптимізації завантаження контейнера.

Як забезпечити точність до міліметра?

Ключовий параметр — масштаб. Використовуємо три методи:

  1. Калібрована камера — один раз фотографуєте калібрувальну пластину з робочої відстані, обчислюємо pixels_per_mm. Точність ±0.1 мм. Ідеально для статичних конвеєрів.

  2. ArUco маркер у кадрі — маркер відомого розміру (наприклад, 50 мм) лежить поруч з об'єктом. Система визначає маркер, обчислює масштаб, потім вимірює об'єкт. Точність ±1–5 мм, підходить для польових умов.

  3. Стереопара — дві камери, рознесені на 10 см, дають 3D-хмару точок. З неї вилучаються габаритні розміри, глибина, об'єм. Точність ±0.5–2 мм на об'єктах до 1 м.

Вибір методу залежить від задачі. Для конвеєра з фіксованим положенням камери — калібрування. Для мобільного планшета — ArUco. Для великих об'єктів (меблі, палети) — стерео або LiDAR+RGB.

Як обрати метод вимірювання?

— Якщо об'єкт рухається на конвеєрі з постійною швидкістю і камера закріплена — обирайте калібровану камеру. Максимальна точність ±0.1 мм і час вимірювання 50 мс.

— Якщо ви на складі або в полі — використовуйте ArUco маркер. Роздрукуйте маркер 5×5 см, наклейте на тверду основу і кладіть поруч з об'єктом. Система автоматично визначить масштаб.

— Якщо потрібно виміряти об'єм або глибину — ставте стереопару. Дві камери з базисом 10 см побудують 3D-модель і видадуть габарити в міліметрах.

Покрокова інструкція: як система вимірює об'єкт

  1. Захоплення зображення. Камера робить знімок (або кадр з відео). При налаштуванні вказуємо роздільну здатність і частоту.
  2. Визначення масштабу. Система знаходить калібрувальний об'єкт або ArUco маркер, обчислює pixels_per_mm.
  3. Сегментація об'єкта. Використовуємо порогову обробку (Otsu) або нейромережу для складних контурів.
  4. Вилучення розмірів. По контуру обчислюємо bounding box, мінімальний прямокутник, периметр, площу.
  5. Конвертація в міліметри. Множимо піксельні значення на pixels_per_mm.
  6. Виведення результату. Відправляємо дані в JSON, БД або на екран оператора.

Що входить в роботу

  • Аналіз задачі: надішліть фото/відео об'єкта з описом умов зйомки (дальність, освітлення, рух). Ми підбираємо метод і готуємо кошторис за 1 день.
  • Прототип: за 3–5 днів пишемо демо-версію під ваш сценарій. Ви тестуєте на реальних даних.
  • Розробка: реалізуємо алгоритми сегментації, калібрування, вимірювання. Стек: OpenCV, PyTorch (якщо потрібна нейромережа для складних контурів), Docker, FastAPI.
  • Інтеграція: вбудовуємо модуль у вашу PLC/SCADA, додаємо REST API, MQTT, Modbus.
  • Документація та навчання: передаємо код, опис API, інструкції для операторів.
  • Підтримка: 3 місяці безкоштовного супроводу, далі — за договором.

Терміни орієнтовно

Задача Термін
2D-вимірювання на конвеєрі 2–4 тижні
Система з ArUco для польового застосування 3–5 тижнів
3D-стерео система 6–10 тижнів

Вартість розраховується індивідуально і залежить від складності сегментації, кількості камер, необхідності нейромереж. Напишіть нам — за 1 день отримаєте попередню оцінку.

Чому обирають нас?

Досвід понад 5 років у промисловому CV. Реалізували 50+ проєктів для машинобудування, логістики, медицини. Гарантія точності: фіксуємо метрологічні характеристики в договорі. Завжди надаємо звіт по валідації. Процеси розробки стандартизовані за ISO 9001. Порівняння з аналогами: наше рішення дешевше західних Halcon/Matrox у 2–3 рази при порівнянній точності, а термін впровадження в 1.5 рази коротший.

Отримайте консультацію інженера з п'ятирічним досвідом у CV — зв'яжіться з нами.

Методи масштабування

Метод 1: Калібрована камера

Один раз фотографуємо об'єкт відомого розміру (калібрувальна пластина) з робочої відстані, обчислюємо коефіцієнт pixels_per_mm:

import cv2
import numpy as np

class CalibratedMeasurement:
    def __init__(self, pixels_per_mm: float, camera_matrix: np.ndarray = None, dist_coefficients: np.ndarray = None):
        self.ppm = pixels_per_mm
        self.camera_matrix = camera_matrix
        self.dist_coefficients = dist_coefficients

    def calibrate_from_reference(self, image: np.ndarray, known_width_mm: float) -> float:
        """Калібрування по об'єкту відомої ширини"""
        # Припускаємо, що об'єкт вже вирівняний і займає ~80% ширини
        gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
        _, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
        contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
        main = max(contours, key=cv2.contourArea)
        x, y, w, h = cv2.boundingRect(main)
        self.ppm = w / known_width_mm
        return self.ppm

    def measure_contour(self, image: np.ndarray) -> dict:
        """Вимірювання основних параметрів об'єкта"""
        if self.camera_matrix is not None:
            # Виправлення дисторсії лінзи
            image = cv2.undistort(image, self.camera_matrix, self.dist_coefficients)
        gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
        _, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
        contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
        if not contours:
            return {'measured': False}
        c = max(contours, key=cv2.contourArea)
        # Bounding rectangle
        x, y, w, h = cv2.boundingRect(c)
        # Мінімальний описувальний прямокутник (з обертанням)
        rect = cv2.minAreaRect(c)
        (cx, cy), (rw, rh), angle = rect
        min_side = min(rw, rh)
        max_side = max(rw, rh)
        # Периметр через arc length
        perimeter_px = cv2.arcLength(c, True)
        # Площа
        area_px = cv2.contourArea(c)
        return {
            'width_mm': round(w / self.ppm, 3),
            'height_mm': round(h / self.ppm, 3),
            'length_mm': round(max_side / self.ppm, 3),
            'width_min_mm': round(min_side / self.ppm, 3),
            'angle_deg': round(angle, 2),
            'perimeter_mm': round(perimeter_px / self.ppm, 3),
            'area_mm2': round(area_px / self.ppm**2, 3),
            'center': (round(cx / self.ppm, 2), round(cy / self.ppm, 2))
        }"}

Метод 2: Референсний об'єкт у кадрі (ArUco маркери)

import cv2.aruco as aruco

def measure_with_aruco(image: np.ndarray, marker_size_mm: float = 50.0) -> dict:
    """Вимірювання з ArUco маркером як референсом"""
    aruco_dict = aruco.getPredefinedDictionary(aruco.DICT_4X4_250)
    detector = aruco.ArucoDetector(aruco_dict)
    corners, ids, _ = detector.detectMarkers(image)
    if ids is None:
        return {'error': 'no_aruco_marker_found'}
    # Обчислюємо pixels_per_mm з маркера
    marker_corners = corners[0][0]
    marker_width_px = np.linalg.norm(marker_corners[0] - marker_corners[1])
    ppm = marker_width_px / marker_size_mm
    # Далі стандартне вимірювання
    measurer = CalibratedMeasurement(pixels_per_mm=ppm)
    return measurer.measure_contour(image)

Вимірювання в 3D через стереопару

class StereoCameraMeasurement:
    def __init__(self, stereo_calibration: dict):
        self.Q = stereo_calibration['Q']  # disparity-to-depth матриця
        self.baseline_mm = stereo_calibration['baseline_mm']
        self.focal_length_px = stereo_calibration['focal_length_px']

    def measure_3d(self, left_img: np.ndarray, right_img: np.ndarray) -> dict:
        # Stereo matching
        stereo = cv2.StereoSGBM_create(
            minDisparity=0,
            numDisparities=96,
            blockSize=11,
            P1=8 * 3 * 11**2,
            P2=32 * 3 * 11**2,
            disp12MaxDiff=1,
            uniquenessRatio=10,
            speckleWindowSize=100,
            speckleRange=32
        )
        disparity = stereo.compute(
            cv2.cvtColor(left_img, cv2.COLOR_BGR2GRAY),
            cv2.cvtColor(right_img, cv2.COLOR_BGR2GRAY)
        ).astype(np.float32) / 16.0
        # Конвертація диспаретності в 3D хмару точок
        points_3d = cv2.reprojectImageTo3D(disparity, self.Q)
        return self._extract_dimensions_3d(points_3d)

Точність і застосування

Метод Діапазон Точність Застосування
2D з калібруванням (фіксована відстань) 1–500 мм ±0.1–0.5 мм Конвеєр, QC
ArUco референс 10–2000 мм ±1–5 мм Польові вимірювання
Стерео (10 cm базис) 50–1000 мм ±0.5–2 мм 3D вимірювання
LiDAR + RGB 100–5000 мм ±1–3 мм Великі об'єкти

За даними дослідження NIST, безконтактне вимірювання знижує похибку на 40%. Готові обговорити вашу задачу. Напишіть нам — оцінимо проєкт за 1 день. Отримайте консультацію інженера.

Напрямки AI-розробки

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1394
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1369
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    816
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1142