序言
写在前面
- 本人从事机器视觉细分的3D相机行业。编写此系列文章主要目的有:
- 1、便利他人应用相机,本系列文章包含公司所出售相机的SDK的使用例程及详细注释;
- 2、促进行业发展及交流。
- 知微传感Dkam系列3D相机可以应用于定位分拣、焊接焊缝提取、逆向建模、检测测量等领域
DKAM系列3D相机SDK C#例程及注释
相机连接、数据采集及保存
- 本例程基于WIN10+VisualStudio2022+DkamSDK_1.6.83,采用C#语言
- SDK的配置方法,请参考官方提供的SDK说明书
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);
}
}
}
}
小结
- 使用SDK或DkamView直接保存的灰度图(红外图)和RGB图是没有经过畸变校正的,若需要,用户可获取相机各镜头的内参进行校正,获取内、外参的例程可在本专栏的其他文章中获取