知微传感Dkam系列3D相机SDK例程篇:CSharp连接相机及保存数据

序言

写在前面

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

DKAM系列3D相机SDK C#例程及注释

相机连接、数据采集及保存

  • 本例程基于WIN10+VisualStudio2022+DkamSDK_1.6.83,采用C#语言
  • SDK的配置方法,请参考官方提供的SDK说明书
C# 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConnectSave_CSharp
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello ZhiSENSOR");

            //**********************************************查询、连接相机****************************************************

            int camer_num = 0;
            int camera_ret = -1;

            //发现局域网内的相机
            camer_num = DkamSDK_CSharp.DiscoverCamera();
            Console.WriteLine("局域网内共有" + camer_num + "台3D相机");
            //显示局域网内相机IP
            for (int i = 0; i < camer_num; i++) {
                Console.WriteLine("局域网内相机的IP为:" + DkamSDK_CSharp.CameraIP(i));

                if (String.Compare(DkamSDK_CSharp.CameraIP(i), "192.168.40.91") == 0) { 
                    camera_ret = i;
                }
            }

            //连接相机
            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);

                //获取当前RGB相机的宽和高
                SWIGTYPE_p_int width_rgb = DkamSDK_CSharp.new_intArray(0);
                DkamSDK_CSharp.GetCameraWidth(camera, width_rgb, 1);
                int widthRGB = DkamSDK_CSharp.intArray_getitem(width_rgb, 0);

                SWIGTYPE_p_int height_rgb = DkamSDK_CSharp.new_intArray(0);
                DkamSDK_CSharp.GetCameraHeight(camera, height_rgb, 1);
                int heightRGB = DkamSDK_CSharp.intArray_getitem(height_rgb, 0);

                Console.WriteLine("RGB 图宽度:" + widthRGB + "    RGB 图高度:" + heightRGB);

                //定义红外数据大小
                PhotoInfoCSharp gray_data = new PhotoInfoCSharp();
                int graysize = width * height;
                byte[] gray_pixel = new byte[graysize];

                //定义点云大小
                PhotoInfoCSharp PointCloud_data = new PhotoInfoCSharp();
                int pointsize = width * height * 6;
                byte[] point_pixel = new byte[pointsize];

                //定义RGB大小
                PhotoInfoCSharp RGB_data = new PhotoInfoCSharp();
                int RGBsize = widthRGB * heightRGB * 3;
                byte[] RGB_pixel = new byte[RGBsize];

                //**********************************************打开数据通道****************************************************

                //开启数据流通道(0:红外 1:点云 2:RGB)
                //红外
                int streamgray = DkamSDK_CSharp.StreamOn(camera, 0);
                if (streamgray == 0)
                {
                    Console.WriteLine("红外图通道打开成功!");
                }
                else
                {
                    Console.WriteLine( "红外图通道打开失败!!!     错误码:" + streamgray);
                }
                //点云
                int streampoint = DkamSDK_CSharp.StreamOn(camera, 1);
                if (streampoint == 0)
                {
                    Console.WriteLine("点云通道打开成功!");
                }
                else
                {
                    Console.WriteLine("点云通道打开失败!!!     错误码:" + streampoint);
                }

                int streamRGB = DkamSDK_CSharp.StreamOn(camera, 2);
                if (streamRGB == 0)
                {
                    Console.WriteLine("RGB 图通道打开成功!");
                }
                else
                {
                    Console.WriteLine("RGB 图通道打开失败!!!     错误码:" + streamRGB);
                }

                //开始接受数据
                int start = DkamSDK_CSharp.AcquisitionStart(camera);
                if (start == 0)
                {
                    Console.WriteLine("可以开始接收数据!");
                }
                else
                {
                    Console.WriteLine("不能接收数据!!!     错误码:" + start);
                }

                //刷新缓冲区
                DkamSDK_CSharp.FlushBuffer(camera, 0);
                DkamSDK_CSharp.FlushBuffer(camera, 1);
                DkamSDK_CSharp.FlushBuffer(camera, 2);


                Console.WriteLine("等待数据采集、传输。。。");

                //**********************************************等待相机上传数据***************************************
                //获取红外数据
                int capturegray = DkamSDK_CSharp.TimeoutCaptureCSharp(camera, 0, gray_data, gray_pixel, graysize,10000000);
                if (capturegray == 0)
                {
                    Console.WriteLine("红外数据接收成功!");
                }
                else
                {
                    Console.WriteLine("红外数据接收失败!!!     错误码:" + capturegray);
                }

                //获取点云数据
                int capturepoint = DkamSDK_CSharp.TimeoutCaptureCSharp(camera, 1, PointCloud_data, point_pixel, pointsize, 10000000);
                if (capturepoint == 0)
                {
                    Console.WriteLine("点云数据接收成功!");
                }
                else
                {
                    Console.WriteLine("点云数据接收失败!!!     错误码:" + capturepoint);
                }

                //获取RGB数据
                int capturergb = DkamSDK_CSharp.TimeoutCaptureCSharp(camera, 2, RGB_data, RGB_pixel, RGBsize,10000000);
                if (capturergb == 0)
                {
                    Console.WriteLine("RGB数据接收成功!");
                }
                else
                {
                    Console.WriteLine("RGB数据接收失败!!!     错误码:" + capturergb);
                }
                //保存红外数据
                int savegray = DkamSDK_CSharp.SaveToBMPCSharp(camera, gray_data, gray_pixel, graysize, "gray.bmp");
                if (savegray == 0)
                {
                    Console.WriteLine("红外数据保存成功!");
                }
                else
                {
                    Console.WriteLine("红外数据保存失败败!!!     错误码:" + savegray);
                }

                //保存点云数据
                int savepoint = DkamSDK_CSharp.SavePointCloudToPcdCSharp(camera, PointCloud_data, point_pixel, pointsize, "pointcloud.pcd");
                if (savepoint == 0)
                {
                    Console.WriteLine("点云数据保存成功!");
                }
                else
                {
                    Console.WriteLine("点云数据保存失败!!!     错误码:" + savepoint);
                }

                //保存RGB数据
                int saveRGB = DkamSDK_CSharp.SaveToBMPCSharp(camera, RGB_data, RGB_pixel, RGBsize, "rgb.bmp");
                if (saveRGB == 0)
                {
                    Console.WriteLine("RGB数据保存成功!");
                }
                else
                {
                    Console.WriteLine("RGB数据保存失败!!!     错误码:" + saveRGB);
                }

                //**********************************************结束工作***************************************
                //释放内存
                Array.Clear(point_pixel, 0, point_pixel.Length);
                Array.Clear(gray_pixel,  0, gray_pixel.Length);
                Array.Clear(RGB_pixel,   0, RGB_pixel.Length);

                //关闭数据流
                DkamSDK_CSharp.AcquisitionStop(camera);
                int streamoff = DkamSDK_CSharp.StreamOff(camera, 0);
                int streamoffpoint = DkamSDK_CSharp.StreamOff(camera, 1);
                int streamoffRGB = DkamSDK_CSharp.StreamOff(camera, 2);

                //断开相机连接
                int disconnect = DkamSDK_CSharp.CameraDisconnect(camera);
                if (disconnect == 0)
                {
                    Console.WriteLine("成功断开相机!");
                }
                else
                {
                    Console.WriteLine("断开相机失败!!!     错误码:" + disconnect);
                }
                //销毁相机参数
                DkamSDK_CSharp.DestroyCamera(camera);

            }
            else
            {
                Console.WriteLine("相机连接失败,失败代码:" + connect);
            }
        }
    }
}
  • 以上代码应用D330XS型号相机测试成功

