3D相机点云滤波

写在前面

  • 本人从事机器视觉细分的3D相机行业。编写此系列文章主要目的有:

    • 1、便利他人应用3D相机,本系列文章包含公司所出售相机的SDK的使用例程及详细注释;
    • 2、促进行业发展及交流。
  • 知微传感Dkam系列3D相机可以应用于定位分拣、焊接焊缝提取、逆向建模、检测测量等领域
  • 欢迎与我深入交流:微信号:liu_zhisensor

点云滤波及API说明

点云滤波说明

  • 知微传感为其3D相机输出的点云准备了滤波API,用于噪声的滤除、离群点
  • 点云滤波功能在上位机完成
  • 被滤除的点位置保留,坐标值为0
  • 滤波API在获取点云后使用

相关API

  • FilterPointCloud 点云滤波

    • void FilterPointCloud(Camera_Object_C* camera_obj,PhotoInfo *raw_data,double level)
    • 函数功能: 滤波
    • 参 数: camera_obj:相机的结构体指针;raw_data:采集的点云数据;level:滤波的等级 (取值范围大于 0//等于 0 所有的点云都被过滤//趋于 0 滤波效果越明显)
    • 返回值: 无

例程及注释

  • 本例程基于WIN10+VisualStudio2019+DkamSDK_1.6.71,采用C++语言
  • DkamSDK的配置方法请参考SDK说明书
  • 本例程在D132S型相机上验证
#include <iostream>
//DkamSDK
#include"dkam_discovery.h"
#include"dkam_gige_camera.h"
#include"dkam_gige_stream.h"int main()
{std::cout << "Hello Zhisensor!" << std::endl;std::cout << "Hello liu_sensor!" << std::endl;std::vector<DiscoveryInfo> discovery_info;Discovery discovery;GigeCamera camera;GigeStream* pointgigestream = NULL;GigeStream* graygigestream = NULL;GigeStream* rgbgigestream = NULL;std::vector<DiscoveryInfo>().swap(discovery_info);//********************************************查询相机****************************************************//查询局域网内的3D相机int camer_num = discovery.DiscoverCamera(&discovery_info);std::cout << "局域网内共有" << camer_num << "台相机" << std::endl;//显示局域网内相机的IPfor (int i = 0; i < camer_num; i++){std::cout << "局域网内相机的IP为:" << discovery.ConvertIpIntToString(discovery_info[i].camera_ip) << std::endl;}//********************************************连接相机****************************************************//选定相机int k = -1;for (int i = 0; i < camer_num; i++){if (strcmp((discovery.ConvertIpIntToString(discovery_info[i].camera_ip)), "192.168.30.65") == 0){k = i;std::cout << "将连接第" << k + 1 << "台相机" << std::endl;}else{std::cout << "局域网内无该IP的相机" << std::endl;}}//********************************************采集数据****************************************************int connect = camera.CameraConnect(&discovery_info[k]);if (connect == 0){//获取当前红外相机的宽和高int width = -1;int height = -1;std::cout << "获取相机红外图的宽和高。。。" << std::endl;int height_gray = camera.GetCameraHeight(&height, 0);int width_gray = camera.GetCameraWidth(&width, 0);std::cout << "camera  Grey width:" << width << "---Grey height:" << height << std::endl;//获取当前RGB相机的宽和高,如相机不支持则无此项int width_RGB = -1;int height_RGB = -1;std::cout << "获取相机RGB图的宽和高。。。" << std::endl;int height_rgb = camera.GetCameraHeight(&height_RGB, 1);int width_rgb = camera.GetCameraWidth(&width_RGB, 1);std::cout << "camera RGB width:" << width_RGB << "-----RGB height:" << height_RGB << std::endl;//定义点云数据大小PhotoInfo* point_data = new PhotoInfo;point_data->pixel = new char[width * height * 6];memset(point_data->pixel, 0, width * height * 6);//开启数据流通道(0:红外 1:点云 2:RGB)int stream_point = camera.StreamOn(1, &pointgigestream);if (stream_point == 0){std::cout << "点云通道打开成功!" << std::endl;}else{std::cout << "点云通道打开失败!!!" << std::endl;}//开始接受数据int acquistion = camera.AcquisitionStart();if (acquistion == 0){std::cout << "可以开始接受数据!" << std::endl;}//刷新缓冲区数据pointgigestream->FlushBuffer();graygigestream->FlushBuffer();rgbgigestream->FlushBuffer();//**********************************************采集数据并做滤波***************************************//采集点云int capturePoint = -1;capturePoint = pointgigestream->TimeoutCapture(point_data, 3000000);if (capturePoint == 0){std::cout << "点云接收成功!" << std::endl;}else{std::cout << "点云接收失败!!!" << std::endl;std::cout << "失败代号:" << capturePoint << std::endl;}//保存原始点云int savepoint = camera.SavePointCloudToPcd(*point_data, (char*)"Originpointcloud.pcd");if (savepoint == 0){std::cout << "原始点云保存成功!" << std::endl;}else{std::cout << "原始点云保存失败!!!" << std::endl;}//点云滤波,滤波后的点云数据仍会被放到原内存位置double filterlevel = 1;camera.FilterPointCloud(*point_data, 1);std::cout << "滤波完成,滤波等级为:"<< filterlevel << std::endl;int savefilterpoint = camera.SavePointCloudToPcd(*point_data, (char*)"filterpointcloud.pcd");if (savefilterpoint == 0){std::cout << "滤波点云保存成功!" << std::endl;}else{std::cout << "滤波点云保存失败!!!" << std::endl;}//**********************************************结束工作***************************************memset(point_data->pixel, 0, width * height * 6);//释放内存delete[] point_data->pixel;delete point_data;//关闭数据流通道 int streamoff_point = camera.StreamOff(1, pointgigestream);//断开相机连接int disconnect = camera.CameraDisconnect();std::cout << "工作结束!!!!!!" << std::endl;}else{std::cout << "相机连接失败!!!" << std::endl;std::cout << "请排查原因,代号:" << connect << std::endl;}
}

运行结果

结果对比

  • 滤波前

  • 滤波后

  • 对比可知,滤波功能可以有效滤除噪点或离群点

后记

  • 知微传感Dkam系列3D相机可以应用于定位分拣、焊接引导、逆向建模、检测测量等领域
  • 如有问题,欢迎与我深入交流:微信号:liu_zhisensor

知微传感Dkam系列3D相机SDK例程篇:点云滤波相关推荐

  1. 知微传感Dkam系列3D相机SDK例程篇:配置相机曝光

    配置3D相机曝光 写在前面 本人从事机器视觉细分的3D相机行业.编写此系列文章主要目的有: 1.便利他人应用3D相机,本系列文章包含公司所出售相机的SDK的使用例程及详细注释: 2.促进行业发展及交流 ...

  2. 知微传感Dkam系列3D相机SDK例程篇:获取内外参

    获取3D相机内外参 写在前面 本人从事机器视觉细分的3D相机行业.编写此系列文章主要目的有: 1.便利他人应用3D相机,本系列文章包含公司所出售相机的SDK的使用例程及详细注释: 2.促进行业发展及交 ...

  3. 知微传感Dkam系列3D相机OpenCV应用篇:OpenCV读入3D相机数据

    OpenCV读入3D相机数据 写在前面 本人从事机器视觉细分的3D相机行业.编写此系列文章主要目的有: 1.便利他人应用3D相机,本系列文章包含公司所出售相机的SDK的使用例程及详细注释: 2.促进行 ...

  4. 知微传感Dkam系列3D相机PCL应用篇:PCL读入3D相机数据

    PCL读入Dkam系列3D相机数据 写在前面 PCL(Point Cloud Library):是一个开源的算法库,用C++编写,是当前点云处理的得力工具: 在使用PCL处理3D相机输出的点云中,可能 ...

  5. 知微传感3D相机SDK开发文档一查找相机

    知微传感3D相机SDK开发文档一查找相机 主要对知微传感3D相机的SDK文件做一个介绍,大家一个界面显示程序包含图像的获得,相机的查找和链接 查找相机,通过UDP广播形式查找局域网相机 链接相机,通过 ...

  6. 基于DLP结构光的双目3D相机

    基于结构光技术的Rindo系列3D相机非常适合用于微米级精度的检测和测量场景.结合专为结构光技术优化的工业投影仪,搭载工业立体相机,实现高分辨率高精度测量的同时拥有极高的测量稳定性.设计紧凑,标准化的 ...

  7. DALSA网口线扫相机SDK开发详解例程(C#版)

    首先吐槽一句,官方的demos写的真的不好,坑爹啊.对于小白来说,开发官方demos为我所用太难了.为什么呢?因为它Dalsa的DALSA.SaperaLT.SapClassBasic.dll中,不仅 ...

  8. python热成像_盘点Terabee传感器家族:TOF测距、3D相机、热成像

    了解Terabee Terabee公司2012年始创于法国,作为一家无人机服务公司,开发了基于无人机的先进数据获取和分析技术.Terabee采用LED而非激光飞行时间传感技术,树立了光学飞行时间传感的 ...

  9. OpenCV使用Orbbec Astra 3D相机

    OpenCV使用Orbbec Astra 3D相机 使用Orbbec Astra 3D相机 介绍 安装说明 代码 使用Orbbec Astra 3D相机 介绍 本教程专门针对Orbbec 3D相机的A ...

最新文章

  1. 用漫画了解 Linux 内核到底长啥样!
  2. Quartz在Spring中动态设置cronExpression
  3. AJAX只支持字符类数据返回,不支持文件下载
  4. matlab2018b中svm无法运行,关于matlab2018a版本错误使用 svmclassify 分类器
  5. 语音合成技术与资源 - 资源篇
  6. SpringCloud+Docker+Jenkins+GitLab+Maven实现自动化构建与部署实战
  7. Sigar - no sigar-amd64-winnt.dll in java.library.path
  8. yii 定义controller model
  9. mysql使用mybatis删除不生效_解决myBatis中删除条件的拼接问题
  10. java类Writer和类Reader小结
  11. MATLAB--卡尔曼滤波
  12. 笔记14:STM32F4之电容触摸按键
  13. java 拼音首字母 高效_如何实现一个高效的拼音匹配库?解决多音字,首字母匹配等问题...
  14. Android开发----简单几步教你制作一个简易的音乐播放器
  15. Xiangqi UVA - 1589
  16. C/C++牛客网刷题练习之翻转链表篇
  17. GScoolink GSV2201 TypeC/DP to HDMI2.0
  18. An动画基础之元件的图形动画与按钮动画
  19. 加班者的王者语录(改编)
  20. java代码质量 圈复杂度,代码圈复杂度(Cyclomatic Complexity,CC)和Oclint工具 介绍...

热门文章

  1. 如何取消ssh验证密码
  2. 学习 Bootstrap 5 之 Text
  3. 中秋佳节之际,TCL40周年专场音乐会在中央音乐学院歌剧音乐厅圆满落幕
  4. DNS劫持详解、如何使用网站监控检测dns劫持和网络劫持的特征
  5. 哈工大-软件构造-Lab3(1)
  6. Qt汉字得到汉字拼音首字母
  7. linux红帽给文件加密,红帽大神制作 Linux 工具,用于旧款罗技无线键盘加密设置...
  8. Excel数据格式校验
  9. 独立开发变现周刊(第28期):一个JavaScript组件做到了150万美金收入
  10. 安装和配置Tripwire,加强你的Linux系统安全