知微传感Dkam系列3D相机SDK例程篇:点云滤波
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例程篇:点云滤波相关推荐
- 知微传感Dkam系列3D相机SDK例程篇:配置相机曝光
配置3D相机曝光 写在前面 本人从事机器视觉细分的3D相机行业.编写此系列文章主要目的有: 1.便利他人应用3D相机,本系列文章包含公司所出售相机的SDK的使用例程及详细注释: 2.促进行业发展及交流 ...
- 知微传感Dkam系列3D相机SDK例程篇:获取内外参
获取3D相机内外参 写在前面 本人从事机器视觉细分的3D相机行业.编写此系列文章主要目的有: 1.便利他人应用3D相机,本系列文章包含公司所出售相机的SDK的使用例程及详细注释: 2.促进行业发展及交 ...
- 知微传感Dkam系列3D相机OpenCV应用篇:OpenCV读入3D相机数据
OpenCV读入3D相机数据 写在前面 本人从事机器视觉细分的3D相机行业.编写此系列文章主要目的有: 1.便利他人应用3D相机,本系列文章包含公司所出售相机的SDK的使用例程及详细注释: 2.促进行 ...
- 知微传感Dkam系列3D相机PCL应用篇:PCL读入3D相机数据
PCL读入Dkam系列3D相机数据 写在前面 PCL(Point Cloud Library):是一个开源的算法库,用C++编写,是当前点云处理的得力工具: 在使用PCL处理3D相机输出的点云中,可能 ...
- 知微传感3D相机SDK开发文档一查找相机
知微传感3D相机SDK开发文档一查找相机 主要对知微传感3D相机的SDK文件做一个介绍,大家一个界面显示程序包含图像的获得,相机的查找和链接 查找相机,通过UDP广播形式查找局域网相机 链接相机,通过 ...
- 基于DLP结构光的双目3D相机
基于结构光技术的Rindo系列3D相机非常适合用于微米级精度的检测和测量场景.结合专为结构光技术优化的工业投影仪,搭载工业立体相机,实现高分辨率高精度测量的同时拥有极高的测量稳定性.设计紧凑,标准化的 ...
- DALSA网口线扫相机SDK开发详解例程(C#版)
首先吐槽一句,官方的demos写的真的不好,坑爹啊.对于小白来说,开发官方demos为我所用太难了.为什么呢?因为它Dalsa的DALSA.SaperaLT.SapClassBasic.dll中,不仅 ...
- python热成像_盘点Terabee传感器家族:TOF测距、3D相机、热成像
了解Terabee Terabee公司2012年始创于法国,作为一家无人机服务公司,开发了基于无人机的先进数据获取和分析技术.Terabee采用LED而非激光飞行时间传感技术,树立了光学飞行时间传感的 ...
- OpenCV使用Orbbec Astra 3D相机
OpenCV使用Orbbec Astra 3D相机 使用Orbbec Astra 3D相机 介绍 安装说明 代码 使用Orbbec Astra 3D相机 介绍 本教程专门针对Orbbec 3D相机的A ...
最新文章
- 用漫画了解 Linux 内核到底长啥样!
- Quartz在Spring中动态设置cronExpression
- AJAX只支持字符类数据返回,不支持文件下载
- matlab2018b中svm无法运行,关于matlab2018a版本错误使用 svmclassify 分类器
- 语音合成技术与资源 - 资源篇
- SpringCloud+Docker+Jenkins+GitLab+Maven实现自动化构建与部署实战
- Sigar - no sigar-amd64-winnt.dll in java.library.path
- yii 定义controller model
- mysql使用mybatis删除不生效_解决myBatis中删除条件的拼接问题
- java类Writer和类Reader小结
- MATLAB--卡尔曼滤波
- 笔记14:STM32F4之电容触摸按键
- java 拼音首字母 高效_如何实现一个高效的拼音匹配库?解决多音字,首字母匹配等问题...
- Android开发----简单几步教你制作一个简易的音乐播放器
- Xiangqi UVA - 1589
- C/C++牛客网刷题练习之翻转链表篇
- GScoolink GSV2201 TypeC/DP to HDMI2.0
- An动画基础之元件的图形动画与按钮动画
- 加班者的王者语录(改编)
- java代码质量 圈复杂度,代码圈复杂度(Cyclomatic Complexity,CC)和Oclint工具 介绍...