“悉灵杯”课题研究-RGB_D相机SDK三维点云存储
“悉灵杯”课题研究-RGB_D相机SDK三维点云存储,实现存储三维点云文件

一. 环境介绍

1.Visual Studio 2019

2.PCL、Boost

3.悉灵相机MV-EB435i,SDK版本Mv3dRgbd_V1.0.0_Win

具体环境配置:

c1.png

二. 解析点云数据及存储

由于相机通过USB接入,在设备类型选择DeviceType_USB:

ASSERT_OK(MV3D_RGBD_GetDeviceList(DeviceType_USB, &devs[0], nDevNum, &nDevNum));

参考SDK中给出的结构体参数,可以得到图像的详细信息:
s2.png

在相机图像MV3D_RGBD_IMAGE_DATA数据中,有图像宽、图像高、相机输出的图像数据、图像数据长度(字节)、帧号、设备上报的时间戳等信息,通过图像高、宽、图像数据长度可以计算图像点数,以供后续使用。为了得到图像数据,对pData指针进行解析,得到图像数据。

由于相机不输出点云数据,采用深度图数据转换成点云数据:

nRet = MV3D_RGBD_MapDepthToPointCloud(handle, &stFrameData.stImageData[i], &stPointCloudImage);

采用PCL的点云结构存储解析得到的相机点云数据,并对明显的无效数据进行过滤:
20230726115121image.png

调用PCL存文件接口,将点云文件存储成pcd格式:

pcl::io::savePCDFileASCII(to_string(num)+".pcd", pointCloud);

三. 代码

main.cpp:

#include <iostream> #include <fstream> #include <algorithm> #include <stdio.h> #include "../common/common.hpp" #include <pcl/point_types.h> #include <pcl/io/pcd_io.h> using namespace std; int main() { ASSERT_OK(MV3D_RGBD_Initialize()); unsigned int nDevNum = 0; ASSERT_OK(MV3D_RGBD_GetDeviceNumber(DeviceType_USB, &nDevNum)); LOGD("MV3D_RGBD_GetDeviceNumber success! nDevNum:%d.", nDevNum); ASSERT(nDevNum); // 查找设备 std::vector<MV3D_RGBD_DEVICE_INFO> devs(nDevNum); ASSERT_OK(MV3D_RGBD_GetDeviceList(DeviceType_USB, &devs[0], nDevNum, &nDevNum)); for (unsigned int i = 0; i < nDevNum; i++) { LOG("Index[%d]. SerialNum[%s] IP[%s] name[%s].\r\n", i, devs[i].chSerialNumber, devs[i].SpecialInfo.stNetInfo.chCurrentIp, devs[i].chModelName); } //打开设备 void* handle = NULL; unsigned int nIndex = 0; ASSERT_OK(MV3D_RGBD_OpenDevice(&handle, &devs[nIndex])); LOGD("OpenDevice success."); // 开始工作流程 ASSERT_OK(MV3D_RGBD_Start(handle)); LOGD("Start work success."); int num = 0; bool exit_flag = TRUE; MV3D_RGBD_FRAME_DATA stFrameData = { 0 }; while (exit_flag) { pcl::PointCloud<pcl::PointXYZ> pointCloud; // 获取图像数据 int nRet = MV3D_RGBD_FetchFrame(handle, &stFrameData, 5000); //获取图像帧 if (MV3D_RGBD_OK == nRet) { //图像帧很多类型,当类型为深度时将其转换为点云 for (int i = 0; i < stFrameData.nImageCount; i++) { //若是深度格式则开始转换 if (ImageType_Depth == stFrameData.stImageData[i].enImageType) { MV3D_RGBD_IMAGE_DATA stPointCloudImage; //将当前帧转换为点云 nRet = MV3D_RGBD_MapDepthToPointCloud(handle, &stFrameData.stImageData[i], &stPointCloudImage); //pPtr 指向 点云存储起始地址 float* pPtr = (float*)stPointCloudImage.pData; int nPointNum = stPointCloudImage.nDataLen / (sizeof(float) * 3); //从第一个点云开始向文件流中写入 xyz 坐标 LOGD("Start write Points of %d framenum!", stPointCloudImage.nFrameNum); for (int nPntIndex = 0; nPntIndex < nPointNum; ++nPntIndex) { if (pPtr[nPntIndex * 3 + 0] > 6000 || pPtr[nPntIndex * 3 + 1] > 6000 || pPtr[nPntIndex * 3 + 2] > 6000)continue; if (pPtr[nPntIndex * 3 + 0] != 0 || pPtr[nPntIndex * 3 + 1] != 0 || pPtr[nPntIndex * 3 + 2] != 0) { pcl::PointXYZ point; point.x = pPtr[nPntIndex * 3 + 0]; point.y = pPtr[nPntIndex * 3 + 1]; point.z = pPtr[nPntIndex * 3 + 2]; pointCloud.points.push_back(point); } } pointCloud.width = pointCloud.points.size(); pointCloud.height = 1; pcl::io::savePCDFileASCII(to_string(num)+".pcd", pointCloud); LOGD("_MapDepthToPointCloud() Run Succeed: framenum (%d) height(%d) width(%d) len (%d)!", stPointCloudImage.nFrameNum, stPointCloudImage.nHeight, stPointCloudImage.nWidth, stPointCloudImage.nDataLen); } //若获取图像帧失败则退出 if (MV3D_RGBD_OK != nRet) { break; } } } //按键退出 if (_kbhit()) { exit_flag = FALSE; } num++; } ASSERT_OK(MV3D_RGBD_Stop(handle)); ASSERT_OK(MV3D_RGBD_CloseDevice(&handle)); ASSERT_OK(MV3D_RGBD_Release()); LOGD("Main done!"); return 0; }

