简介:Dalsa Nano相机使用例程是一套面向机器视觉与自动化检测开发者的C++实战项目,围绕GigE千兆网工业相机的采集、显示、存储及控制展开。例程基于Dalsa官方SDK并结合OpenCV等图像处理库,实现实时显示、BMP/JPEG格式图像保存,开放曝光、增益、白平衡等参数调节,并演示软件触发与硬件触发模式,帮助用户掌握工业相机与上位机的完整交互流程。压缩包共77个文件,涵盖C++源文件、头文件、多版本Visual Studio工程文件(2005至2015)、已编译的exe及调试记录等,整体仅1.57MB,小巧完整。已有620人学习浏览,适合需要快速上手Dalsa Nano相机或参考GigE Vision采集框架的开发者;包内附带可执行程序,可直接运行查看效果,也可对照源码学习参数配置与图像处理的实现细节。 第一次在产线上见到Dalsa Nano,是在一个锂电池外观检测项目里。甲方直接指定了型号,我拿到手才意识到,这相机跟之前用过的国产千兆网相机完全是两个路子:默认走GigE Vision协议,官方推荐用Sapera LT SDK,连IP都要按固定套路配,不然刷新一万次也找不到设备。那一次我光是排查“相机识别不到”和“带宽不识别”就耗掉大半天。后来摸熟了,发现Nano的底层逻辑其实很清晰,只是官方资料偏英文,例程也散。这篇就把我从选型、环境搭建、第一个采集例程到触发和带宽调优的实践经验写出来,给准备上手Dalsa Nano的朋友做个参考。
1. 为什么是Dalsa Nano:这类机型在项目里的定位
Dalsa在工业相机圈子里以高速、高可靠性出名,Nano系列就是它主打紧凑结构和性价比的一条产品线。外观很小,很多型号还支持PoE供电,一根网线搞定数据和供电,对机台内部走线非常友好。但“紧凑”只是外壳,真正决定它能不能用进项目里的,是传感器和接口。
1.1 产品线背景与Nano系列的特点
Nano系列常见型号有Nano-M、Nano-XS、Nano-C等,分辨率从几十万像素到几百万像素都有,传感器多为Sony的CMOS,带全局快门。全局快门的价值在于抓拍运动物体时不会有明显的果冻效应,这在打螺丝、贴标、飞拍这类场景里非常关键。
接口方面,它主要走GigE Vision,理论上千兆网,实际有效带宽受网卡、包大小、CPU处理能力的影响很大。除了GigE,个别型号也有Camera Link的选项,但项目里用得最多的还是GigE版本,我下面讲的内容也以GigE为主。
1.2 选型前先算清楚账:分辨率、帧率、接口
选相机时别急着看外观,先算三笔账:视野需求对应的分辨率、运动速度对应的快门和帧率、现场布线对应的接口类型。
假设一个工件视野是50mm,精度要求0.05mm,那么至少需要1000像素覆盖整个方向,再考虑边缘余量,200万像素级别的相机就够用了。如果工件在传送带上以0.5m/s的速度移动,抓拍时曝光时间最好控制在1ms以内,否则会拖影。帧率取决于产线节拍,比如每分钟检测120个工件,20fps就够用。Nano的参数表上都会写最大帧率,但那是“最大”,实际能跑多高还取决于带宽和触发频率。
我见过不少项目一上来就选500万像素、100fps,结果现场千兆网带宽根本喂不饱,最后只能降帧率或者裁ROI。选型阶段把数据量算清楚,后面能省掉很多麻烦。
2. 把环境搭好,等于成功一半
我在现场踩过最大的坑,就是往电脑上装好Sapera LT,接上相机,然后软件里一片空白。你以为相机坏了,其实大概率是IP没配好。
2.1 GigE Vision通信的底层门槛:IP与网卡
GigE Vision相机本质是一个网络设备,有自己的IP地址。Dalsa Nano出厂默认可能是自动IP或固定IP,第一次上电最好手动设一个静态IP。我习惯把电脑网卡设为192.168.100.2,子网掩码255.255.255.0,然后用Sapera LT的CamExpert把相机IP设成192.168.100.3。
这里有个关键细节:电脑和相机必须在同一网段,千兆网卡要开启巨型帧(Jumbo Frame),否则数据包超过默认MTU时会被拆分,带宽直接打折扣,具体表现就是“相机能识别但帧率上不去”,或者不少人反馈的“采集卡不识别带宽”。网卡方面,Intel的服务器级千兆网卡比较稳,USB转千兆网卡不推荐,丢包率会让你怀疑人生。
2.2 Sapera LT安装与CamExpert里的基础配置
Sapera LT是Dalsa官方的SDK,安装没什么特别的,注意路径别带中文。装完以后打开CamExpert,它能识别到Nano并列出所有参数,比如Pixel Format、Exposure、Gain、Trigger Source。我会先把触发设为Internal即连续采集,像素格式设为Mono8,然后点击Grab看实时图像。如果这一步能出图,说明链路通了。
CamExpert里还有一个很实用的功能,把当前所有参数保存成.ccf文件,后面自己的例程加载这个配置文件就能快速恢复相机状态。这个文件相当于相机的“配置文件”,项目换机时直接复制使用,非常省事。
2.3 连接不上的排查顺序
如果就是找不到相机,我一般按这个顺序查:
- 物理线路,换一根网线插到板载网口试一下。
- Windows防火墙,把“网络发现”打开,并关掉当前网络专用的防火墙,否则Sapera的广播包发不出去。
- 杀毒软件,部分杀软会拦截相机通信,直接退出测试。
- 检查IP,把电脑改成自动获取IP试一次,看相机是否被DHCP分配了地址。
- 如果都不行,用Sapera Device Access工具或Wireshark抓包,看是否有相机发出的广播包。
实际上90%的情况是防火墙和IP问题。遇到别慌,按优先级逐项排除就好。
3. 跑通第一个采集例程:从底层API到保存一帧图
CamExpert能出图,接下来就要把它变成代码。Sapera LT的API设计偏老派,但逻辑清晰,核心就是几个对象:采集设备、缓冲区、传输对象。
3.1 Sapera LT的对象模型:采集、缓冲、传输
我用得最多的是SapAcqDevice、SapBuffer、SapAcqDeviceToBuf这三个类。SapAcqDevice对应相机设备,SapBuffer是图像缓冲区集合,通常申请6到8个buffer做轮流存储,SapAcqDeviceToBuf负责把设备采集的图像搬到系统内存。
整个流程就是:创建设备对象,创建缓冲区,创建传输对象,Start,然后在回调里处理图像。对新人来说,最难理解的是缓冲区和回调。可以把它想成流水线上的一排空托盘,相机是投料口,每抓一帧就往空托盘里放一块料,放满了就通知你去搬走,同时继续抓下一帧。
3.2 一个最小可编译的连续采集程序
下面是一个连续采集几秒然后保存单帧的极简例子:
#include "SapClassBasic.h" int main() { // 设备名从CamExpert里查看,比如"Nano-XS" SapAcqDevice* acq = new SapAcqDevice("Nano-XS"); if (acq == nullptr || !acq->Create()) { printf("创建设备失败\n"); return -1; } // 申请8个缓冲区 SapBuffer* buffer = new SapBuffer(8, acq); if (buffer == nullptr || !buffer->Create()) { printf("创建缓冲区失败\n"); return -1; } // 建立采集传输对象 SapAcqDeviceToBuf* transfer = new SapAcqDeviceToBuf(acq, buffer); if (transfer == nullptr || !transfer->Create()) { printf("创建传输失败\n"); return -1; } // 开始连续采集 transfer->Start(); Sleep(5000); // 采5秒 // 停止并保存最后一帧 transfer->Freeze(); buffer->Save("capture.bmp"); // 清理资源 transfer->Destroy(); buffer->Destroy(); acq->Destroy(); return 0; }注意:Sleep在Windows上是windows.h里的函数,Linux下需要改成usleep或sleep。执行前先用CamExpert确认设备名。真实项目里应该用回调函数在每帧到来时处理,而不是采集满5秒再保存,否则系统缓冲区溢出后就会丢帧。
3.3 保存图像与释放资源时的注意点
SapBuffer::Save可以存BMP、JPEG等格式,但保存路径不要带中文,否则有些版本的Sapera会直接失败。另外,程序崩溃经常是因为没有先停止传输就释放对象。我习惯按这个顺序收尾:先Freeze或Stop,再Destroy,顺序反了容易出现句柄泄漏,严重时甚至会蓝屏。
4. 曝光、增益、ROI的调参思路
相机出图只是开始,拿到一张“能看”的图才是关键。Nano的参数很多,但日常项目里用得最多的就是曝光、增益和ROI三类。
4.1 曝光时间与帧率是怎么互相牵制的
曝光时间决定图像亮度,也决定运动物体拖影的程度。如果曝光时间设为5ms,那么理论上最大帧率就受限于200fps,再加上传感器读出时间,实际肯定达不到。Nano内部是全局曝光还是卷帘曝光取决于型号,但无论如何,曝光时间不能超过帧周期。
例如在30fps下,帧周期约33.3ms,只要把曝光设为1到5ms,剩下的时间足够传输和等待触发,触发频率就能稳定在30fps左右。如果曝光时间设置得太长,触发信号来了相机还在曝光,那一帧就会被跳过。
4.2 增益能不开就不开
增益本质是放大信号,但放大图像信号的同时也放大了噪点。对于外观检测项目,噪点会明显增加误判率。我一般优先调光源亮度和曝光时间,把增益尽量压在0到6dB以内。实在环境光不足,优先补光,而不是拉增益。如果是做OCR字符识别,噪点对识别率的影响更明显,这钱省不得。
4.3 ROI不只是裁剪画面,更是省带宽的手段
ROI表示只输出画面的一部分区域。很多人以为ROI只是用来裁剪视野,其实它最大的作用是降带宽、提帧率。图像数据量跟分辨率成正比,把200万像素裁成50万像素,单帧数据量直接降为原来的四分之一。
在千兆网带宽固定的前提下,数据量降下来,帧率就能提上去。比如在0.5m/s的传送带上,如果只需要检测工件中间的一小块区域,就设置ROI把它框住。Nano的ROI参数可以在CamExpert里设,也可以用代码设。Width和Height必须按相机要求的对齐规则设置,有些型号要4像素对齐,否则设置会报错。
5. 触发模式:让相机按节拍干活
连续采集适合调试,产线上更常用的是触发模式:传感器或PLC给一个信号,相机拍一帧。
5.1 外触发接线与电气注意
Nano的触发接口一般通过航空插头引出,线缆上会有LINE0、LINE1以及电源正负极。外触发信号要按相机手册来接,特别注意是光耦隔离输入还是普通GPIO。
我曾经把24V的PLC信号直接接到相机IO上,结果烧了一个通道,教训非常深刻。大部分工业相机IO只能接5到12V,如果PLC输出是24V,必须串接限流电阻,或者用中间继电器转成干接点信号。接线前一定先看手册里的电平和极性说明。
5.2 触发配置的关键参数与时序
在CamExpert里,把Trigger Source设为External,Trigger Mode设为On,再选择触发信号是上升沿还是下降沿。这里有个容易被忽视的参数叫触发防抖(Debouncer),现场电磁干扰大时会产生毛刺,导致误触发。我一般设10到50us的防抖,前提是实际触发信号的上升沿足够陡。
触发信号的时间宽度必须大于相机的最小触发脉宽,否则相机根本检测不到。配合曝光的时序是:触发边沿到来,相机开始曝光,曝光结束,读取并传输图像,然后等待下一个触发。如果触发频率过高,相机来不及完成曝光和读出,后面的触发就会丢失,表现就是隔几张丢一张。
5.3 软触发、硬触发的使用边界
Sapera LT里还有Software Trigger,也就是上位机发指令控制拍照。它适合节拍宽松、没有外部传感器的场景,比如实验室检测台。
但产线上有PLC、有传感器、有运动控制,我始终建议用硬件触发,因为时序最稳定。软触发依赖上位机的响应时间,Windows下一次软触发可能会有几毫秒到几十毫秒的抖动,这种不确定性在高速检测场景里无法接受。
6. 高帧率项目的带宽优化与丢帧排查
很多人在Nano上跑到高帧率时都会遇到“带宽不识别”“帧率上不去”的问题,我也被这个折腾过。这里把计算方法和排查链路一起讲透。
6.1 千兆网带宽计算与数据量估算
千兆网理论带宽是1Gbps,换算成实际负载约125MB/s,但GigE Vision有协议开销,实测稳定值在100到110MB/s左右。先算图像数据量:宽乘以高乘以位深乘以帧率。
比如2048x1536的8位灰度图,单帧大小约3MB,30fps就是90MB/s,还在带宽内。如果硬要跑到60fps,数据量就是180MB/s,带宽明显超了。解决办法要么降帧率,要么缩ROI,要么换更高带宽的接口。有些Nano型号支持Dalsa的TurboDrive功能,能把千兆网有效带宽推到更高的值,但需要特定网卡和驱动配合,不能只看型号就默认支持。
6.2 巨型帧、包大小和接收缓冲的调整
网络传输时,一帧图像会被拆成多个UDP包。默认MTU是1500字节,每个数据包很小,包数量多,CPU开销大。开启巨型帧后MTU可以到9000字节,包数量变少,传输效率明显提升。
具体操作是:在网卡属性里把Jumbo Packet设为9000,然后把Sapera里相机的Packet Size也设成9000,两边必须一致。如果电脑主板网卡不支持巨型帧,至少也要把Packet Size调到能匹配的最大值。接收缓冲方面,可以在网卡高级设置里把Receive Buffers调大,比如从默认值调到1024或2048,防止突发流量时丢包。
6.3 丢帧的真实原因与排查链路
丢帧不一定是带宽不够。我在现场总结了一条排查链路:
- 看Sapera的传输统计,确认是“丢包”还是“丢帧”。丢包往往是网络层问题,比如包大小不匹配、网卡质量差、线缆有衰减;丢帧往往是应用层来不及处理,比如回调里做了耗时操作、CPU占用100%。
- 关闭其他占网络的程序,尤其是Windows自动更新和杀毒软件后台扫描。
- 用网卡厂商的诊断工具看丢包率,如果很高,先换网线和网口。
- 如果以上都没问题,重装网卡驱动,或者换一块Intel千兆网卡。
实测下来,USB转网卡是最不靠谱的方案,GigE相机尽量不要用USB转接。曾经有个项目在实验室一切正常,上车后频繁丢帧,最后查到是现场临时用了一个USB转网口,换回板载千兆口后立马恢复。
这台相机用了快两年,我换到新机台时基本已经形成一套固定动作:先确认IP和网段,再开巨型帧,然后CamExpert出图,最后写触发时序。这四步走通,项目就稳了大半。如果你是第一次用Dalsa Nano,建议先按这个顺序跑一遍,把简单链路跑熟再碰高帧率,否则并发问题叠在一起,排查起来会非常痛苦。
本文还有配套的精品资源,点击获取