מערכת מדידת עצמים מתמונות/וידאו

מדידת עצמים בקו הייצור או בשטח דורשת לעיתים קרובות מגע עם המשטח, דבר שלא תמיד אפשרי או בטוח. אנחנו מפתחים מערכות ראייה ממוחשבת הקובעות ממדים מתמונות או וידאו ללא מגע עם העצם. הצוות שלנו מספק את הפרויקט במפתח מלא—מבחירת שיטת הכיול ועד להטמעה ולתמיכה שוטפת.

תחומי פיתוח AI

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1365
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1330
  • עיצוב לוגו לחברת B2B Advance
    עיצוב לוגו לחברת B2B Advance
    776
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1077
  • פיתוח לוגו חברת AIDER
    פיתוח לוגו חברת AIDER
    1022
  • פיתוח CRM עבור Chasseurs
    פיתוח CRM עבור Chasseurs
    1113

פיתוח מערכת מדידת עצמים מתמונות או וידאו

זוהי משימה שאנו פותרים באמצעות ראייה ממוחשבת. בפס ייצור, חלק בדיוק יצא מהמכונה — חם (80°C). מדידת מגע עם מד קליבר מעוותת את פני השטח, וגורמת לשגיאה של עד 0.5 מ"מ. מדידה ללא מגע באמצעות מצלמה: צילום בודד ב-50 אלפיות השנייה, דיוק ±0.1 מ"מ, נתונים ישירות ל-SCADA. אין סיכון לכוויות או לעצירת פס הייצור.

בעיות שאנו פותרים

בקרת איכות בפס הייצור. החלק בדיוק יצא מהמכונה — סטיות מהשרטוט מתגלות באופן מיידי. המערכת מודדת אורך, רוחב, קוטר, זוויות ושטח קו מתאר ב-50 אלפיות השנייה. חריגה מהסבילות מפעילה אזעקה או עצירת פס.

מדידות שטח ללא גישה לעצם. צריך לדעת את רוחב סדק בקיר או קוטר צינור בגובה? הצב סמן ArUco לידו, צלם — תוך שנייה המידות ידועות. אין צורך בסולמות ובסרגלים.

לוגיסטיקה ומחסן. מידות ארגזים על מסוע נמדדות תוך כדי תנועה. המערכת מקצה אוטומטית אורך, רוחב וגובה לכל יחידה — תוך אופטימיזציה של העמסת מכולות.

כיצד להבטיח מדידות בדיוק מילימטרי

