前两篇分享了基于Intel Realsense d455深度相机和基于Kinect2.0深度相机的点云获取方案实现,感兴趣的可以转过去看一看:
三维视觉--点云获取(Intel Realsense d455深度相机)方案实现C++版_低调猫熊的博客-CSDN博客
三维视觉--基于Kinect2.0深度相机的点云获取方案实现(C++版)_低调猫熊的博客-CSDN博客
最近计划将三维视觉专栏尽快多写一些内容,对于点云的获取,其实都是大同小异,获取点云固然重要,但是对点云的处理也是一项十分重要的技能,尤其是深度学习日益发展的今天,将深度学习用于点云的检测、分割和特征提取已经成为三维视觉岗位应该具备的技能之一。所以,在这一篇分享结束之后,我计划多分享一些点云处理包括深度学习在点云上的应用等方面的文章,希望可以给感兴趣的朋友一些思想上的火花。废话太多,下面进入正文:
梅卡相机在工业领域使用较多,就个人的使用感受来看,这款相机获取点云的效果还是比较好的,参数等各方面设置、包括机械臂联调等都很方便。首先,我们需要安装Mech-Eye SDK,这样才能使用C++调用。大家可以去官网下载,也可以在我分享的百度网盘直接下载,百度网盘的链接放在了这篇文章(算是给它引流)三维视觉--点云获取(Intel Realsense d455深度相机)方案实现C++版_低调猫熊的博客-CSDN博客
下载好后就是简单的安装:
要安装Mech-Eye SDK,执行如下步骤:
-
双击下载的安装包,运行Mech-Eye SDK安装向导。
-
在欢迎窗口,浏览软件说明信息,并单击下一步。
-
在许可协议窗口,仔细阅读许可协议,勾选我接受“许可协议”中的全部条款和条件复选框,然后单击下一步。
-
在选择产品窗口,选择需要安装的组件,根据需要勾选桌面快捷方式复选框,然后单击下一步。
-
请确认添加至环境变量复选框已勾选。
-
推荐勾选Mech-Eye SDK Docs选项,可在不联网时从软件中打开用户手册。
-
-
在设置安装路径窗口,选择安装路径,然后单击下一步。
软件默认安装路径:C:/Mech-Mind/Mech-Eye SDK-x.x.x。
-
在安装前确认窗口,确认安装路径无误后,单击安装。
-
在执行安装窗口,等待软件安装完成。
-
软件安装完成后,在结束窗口,单击完成,退出安装向导。
安装完成后,请重启电脑,否则可能导致添加的环境变量不生效。 |
安装完成后,我们就可以新建一个C++项目,并配置相机环境、Opencv和PCL,具体步骤跟我之前发的两篇文章相似,大家可以参考,此处不赘述。
环境配置完成后,就是代码时间,这里直接房贷吗(输入法太扎心了~-~),放代码:
#include <iostream>
#include <pcl/point_types.h>
#include <pcl/io/ply_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include "MechEyeApi.h"
#include "SampleUtil.h"
void savePLY(const mmind::api::DepthMap& depth, const std::string& path,
const mmind::api::DeviceIntri& intri);
int main()
{
mmind::api::MechEyeDevice device;
if (!findAndConnect(device))
return -1;
mmind::api::MechEyeDeviceInfo deviceInfo;
showError(device.getDeviceInfo(deviceInfo));
printDeviceInfo(deviceInfo);
mmind::api::ColorMap color;
showError(device.captureColorMap(color));
mmind::api::DepthMap depth;
showError(device.captureDepthMap(depth));
mmind::api::DeviceIntri deviceIntri;
showError(device.getDeviceIntri(deviceIntri));
std::string pointCloudPath = "PointCloudXYZ.ply";
savePLY(depth, pointCloudPath, deviceIntri);
device.disconnect();
std::cout << "Disconnected from the Mech-Eye device successfully." << std::endl;
return 0;
}
void savePLY(const mmind::api::DepthMap& depth, const std::string& path,
const mmind::api::DeviceIntri& intri)
{
pcl::PointCloud<pcl::PointXYZ> pointCloud(depth.width(), depth.height());
uint32_t size = depth.height() * depth.width();
pointCloud.resize(size);
// 将点云中点的坐标单位从mm转换为m
for (int m = 0; m < depth.height(); ++m)
for (int n = 0; n < depth.width(); ++n) {
float d;
try {
d = depth.at(m, n).d;
} catch (const std::exception& e) {
std::cout << "Exception: " << e.what() << std::endl;
return;
}
pointCloud.at(n, m).z = 0.001 * d; // mm to m
pointCloud.at(n, m).x = (n - intri.depthCameraIntri.cameraMatrix[2]) * 0.001 * d /
intri.depthCameraIntri.cameraMatrix[0]; // mm to m
pointCloud.at(n, m).y = (m - intri.depthCameraIntri.cameraMatrix[3]) * 0.001 * d /
intri.depthCameraIntri.cameraMatrix[1]; // mm to m
}
pcl::PLYWriter writer;
writer.write(path, pointCloud, true);
std::cout << "PointCloudXYZ has : " << pointCloud.width * pointCloud.height << " data points."
<< std::endl;
std::cout << "PointCloudXYZ saved to: " << path << std::endl;
return;
}
到这里,你就能通过梅卡相机获取点云了。
草稿代码可能不是那么严谨,但运行起来问题不大。
因为获取点云的方式,除了深度相机还有激光和毫米波雷达,当然相机的点云获取也分结构光、线激光、TOF等等,我一一介绍显得太过繁琐,所以之后就不会再介绍点云获取相关,相关资料网上应该都有。