要开始使用图漾相机VCamera的C# SDK进行开发,首先需要搭建合适的开发环境。以下是详细的配置步骤:
安装Visual Studio:推荐使用Visual Studio 2019或更高版本。安装时需勾选".NET桌面开发"工作负载,这将自动安装.NET Framework 4.8开发所需的组件。
SDK文件准备:从图漾官网下载最新的Percipio_SDK开发包,解压后应包含以下关键目录:
项目配置:
注意:必须确保项目平台设置为x64,因为图漾相机的SDK是64位架构的。如果设置为Any CPU或x86会导致运行时错误。
完成环境搭建后,可以通过以下代码测试SDK的基本功能:
csharp复制// 初始化相机通道
CameraUtils.InitChannel();
// 发现网络中的相机设备
var devices = CameraUtils.DiscoverCameras();
if(devices.Count == 0)
{
Console.WriteLine("未发现任何相机设备!");
return;
}
// 获取SDK版本信息
string version = UCV.CameraApi.Interop.Version.GetVersionString();
Console.WriteLine($"VCamera SDK版本: {version}");
// 显示发现的相机信息
foreach(var device in devices)
{
Console.WriteLine($"型号: {device.ModelName}, 序列号: {device.Sn}, IP: {device.NetworkInfo.Ip}");
}
这段代码演示了最基本的SDK功能调用流程:初始化→发现设备→获取信息。如果运行正常,说明开发环境已正确配置。
图漾相机提供三种主要的连接方式,适用于不同场景:
csharp复制CameraCapture camera = CameraCapture.GetCameraBySerialNumber("207000159205");
CameraApiStatus status = camera.Connect();
csharp复制CameraCapture camera = CameraCapture.GetCameraByIpAddress("192.168.6.50");
CameraApiStatus status = camera.Connect();
csharp复制var devices = CameraUtils.DiscoverCameras();
var targetDevice = devices.FirstOrDefault(d => d.Sn == "207000163420");
CameraCapture camera = CameraCapture.GetCameraByDeviceInfo(targetDevice);
CameraApiStatus status = camera.Connect();
实际开发建议:在生产环境中,推荐使用序列号连接方式,因为相机的IP地址可能会变化,而序列号是唯一的硬件标识。
连接相机后,可以实时获取相机状态信息:
csharp复制// 获取相机详细信息
CameraInfo info;
status = camera.GetCameraInfo(out info);
Console.WriteLine($"固件版本: {info.FirmwareVersion}");
Console.WriteLine($"当前状态: {info.State}");
// 查询传感器支持情况
var sensorTypes = Enum.GetValues(typeof(SensorType)).Cast<SensorType>();
foreach(var type in sensorTypes)
{
if(camera.HasSensor(type))
{
bool enabled;
camera.IsSensorEnabled(type, out enabled);
Console.WriteLine($"{type}传感器: {(enabled?"启用":"禁用")}");
}
}
图漾相机支持两种采集模式:
csharp复制// 开始连续采集
status = camera.StartCapture();
if(status != CameraApiStatus.Success)
{
Console.WriteLine($"开始采集失败: {status}");
return;
}
// 停止采集
status = camera.StopCapture();
csharp复制// 配置为软触发模式
CameraFeature triggerMode;
status = camera.GetFeature("TriggerMode", out triggerMode);
status = triggerMode.SetValue(new CameraValue(CameraValueType.String, "On"));
// 发送软触发信号
status = camera.FireSoftwareTrigger();
性能提示:连续采集模式适合高帧率应用,而软触发模式适合需要精确控制采集时刻的场景,如与其他设备同步。
图漾相机支持多种图像格式和分辨率配置:
csharp复制// 获取当前图像模式
ImageMode currentMode;
status = camera.GetCurrentImageMode(SensorType.Depth, out currentMode);
Console.WriteLine($"当前深度图模式: {currentMode.RawPixelFormat}, {currentMode.Width}x{currentMode.Height}");
// 获取支持的所有图像模式
List<ImageMode> modes = camera.GetImageModes(SensorType.Depth, out status);
foreach(var mode in modes)
{
Console.WriteLine($"支持模式: {mode.RawPixelFormat}, {mode.Width}x{mode.Height}");
}
// 设置新的图像模式
ImageMode newMode = new ImageMode {
RawPixelFormat = RawPixelFormat.YUV422,
Width = 640,
Height = 480
};
status = camera.SetImageMode(SensorType.Depth, newMode);
图漾相机提供了丰富的可调参数:
csharp复制// 设置曝光时间(毫秒)
CameraFeature exposure;
status = camera.GetFeature("Depth/ExposureTime", out exposure);
status = exposure.SetValue(new CameraValue(CameraValueType.Double, 30.0));
// 获取曝光时间范围
Float64Range expRange;
status = exposure.GetRange(out expRange);
Console.WriteLine($"曝光时间范围: {expRange.Min}~{expRange.Max}ms");
// 启用自动白平衡
CameraFeature awb;
status = camera.GetFeature("Texture/BalanceWhiteAuto", out awb);
status = awb.SetValue(new CameraValue(CameraValueType.String, "Continuous"));
图漾SDK内置了多种图像处理算法:
csharp复制// 启用深度图去畸变
status = camera.SetUndistortionEnabled(SensorType.Depth, true);
// 配置深度图滤波参数
CameraFeature filter;
status = camera.GetFeature("DepthFilter/Enabled", out filter);
status = filter.SetValue(new CameraValue(CameraValueType.Boolean, true));
CameraFeature filterSize;
status = camera.GetFeature("DepthFilter/Size", out filterSize);
status = filterSize.SetValue(new CameraValue(CameraValueType.Int64, 5));
图漾相机支持保存多组参数配置,便于快速切换:
csharp复制// 获取用户配置集管理器
var userSetMgr = camera.GetUserSetManager();
// 保存当前配置到"HighAccuracy"集
status = userSetMgr.SaveToUserSet("HighAccuracy");
// 加载配置集
status = userSetMgr.LoadUserSet("HighAccuracy");
// 设置开机自动加载的配置集
status = userSetMgr.SetPowerOnUserSet("HighAccuracy");
通过回调机制可以高效处理相机数据:
csharp复制// 帧回调函数
void FrameCallback(FrameSet frameSet)
{
// 处理深度帧
if(frameSet.DepthFrame != null)
{
Console.WriteLine($"收到深度帧: {frameSet.DepthFrame.Width}x{frameSet.DepthFrame.Height}");
}
// 处理彩色帧
if(frameSet.ColorFrame != null)
{
Console.WriteLine($"收到彩色帧: {frameSet.ColorFrame.Width}x{frameSet.ColorFrame.Height}");
}
}
// 注册回调
status = camera.RegisterFrameSetCallback(FrameCallback);
缓冲区管理:
多线程处理:
参数优化顺序:
问题现象:无法发现相机或连接失败
排查步骤:
问题现象:图像噪声大或深度数据不准确
解决方案:
问题现象:帧率低或延迟大
优化建议:
SDK提供了多个示例程序,涵盖了主要功能点:
DepthToPointCloud:演示如何将深度图转换为3D点云
SoftTrigger:完整的软触发实现
DumpAllFeatures:列举所有可配置参数
UserSetSelector:用户配置集管理工具
在实际项目中,可以基于这些示例代码进行扩展开发,快速实现定制化功能。