快速入门

本章主要介绍如何使用 Mech-Eye API 来采集 2D、3D 图像并保存图像数据。

准备工作

对于 C++ 、 C# 、 Python 语言,需进行 Mech-Eye SDK 安装

对于 Python 语言,还需进行 Python 相关配置

获取相机

准备工作完成后,可通过以下程序来获取相机(使用枚举方法获得可连接的相机列表)。

C++

std::vector<mmind::api::MechEyeDeviceInfo> deviceInfoList = mmind::api::MechEyeDevice::enumerateMechEyeDeviceList();

C#

List<MechEyeDeviceInfo> deviceInfoList = MechEyeDevice.enumerateMechEyeDeviceList();

Python

self.device_list = self.device.get_device_list()

连接相机

获取相机后,可根据以下内容连接相机,以连接相机列表中的第一个相机为例。

C++

mmind::api::MechEyeDevice device;
device.connect(deviceInfoList[0]);

C#

MechEyeDevice device = new MechEyeDevice();
device.connect(deviceInfoList[0]);

Python

self.device.connect(self.device_list[int(0)])

配置相机参数

连接相机后,参考以下内容配置相机参数。

2D 图像参数配置

在使用相机采集 2D 图像之前,需要设置相机的参数,包括曝光模式、曝光时间等。

C++

device.setScan2DExposureMode(mmind::api::Scanning2DSettings::Scan2DExposureMode::Timed);
device.setScan2DExposureTime(100);

C#

device.setScan2DExposureMode(Scan2DExposureMode.Timed);
device.setScan2DExposureTime(100);

Python

self.device.set2D_exposure_mode("Timed")
self.device.set2D_exposure_time(100.0)

3D 图像参数配置

在使用相机采集 3D 图像之前,需要设置相机的参数,包括曝光次数、曝光时间、感兴趣区域、滤波平滑等。

C++

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);

C#

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);

Python

self.device.set3D_exposure([5.0, 10.0])
self.device.set_depth_range(100, 1000)
self.device.set_3D_roi(0, 0, 500, 500)
self.device.set_cloud_smooth_mode("Normal")
self.device.set_cloud_outlier_filter_mode("Normal")

采集图像

完成相机参数配置后采集图像,通过发送命令来控制相机采集 2D、3D 图像。

采集 2D 图像

C++

mmind::api::ColorMap color;
device.captureColorMap(color);

C#

ColorMap colorMap = new ColorMap();
device.captureColorMap(ref color);

Python

color_map = device.capture_color()

采集 3D 图像

C++

mmind::api::PointXYZMap pointXYZMap;
device.capturePointXYZMap(pointXYZMap);

C#

PointXYZMap pointXYZMap = new PointXYZMap();
device.capturePointXYZMap(ref pointXYZMap);

Python

point_xyz = device.capture_point_xyz()

保存采集结果

保存 2D 图像

采集完 2D 图像后,将采集到的 2D 图像数据转化为 OpenCV 图像数据类型,并保存为 .png 格式的图片文件。

C++

const std::string colorFile = "ColorMap.png";
cv::Mat color8UC3 = cv::Mat(colorMap.height(), colorMap.width(), CV_8UC3, colorMap.data());
cv::imwrite(colorFile, color8UC3);

C#

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);

Python

color_file = "ColorMap.png"
cv2.imwrite(color_file, color_map.data())

保存点云

采集完 3D 图像后,将采集到的 3D 图像数据转化为点云数据类型,并保存为 .ply 格式的点云。

C++

std::string pointCloudPath = "PointCloudXYZ.ply";
savePLY(pointXYZMap, pointCloudPath);

C#

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);

Python

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)