当前位置: 首页 > news >正文

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

3D相机点云滤波

写在前面

  • 本人从事机器视觉细分的3D相机行业。编写此系列文章主要目的有:
    • 1、便利他人应用3D相机,本系列文章包含公司所出售相机的SDK的使用例程及详细注释;
    • 2、促进行业发展及交流。
  • 知微传感Dkam系列3D相机可以应用于定位分拣、焊接焊缝提取、逆向建模、检测测量等领域

点云滤波及API说明

点云滤波说明
  • 知微传感为其3D相机输出的点云准备了滤波API,用于噪声或离群点的滤除
  • 点云滤波功能在上位机完成
  • 被滤除的点位置保留,指标值为0
  • 滤波API在获取点云后使用
相关API
  • FilterPointCloudCSharp 点云滤波
    • void FilterPointCloudCSharp(Camera_Object_C* camera_obj,PhotoInfoCSharp &raw_data_info, char *xyz, int pixel_size, double level)
    • 函数功能: 滤波
    • 参 数: camera_obj:相机的结构体指针;raw_data_info:采集的点云数据;xyz:像素点;pixel_size:像素大小;level:滤波的等级 (取值范围大于 0//等于 0 所有的点云都被过滤//趋于 0 滤波效果越明显)
    • 返回值: 无
    • 原理:统计滤波
  • SpatialFilterPointcloudCSharp 空间滤波
    • int SpatialFilterPointcloudCSharp(Camera_Object_C* camera_obj, PhotoInfoCSharp &raw_data_info, char *xyz, int pixel_size, int Area_PointCloudCount)
    • 函数功能:空间滤波
    • 参数:camera_obj:相机的结构体指针;raw_data:获取的点云数据;xyz:像素点;pixel_size:像素大小;Area_PointCloudCount:滤波范围 (取值范围大于0//等于0滤波不起作用//取值越大于0效果越明显,取值范围:0~99)
    • 返回值:0,成功;非0,失败
    • 原理:将输入的点云分成30×30×30个空间,空间内有效点的数量少于给定值时,将该空间内多有点滤除(实际将点的坐标值赋值为0),处理后的点仍存放在raw_data中

例程及注释

  • 本例程基于WIN10+VisualStudio2022+DkamSDK_1.6.83
  • DkamSDK的配置方法请参考SDK说明书
  • 本例程在D330XS型相机上验证
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace filter
{internal class Program{static void Main(string[] args){Console.WriteLine("Hello ZhiSENSOR!");//**********************************************查询、连接相机****************************************************int camer_num = 0;int camera_ret = -1;//想要连接的相机IPString tarCameraIP = "192.168.40.91";//发现局域网内的相机camer_num = DkamSDK_CSharp.DiscoverCamera();Console.WriteLine("局域网内共有" + camer_num + "台3D相机");//显示局域网内相机IPfor (int i = 0; i < camer_num; i++){Console.WriteLine("局域网内相机的IP为:" + DkamSDK_CSharp.CameraIP(i));if (String.Compare(DkamSDK_CSharp.CameraIP(i), tarCameraIP) == 0){camera_ret = i;}}Console.WriteLine("连接IP为:" + tarCameraIP + "的相机");//连接相机SWIGTYPE_p_CAMERA_OBJECT camera = DkamSDK_CSharp.CreateCamera(camera_ret);int connect = DkamSDK_CSharp.CameraConnect(camera);if (connect == 0){Console.WriteLine("相机连接成功!");//获取当前红外相机的宽和高SWIGTYPE_p_int width_gray = DkamSDK_CSharp.new_intArray(0);DkamSDK_CSharp.GetCameraWidth(camera, width_gray, 0);int width = DkamSDK_CSharp.intArray_getitem(width_gray, 0);SWIGTYPE_p_int height_gray = DkamSDK_CSharp.new_intArray(0);DkamSDK_CSharp.GetCameraHeight(camera, height_gray, 0);int height = DkamSDK_CSharp.intArray_getitem(height_gray, 0);Console.WriteLine("红外图宽度:" + width + "    红外图高度:" + height);//**********************************************采集点云数据****************************************************//定义点云大小PhotoInfoCSharp PointCloud_data = new PhotoInfoCSharp();int pointsize = width * height * 6;byte[] point_pixel = new byte[pointsize];//开启数据流通道(0:红外 1:点云 2:RGB)//点云int streampoint = DkamSDK_CSharp.StreamOn(camera, 1);if (streampoint == 0){Console.WriteLine("点云通道打开成功!");}else{Console.WriteLine("点云通道打开失败!!!     错误码:" + streampoint);}//开始接受数据int start = DkamSDK_CSharp.AcquisitionStart(camera);if (start == 0){Console.WriteLine("可以开始接收数据!");}else{Console.WriteLine("不能接收数据!!!     错误码:" + start);}//刷新缓冲区DkamSDK_CSharp.FlushBuffer(camera, 1);Console.WriteLine("等待数据采集、传输。。。");//获取点云数据int capturepoint = DkamSDK_CSharp.TimeoutCaptureCSharp(camera, 1, PointCloud_data, point_pixel, pointsize, 10000000);if (capturepoint == 0){Console.WriteLine("点云数据接收成功!");}else{Console.WriteLine("点云数据接收失败!!!     错误码:" + capturepoint);}Console.WriteLine();//保存点云数据int savepoint = DkamSDK_CSharp.SavePointCloudToPcdCSharp(camera, PointCloud_data, point_pixel, pointsize, "pointcloud.pcd");if (savepoint == 0){Console.WriteLine("原始点云数据保存成功!");}else{Console.WriteLine("原始点云数据保存失败!!!     错误码:" + savepoint);}//*********************************************滤波****************************************************//滤波DkamSDK_CSharp.FilterPointCloudCSharp(camera, PointCloud_data, point_pixel, pointsize, 1);//保存滤波后点云数据savepoint = DkamSDK_CSharp.SavePointCloudToPcdCSharp(camera, PointCloud_data, point_pixel, pointsize, "pointcloud_Filter.pcd");if (savepoint == 0){Console.WriteLine("滤波点云数据保存成功!");}else{Console.WriteLine("滤波点云数据保存失败!!!     错误码:" + savepoint);}//*********************************************空间滤波****************************************************//空间滤波int spfilter = DkamSDK_CSharp.SpatialFilterPointcloudCSharp(camera, PointCloud_data, point_pixel, pointsize, 80);if (spfilter == 0){Console.WriteLine("空间滤波成功!");}else {Console.WriteLine("空间滤波失败!!!     错误码:" + savepoint);}//保存滤波后点云数据savepoint = DkamSDK_CSharp.SavePointCloudToPcdCSharp(camera, PointCloud_data, point_pixel, pointsize, "pointcloud_SpatialFilter.pcd");if (savepoint == 0){Console.WriteLine("空间滤波点云数据保存成功!");}else{Console.WriteLine("空间滤波点云数据保存失败!!!     错误码:" + savepoint);}//断开相机连接int disconnect = DkamSDK_CSharp.CameraDisconnect(camera);if (disconnect == 0){Console.WriteLine("成功断开相机!");}else{Console.WriteLine("断开相机失败!!!     错误码:" + disconnect);}//销毁相机参数DkamSDK_CSharp.DestroyCamera(camera);}//connect = 0else{Console.WriteLine("相机连接失败,失败代码:" + connect);}}//MAIN}//PROGRAM
}//NAMESPACE

运行结果

在这里插入图片描述

结果对比

  • 滤波前
    在这里插入图片描述

  • 滤波后
    在这里插入图片描述

  • 滤波+空间滤波后
    在这里插入图片描述

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

后记

  • 知微传感Dkam系列3D相机可以应用于定位分拣、焊接引导、逆向建模、检测测量等领域
http://www.dtcms.com/a/426923.html

相关文章:

  • AEO 与 SEO 双引擎:整合策略赢得搜索全域可见性
  • 精读C++20设计模式:行为型设计模式:中介者模式
  • 【C++经典例题】逆波兰表达式求值:栈的经典应用与实现详解
  • mmcv 安装 2025
  • 设计模式(C++)详解——观察者模式(Observer)(2)
  • LeetCode 392 判断子序列
  • 树的存储结构
  • 2025年9月GESP(C++三级):数组清零
  • 怎样查看网站建设时间注册公司需要什么费用
  • Deepoc具身模型外拓板:重塑居家服务机器人的交互革命
  • cpuset v1
  • 2025年9月个人工作生活总结
  • Java SE “JDK1.8新特性”面试清单(含超通俗生活案例与深度理解)
  • 站台建筑资阳网站推广
  • 【论文阅读 | ECCV 2024 | DAMSDet:具有竞争性查询选择与自适应特征融合的动态自适应多光谱检测变换器】
  • 企业网站 三网系统好玩有趣的网站
  • 小程序的页面宽度 设置多少合适??
  • 基于libwebsockets与cJson的ASR Server实时语音识别实现指南
  • golang 写路由的时候要注意
  • EXCEL哪个版本开始支持VSTO-office插件?
  • 盲盒抽卡机小程序的技术挑战与解决方案
  • 全网网站建设推广国外设计网站都有哪些
  • 零基础学AI大模型之LangChain聊天模型多案例实战
  • GPU 网络基础,Part 2(MoE 训练中的网络挑战;什么是前、后端网络;什么是东西向、南北向流量)
  • 【菜狗学聚类】序列嵌入表示、UMAP降维——20250930
  • 网站外链建设的八大基本准则东大桥做网站的公司
  • MySQL进阶知识点(八)---- SQL优化
  • 【C++STL :vector类 (二) 】攻克 C++ Vector 的迭代器失效陷阱:从源码层面详解原理与解决方案
  • C++ string类常用操作
  • 修改网站模板详解如何开网站需要多少钱