הפרמטר המרכזי הוא קנה מידה. אנו משתמשים בשלוש שיטות:

  1. מצלמה מכוילת — צלם לוח כיול פעם אחת ממרחק העבודה, חשב pixels_per_mm. דיוק ±0.1 מ"מ. אידיאלי למסועים סטטיים.

  2. סמן ArUco בפריים — סמן בגודל ידוע (לדוגמה, 50 מ"מ) מוצב ליד העצם. המערכת מזהה את הסמן, מחשבת את קנה המידה, ואז מודדת את העצם. דיוק ±1–5 מ"מ, מתאים לתנאי שטח.

  3. זוג סטריאו — שתי מצלמות במרחק 10 ס"מ זו מזו מייצרות ענן נקודות תלת-ממדי. מתוכו אנו מחלצים מידות כלליות, עומק ונפח. דיוק ±0.5–2 מ"מ על עצמים עד 1 מ'.

בחירת השיטה תלויה במשימה. למסוע עם מיקום מצלמה קבוע — כיול. לטאבלט נייד — ArUco. לעצמים גדולים (רהיטים, משטחים) — סטריאו או LiDAR+RGB.

כיצד לבחור את שיטת המדידה?

  • אם העצם נע על מסוע במהירות קבועה והמצלמה קבועה — בחר מצלמה מכוילת. דיוק מקסימלי ±0.1 מ"מ וזמן מדידה של 50 אלפיות השנייה.

  • אם אתה במחסן או בשטח — השתמש בסמן ArUco. הדפס סמן בגודל 5×5 ס"מ, הדבק אותו על בסיס קשיח, והצב אותו ליד העצם. המערכת תקבע אוטומטית את קנה המידה.

  • אם אתה צריך למדוד נפח או עומק — השתמש בזוג סטריאו. שתי מצלמות עם בסיס של 10 ס"מ בונות מודל תלת-ממדי ומוציאות מידות במילימטרים.

שלב אחר שלב: כיצד המערכת מודדת עצם

  1. לכידת תמונה. המצלמה מצלמת תמונת מצב (או פריים מווידאו). רזולוציה וקצב פריימים מוגדרים.
  2. קביעת קנה מידה. המערכת מוצאת את עצם הכיול או סמן ArUco, ומחשבת pixels_per_mm.
  3. פילוח עצם. אנו משתמשים בסף (Otsu) או ברשת עצבית לקווי מתאר מורכבים.
  4. חילוץ מידות. מתוך קו המתאר אנו מחשבים תיבה חוסמת, מלבן מינימלי, היקף ושטח.
  5. המרה למילימטרים. הכפל ערכי פיקסלים ב-pixels_per_mm.
  6. פלט תוצאה. שלח נתונים כ-JSON, למסד נתונים, או למסך המפעיל.

מה כוללת העבודה

  • ניתוח משימה: שלח לנו תמונה/וידאו של העצם עם תנאי הצילום (מרחק, תאורה, תנועה). אנו בוחרים את השיטה ומכינים הערכת עלות תוך יום אחד.
  • אב טיפוס: תוך 3–5 ימים אנו בונים גרסת הדגמה לתרחיש שלך. אתה בודק אותה על נתונים אמיתיים.
  • פיתוח: אנו מיישמים אלגוריתמי פילוח, כיול ומדידה. מחסן טכנולוגיות: OpenCV, PyTorch (אם יש צורך ברשת עצבית לקווי מתאר מורכבים), Docker, FastAPI.
  • אינטגרציה: הטמע את המודול ב-PLC/SCADA שלך, הוסף REST API, MQTT, Modbus.
  • תיעוד והדרכה: מסירת קוד, תיאור API, הוראות למפעיל.
  • תמיכה: 3 חודשי תמיכה חינם, ולאחר מכן לפי חוזה.

לוחות זמנים (משוערים)

משימה משך זמן
מדידה דו-ממדית על מסוע 2–4 שבועות
מערכת עם ArUco לשימוש בשטח 3–5 שבועות
מערכת סטריאו תלת-ממדית 6–10 שבועות

העלות מחושבת באופן פרטני ותלויה במורכבות הפילוח, מספר המצלמות והצורך ברשתות עצביות. כתוב לנו — ניתן הערכת עלות ראשונית תוך יום אחד.

למה לבחור בנו?

למעלה מ-10 שנות ניסיון ב-CV תעשייתי. יישמנו 50+ פרויקטים להנדסת מכונות, לוגיסטיקה ורפואה. ערבות לדיוק: אנו רושמים מאפיינים מטרולוגיים בחוזה. אנו תמיד מספקים דוח אימות. תהליכי הפיתוח מתוקננים לפי ISO 9001. בהשוואה לפתרונות מערביים כמו Halcon/Matrox, הפתרון שלנו זול פי 2–3 עם דיוק דומה, וזמן היישום קצר פי 1.5.

הלקוחות שלנו חוסכים עד $18k–26k בשנה על בקרת איכות. לדוגמה, לקוח אחד צמצם את זמן הבדיקה ב-80%, שזה שווה ערך לחיסכון של כ-$14k–20k בשנה. קבל ייעוץ ממהנדס עם 10+ שנות ניסיון ב-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)

מדידה תלת-ממדית באמצעות זוג סטריאו

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)

דיוק ויישומים

שיטה טווח דיוק יישום
דו-ממד עם כיול (מרחק קבוע) 1–500 מ"מ ±0.1–0.5 מ"מ מסוע, בקרת איכות
ייחוס ArUco 10–2000 מ"מ ±1–5 מ"מ מדידות שטח
סטריאו (בסיס 10 ס"מ) 50–1000 מ"מ ±0.5–2 מ"מ מדידה תלת-ממדית
LiDAR + RGB 100–5000 מ"מ ±1–3 מ"מ עצמים גדולים

לפי מחקר של NIST, מדידה ללא מגע מפחיתה שגיאה ב-40%. מוכנים לדון במשימה שלך. כתוב לנו — נעריך את הפרויקט שלך תוך יום אחד. קבל ייעוץ ממהנדס.