小结

  • 使用SDK或DkamView直接保存的灰度图(红外图)和RGB图是没有经过畸变校正的,若需要,用户可获取相机各镜头的内参进行校正,获取内、外参的例程可在本专栏的其他文章中获取
相关推荐
出门吃三碗饭11 小时前
3DGS场景优化 8*A100GPU实战
3d
做cv的小昊14 小时前
结合代码读3DGS论文(10)——ICLR 2025 3DGS加速&压缩新工作Sort-Free 3DGS论文及代码解读
论文阅读·人工智能·游戏·计算机视觉·3d·图形渲染·3dgs
图扑软件16 小时前
图扑 HT 帧动画 | 3D 动态渲染设计与实现
前端·javascript·3d·动画·数字孪生
新启航光学频率梳17 小时前
精密陶瓷轴承套孔深光学3D轮廓测量-激光频率梳3D轮廓技术
科技·3d·制造
weixin_505154461 天前
博维数孪,重塑3D作业指导新时代
人工智能·物联网·3d·智慧城市·数据安全·数字孪生
3DVisionary1 天前
从微观损伤到宏观断裂:DIC非接触测量在复合材料可靠性验证中的前沿实践
人工智能·数码相机·算法·机器学习·3d·复合材料·dic技术
程序员Android1 天前
Android 相机MFNR 拍照trace 分析
android·数码相机
格林威1 天前
工业相机图像采集处理:从 RAW 数据到 AI 可读图像,海康相机 C# 实战代码深度解析
开发语言·c++·人工智能·数码相机·c#·工业相机·堡盟相机
格林威2 天前
工业相机参数解析:曝光时间与运动模糊的“生死博弈”
c++·人工智能·数码相机·opencv·算法·计算机视觉·工业相机
Godspeed Zhao2 天前
3D打印的造物革命5
3d