三维视觉--基于Mech-Eye梅卡深度相机的点云获取方案实现(C++版)

本文介绍了如何使用梅卡相机通过Mech-EyeSDK在C++中获取点云数据,并提及点云处理在三维视觉中的重要性,特别是结合深度学习的应用。文章提供了安装SDK的步骤和简单的C++代码示例,用于将深度图转换为点云并保存为PLY格式。
摘要由CSDN通过智能技术生成

前两篇分享了基于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,执行如下步骤:
  1. 双击下载的安装包,运行Mech-Eye SDK安装向导。

  2. 欢迎窗口,浏览软件说明信息,并单击下一步

  3. 许可协议窗口,仔细阅读许可协议,勾选我接受“许可协议”中的全部条款和条件复选框,然后单击下一步

  4. 选择产品窗口,选择需要安装的组件,根据需要勾选桌面快捷方式复选框,然后单击下一步

    • 请确认添加至环境变量复选框已勾选。

    • 推荐勾选Mech-Eye SDK Docs选项,可在不联网时从软件中打开用户手册。

  5. 设置安装路径窗口,选择安装路径,然后单击下一步

    软件默认安装路径:C:/Mech-Mind/Mech-Eye SDK-x.x.x

  6. 安装前确认窗口,确认安装路径无误后,单击安装

  7. 执行安装窗口,等待软件安装完成。

  8. 软件安装完成后,在结束窗口,单击完成,退出安装向导。

安装完成后,请重启电脑,否则可能导致添加的环境变量不生效。

安装完成后,我们就可以新建一个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等等,我一一介绍显得太过繁琐,所以之后就不会再介绍点云获取相关,相关资料网上应该都有。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值