快速入门¶
本章主要介绍如何使用 Mech-Eye API 来连接相机、设置相机参数、获取并保存数据。
注意
Mech-Eye API 2.0.0 更新了 C++ 与 C# 的方法与参数名称。如果您已经安装 Mech-Eye SDK 2.0.0,但是仍使用的是2.0.0 以前的接口,请更新方法与参数名称。
搜索相机¶
准备工作完成后,可通过以下指令来搜索相机(使用枚举方法获得可连接的相机列表)。
std::vector<mmind::api::MechEyeDeviceInfo> deviceInfoList = mmind::api::MechEyeDevice::enumerateMechEyeDeviceList();
List<MechEyeDeviceInfo> deviceInfoList = MechEyeDevice.EnumerateMechEyeDeviceList();
self.device_list = self.device.get_device_list()
连接相机¶
搜索相机后,可通过以下指令连接相机,以连接相机列表中的第一个相机为例。
mmind::api::MechEyeDevice device;
device.Connect(deviceInfoList[0]);
MechEyeDevice device = new MechEyeDevice();
device.connect(deviceInfoList[0]);
self.device.connect(self.device_list[int(0)])
设置相机参数¶
连接相机后,可通过以下指令设置相机参数。
设置 2D 图参数¶
在使用相机采集 2D 图之前,需要设置相机的 2D 参数 ,包括 曝光模式、 曝光时间 等。
device.setScan2DExposureMode(mmind::api::Scanning2DSettings::Scan2DExposureMode::Timed); device.setScan2DExposureTime(100);device.SetScan2DExposureMode(Scan2DExposureMode.Timed); device.SetScan2DExposureTime(100);self.device.set_scan_2d_exposure_mode("Timed") self.device.set_scan_2d_exposure_time(100.0)
设置深度图与点云参数¶
在使用相机采集用于计算深度数据的图像之前,需要设置影响深度图和点云质量的参数,包括 曝光时间、 深度范围、 感兴趣区域、 点云后处理 等。
device.setScan3DExposure(std::vector<double>{5, 10}); device.setDepthRange(mmind::api::DepthRange(100, 1000)); device.setScan3DROI(mmind::api::ROI(0, 0, 500, 500)); device.setCloudSmoothMode( mmind::api::PointCloudProcessingSettings::CloudSmoothMode::Normal); device.setCloudOutlierFilterMode( mmind::api::PointCloudProcessingSettings::CloudOutlierFilterMode::Normal);device.SetScan3DExposure(new List<double> {5, 10}); device.SetDepthRange(new DepthRange(100, 1000)); device.SetScan3DROI(new ROI(0, 0, 500, 500)); device.SetCloudSmoothMode(CloudSmoothMode.Normal); device.SetCloudOutlierFilterMode(CloudOutlierFilterMode.Normal);self.device.set_scan_3d_exposure([5.0, 10.0]) self.device.set_depth_range(100, 1000) self.device.set_scan_3d_roi(0, 0, 500, 500) self.device.set_cloud_smooth_mode("Normal") self.device.set_cloud_outlier_filter_mode("Normal")
获取数据¶
完成相机参数设置后,可以触发相机采集图像并返回 2D 图及点云数据。
获取 2D 图¶
mmind::api::ColorMap color; device.captureColorMap(color);ColorMap color = new ColorMap(); device.CaptureColorMap(ref color);color_map = device.capture_color()
获取点云数据¶
mmind::api::PointXYZMap pointXYZMap; device.capturePointXYZMap(pointXYZMap);PointXYZMap pointXYZMap = new PointXYZMap(); device.CapturePointXYZMap(ref pointXYZMap);point_xyz = device.capture_point_xyz()
保存数据¶
保存 2D 图¶
将获取的 2D 图数据转化为 OpenCV 数据类型,并保存为 png 格式的图片文件。
const std::string colorFile = "ColorMap.png"; cv::Mat color8UC3 = cv::Mat(colorMap.height(), colorMap.width(), CV_8UC3, colorMap.data()); cv::imwrite(colorFile, color8UC3);string colorFile = "colorMap.png"; Mat color8UC3 = new Mat(unchecked((int)colorMap.height()), unchecked((int)colorMap.width()), DepthType.Cv8U, 3, colorMap.data(), unchecked((int)colorMap.width()) * 3); CvInvoke.Imwrite(colorFile, color8UC3);color_file = "ColorMap.png" cv2.imwrite(color_file, color_map.data())
保存点云¶
将获取的点云数据保存为 ply 格式的点云。
std::string pointCloudPath = "PointCloudXYZ.ply"; savePLY(pointXYZMap, pointCloudPath);Mat depth32FC3 = new Mat(unchecked((int)pointXYZMap.height()), unchecked((int)pointXYZMap.width()), DepthType.Cv32F, 3, pointXYZMap.data(), unchecked((int)pointXYZMap.width()) * 12); string pointCloudPath = "pointCloudXYZ.ply"; CvInvoke.WriteCloud(pointCloudPath, depth32FC3);point_cloud_xyz = o3d.geometry.PointCloud() points_xyz = np.zeros( (point_xyz.width() * point_xyz.height(), 3), dtype=np.float64) pos = 0 for dd in np.nditer(point_xyz_data): points_xyz[int(pos / 3)][int(pos % 3)] = 0.001 * dd pos = pos + 1 point_cloud_xyz.points = o3d.utility.Vector3dVector(points_xyz) o3d.io.write_point_cloud("PointCloudXYZ.ply", point_cloud_xyz)