פיתוח מערכת מדידת עצמים מתמונות או וידאו
זוהי משימה שאנו פותרים באמצעות ראייה ממוחשבת. בפס ייצור, חלק בדיוק יצא מהמכונה — חם (80°C). מדידת מגע עם מד קליבר מעוותת את פני השטח, וגורמת לשגיאה של עד 0.5 מ"מ. מדידה ללא מגע באמצעות מצלמה: צילום בודד ב-50 אלפיות השנייה, דיוק ±0.1 מ"מ, נתונים ישירות ל-SCADA. אין סיכון לכוויות או לעצירת פס הייצור.
בעיות שאנו פותרים
בקרת איכות בפס הייצור. החלק בדיוק יצא מהמכונה — סטיות מהשרטוט מתגלות באופן מיידי. המערכת מודדת אורך, רוחב, קוטר, זוויות ושטח קו מתאר ב-50 אלפיות השנייה. חריגה מהסבילות מפעילה אזעקה או עצירת פס.
מדידות שטח ללא גישה לעצם. צריך לדעת את רוחב סדק בקיר או קוטר צינור בגובה? הצב סמן ArUco לידו, צלם — תוך שנייה המידות ידועות. אין צורך בסולמות ובסרגלים.
לוגיסטיקה ומחסן. מידות ארגזים על מסוע נמדדות תוך כדי תנועה. המערכת מקצה אוטומטית אורך, רוחב וגובה לכל יחידה — תוך אופטימיזציה של העמסת מכולות.
כיצד להבטיח מדידות בדיוק מילימטרי
הפרמטר המרכזי הוא קנה מידה. אנו משתמשים בשלוש שיטות:
-
מצלמה מכוילת — צלם לוח כיול פעם אחת ממרחק העבודה, חשב pixels_per_mm. דיוק ±0.1 מ"מ. אידיאלי למסועים סטטיים.
-
סמן ArUco בפריים — סמן בגודל ידוע (לדוגמה, 50 מ"מ) מוצב ליד העצם. המערכת מזהה את הסמן, מחשבת את קנה המידה, ואז מודדת את העצם. דיוק ±1–5 מ"מ, מתאים לתנאי שטח.
-
זוג סטריאו — שתי מצלמות במרחק 10 ס"מ זו מזו מייצרות ענן נקודות תלת-ממדי. מתוכו אנו מחלצים מידות כלליות, עומק ונפח. דיוק ±0.5–2 מ"מ על עצמים עד 1 מ'.
בחירת השיטה תלויה במשימה. למסוע עם מיקום מצלמה קבוע — כיול. לטאבלט נייד — ArUco. לעצמים גדולים (רהיטים, משטחים) — סטריאו או LiDAR+RGB.
כיצד לבחור את שיטת המדידה?
-
אם העצם נע על מסוע במהירות קבועה והמצלמה קבועה — בחר מצלמה מכוילת. דיוק מקסימלי ±0.1 מ"מ וזמן מדידה של 50 אלפיות השנייה.
-
אם אתה במחסן או בשטח — השתמש בסמן ArUco. הדפס סמן בגודל 5×5 ס"מ, הדבק אותו על בסיס קשיח, והצב אותו ליד העצם. המערכת תקבע אוטומטית את קנה המידה.
-
אם אתה צריך למדוד נפח או עומק — השתמש בזוג סטריאו. שתי מצלמות עם בסיס של 10 ס"מ בונות מודל תלת-ממדי ומוציאות מידות במילימטרים.
שלב אחר שלב: כיצד המערכת מודדת עצם
- לכידת תמונה. המצלמה מצלמת תמונת מצב (או פריים מווידאו). רזולוציה וקצב פריימים מוגדרים.
- קביעת קנה מידה. המערכת מוצאת את עצם הכיול או סמן ArUco, ומחשבת pixels_per_mm.
- פילוח עצם. אנו משתמשים בסף (Otsu) או ברשת עצבית לקווי מתאר מורכבים.
- חילוץ מידות. מתוך קו המתאר אנו מחשבים תיבה חוסמת, מלבן מינימלי, היקף ושטח.
- המרה למילימטרים. הכפל ערכי פיקסלים ב-pixels_per_mm.
- פלט תוצאה. שלח נתונים כ-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%. מוכנים לדון במשימה שלך. כתוב לנו — נעריך את הפרויקט שלך תוך יום אחד. קבל ייעוץ ממהנדס.