CMakeLists.txt:

cmake_minimum_required(VERSION 3.9) set(CMAKE_CXX_STANDARD 11) project(storepointscloud) set(BOOST_ROOT "C:/PCL 1.12.1/3rdParty/Boost") find_package(Boost REQUIRED COMPONENTS system filesystem thread) find_package(PCL 1.3 REQUIRED) set(SOURCE_FILES main.cpp) include_directories(Include/) include_directories(common/include) include_directories( ${PCL_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ) link_directories(Lib/Win64) link_directories(common/lib/Win64) link_directories( ${PCL_LIBRARY_DIRS} ${BOOST_LIBRARY_DIRS} ) add_definitions( ${PCL_DEFINITIONS} ) add_compile_definitions(NOMINMAX) add_executable(storepointscloud ${SOURCE_FILES}) target_link_libraries(storepointscloud ${PCL_LIBRARIES} ${Boost_LIBRARIES} ) target_link_libraries(storepointscloud Mv3dRgbd glfw3 opengl32 glu32)

四. 运行结果

可以看到在可执行文件目录下已经生成pcd格式的点云文件:
s3.png

版权声明:本文为V社区用户原创内容,转载时必须标注文章的来源(V社区),文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:v-club@hikrobotics.com 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
上一篇

海康机器人——屏幕检测产品方案

下一篇

“悉灵杯”课题研究-对RGB_D相机采集的三维点云处理

评论请先登录 登录
全部评论 0
Lv.0
0
关注
2
粉丝
3
创作
3
获赞
所属专题
  • 使用3D相机MV-EB435i基于OpenCV的客流检测与异常识别的实现
  • 悉灵杯”课题研究进展(一)通过海康RGB-D相机获取带RGB信息的点云
  • “悉灵杯”课题研究-基于RGB_D相机的物品位置计算
  • “悉灵杯”课题研究-对RGB_D相机采集的三维点云处理
  • “悉灵杯”课题研究-RGB_D相机SDK集成及Open3d点云基本处理
  • “悉灵杯”课题研究-集成RGB_D相机SDK的Open3d点云可视化
  • “悉灵杯”课题研究-集成RGB_D相机SDK的Open3d点云功能UI项目开发(项目demo)
  • “悉灵杯”课题研究-RGB_D相机SDK三维点云存储
  • “悉灵杯”课题研究-OpenNI集成及示例代码开发
  • 悉灵杯”课题研究-MV-EB435i立体相机基于opencv图像处理使用yolov5的物体识别
  • “悉灵杯”课题研究-基于opecv的集成RGB_D相机SDK的基础小样物品颜色检测及人脸识别
  • OpenCV中利用knn进行数字(0-9)识别--RGB-D相机采集
  • “悉灵杯”课题研究-基于MV-EB435i的落差边缘检测算法开发记录
  • 悉灵杯”课题研究-LabVIEW集成及示例代码开发
  • “悉灵杯”课题研究-MV-EB435i立体相机集成Apriltags发布相机位姿
  • “悉灵杯”课题研究-MV-EB435i立体相机图像处理UI界面开发
  • “悉灵杯”课题研究-基于ROS1的RGB-D相机SDK集成及示例代码开发
  • 第二届“悉灵杯”课题移动机器人感知研究进展
  • “悉灵杯”课题研究—手眼标定方案
  • 第二届“悉灵杯”课题研究-基于RGB_D相机的室内环境建模
  • 悉灵杯”课题研究进展(二)-基于三维模型/场景点云的虚拟仿真数据生成
  • 悉灵杯”课题研究进展(一)-实例分割网络模型搭建与实验场景介绍
  • “悉灵杯”课题研究报告-基于RGB-D相机的2D和3D抓取定位方案研究
  • “悉灵杯”课题研究-基于点云配准算法GICP的3D抓取方案研究
  • “悉灵杯”课题研究-基于YOLO和GGCNN的物品平面抓取方案研究
  • 动态手势控制音频播放器-成果物
  • 第二届“悉灵杯”课题研究报告-动态手势控制音频播放器设计
  • 动态手势控制音频播放器(五)动态手势控制音频播放器exe
  • 动态手势控制音频播放器(四)动态手势识别系统的设计
  • 动态手势控制音频播放器(三)音频播放器设计
  • 动态手势控制音频播放器(二)动态手势识别系统的设计
  • 动态手势控制音频播放器(一)总体方案设计
  • 悉灵杯”课题研究进展(四)RGB-D相机引导机械臂分拣物料
  • 悉灵杯”课题研究进展(三)RGB-D相机引导机械臂分拣物料
  • 悉灵杯”课题研究进展(二)RGB-D相机引导机械臂分拣物料
  • ”悉灵杯”课题研究报告-基于RGB-D相机的机械臂物料分拣系统研究
  • 悉灵杯”课题研究报告-基于深度学习方法和虚拟仿真数据的机械臂引导方案
  • 第二届“悉灵杯”课题研究机械臂引导研究报告
  • 第二届“悉灵杯”课题研究机械臂引导研究进展(二)
  • 第二届“悉灵杯”课题研究机械臂引导研究进展(一)
相关阅读
  • 【保姆级教程】算法模块封装详解
    2024-10-17 浏览 0
  • 第三届“悉灵杯”基于MV-DT01SDU相机识别果蔬等数据集
    2024-10-14 浏览 0
  • 【3D系列】2D-2D对极几何估计相机运动3D位姿
    2024-10-14 浏览 0
  • 工程应用系列:CPK,GRR(一文讲清楚)
    2024-10-12 浏览 0
  • 这里有份不用报名也能在启智杯获奖的秘籍!
    2024-10-24 浏览 0

请升级浏览器版本

您正在使用的浏览器版本过低,请升级最新版本以获得更好的体验。

推荐使用以下浏览器