معايرة الكاميرا Intel RealSense d435 باستخدام OpenCV2 و ROS

مرحبا بالجميع!


أريد مشاركة تجربتي مع كاميرا Intel RealSense ، طراز d435 . كما تعلم ، تتطلب العديد من خوارزميات رؤية الجهاز معايرة أولية للكاميرا . حدث ذلك أننا في مشروعنا نستخدم ROS لبناء مكونات فردية لنظام ذكي مؤتمت. ومع ذلك ، بعد دراسة الإنترنت باللغة الروسية ، لم أجد أي دروس معقولة حول هذا الموضوع. الغرض من هذا المنشور هو سد هذه الفجوة.


المتطلبات المسبقة للبرمجيات


نظرًا لأن ROS يعمل على أنظمة Unix ، سأفترض أن لدينا نظام Ubuntu 16.04 متاحًا. لن أصف تفاصيل التثبيت التفصيلية ، سأعطي فقط روابط للبرامج التعليمية المقابلة.



sudo apt-get install python-opencv 


تثبيت برامج تشغيل RealSense


  1. بادئ ذي بدء ، تحتاج إلى تثبيت برامج تشغيل للكاميرا.
  2. حزمة ROS للكاميرا هنا . في وقت النشر ، كان الإصدار الأخير 2.0.3. لتثبيت الحزمة ، تحتاج إلى تنزيل كود المصدر وفك ضغطه في دليل الصفحة الرئيسية لـ ROS. بعد ذلك ، سنحتاج إلى تثبيته:

 catkin_make clean catkin_make -DCATKIN_ENABLE_TESTING=False -DCMAKE_BUILD_TYPE=Release catkin_make install echo "source path_to_workspace/devel/setup.bash" >> ~/.bashrc source ~/.bashrc 

اختبار الكاميرا


بعد تثبيت الكاميرا ، نحتاج إلى التأكد من أن برامج التشغيل تعمل كما ينبغي. للقيام بذلك ، نقوم بتوصيل الكاميرا عبر USB وتشغيل العرض التوضيحي:


 roslaunch realsense2_camera demo_pointcloud.launch 

سيفتح هذا الأمر تصور ROS ، الذي يمكنك من خلاله رؤية سحابة النقاط المسجلة في الموضوع /camera/depth/color/points :


رفيز


معايرة الكاميرا


يوجد أدناه نسخة معدلة من البرنامج التعليمي من OpenCV .


 import numpy as np import cv2 import glob #    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001) #     8x6 objp = np.zeros((6*8,3), np.float32) objp[:,:2] = np.mgrid[0:8,0:6].T.reshape(-1,2) #         objpoints = [] # 3d     imgpoints = [] # 2d     images = glob.glob('/__/*.png') for fname in images: img = cv2.imread(fname) gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #     ret, corners = cv2.findChessboardCorners(gray, (8,6),None) #    ,         if ret == True: objpoints.append(objp) corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria) imgpoints.append(corners2) #       img = cv2.drawChessboardCorners(img, (8,6), corners2,ret) cv2.imshow('img',img) cv2.waitKey(500) cv2.destroyAllWindows() #     ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1],None,None) np.save('/path_to_images/calibration', [mtx, dist, rvecs, tvecs]) 

لكي يعمل هذا النص البرمجي ، نحتاج إلى 10 صور شطرنج على الأقل مستلمة من الكاميرا. لهذا ، يمكننا استخدام ، على سبيل المثال ، حزمة image_view ROS أو أي برنامج آخر يمكنه التقاط لقطات شاشة من كاميرا USB. يجب وضع الصور الملتقطة في أي مجلد. مثال على الصورة:


طاولة الشطرنج


بعد تنفيذ البرنامج النصي ، سيتم حفظ نتائج المعايرة في ملف
calibration.npy . calibration.npy . يمكن بعد ذلك استخدام هذه البيانات مع البرنامج النصي التالي:


 calibration_data = np.load('path_to_images/calibration.npy') mtx = calibration_data[0] dist = calibration_data[1] rvecs = calibration_data[2] tvecs = calibration_data[3] 

الخلاصة


تمكنا من معايرة كاميرا RealSense d435 بنجاح باستخدام OpenCV2 و ROS. يمكن استخدام نتائج المعايرة في تطبيقات مثل عناصر التتبع وعلامات aruco وخوارزميات الواقع المعزز والعديد من التطبيقات الأخرى. في المقالة التالية ، أود أن أوضح تفاصيل تتبع علامات aruco.

Source: https://habr.com/ru/post/ar412953/


All Articles