尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

双光谱相机系统搭建指南:海康可见光+艾睿红外在Windows与Ubuntu下的实践

双光谱相机系统搭建指南:海康可见光+艾睿红外在Windows与Ubuntu下的实践 做机器视觉项目的人迟早会撞上一个场景文档里写着可见光红外双光谱方案Windows上先做算法验证和采集Ubuntu上再跑部署和推理可相机一拿到手光是让两块传感器同时出图就够折腾几天。我这次面对的是海康USB 3.0可见光工业相机走MVS软件和艾睿红外相机IRay同时接入两套系统中间踩过不少坑也把MVS、USB 3.0驱动、红外SDK、Linux权限这些环节彻底理了一遍。这篇文章把完整的搭建过程和排查经验写出来给正在做双光谱采集、红外测温、机器视觉检测的朋友一个可以照着走的参考。1. 为什么偏偏是海康可见光艾睿红外双光谱项目的骨架1.1 可见光与红外组合的实际价值可见光相机负责提供纹理和颜色信息适合做定位、字符识别、表面缺陷检测红外相机提供热分布和温度数据适合做发热点定位、热缺陷分析、人体/设备测温。两台相机各自输出独立图像流在算法侧做配准融合这是目前工业检测和科研领域的常见做法。很多项目一开始只采购海康工业相机因为MVS对开发者友好SDK稳定文档全。等到发现只靠可见光解决不了温度相关问题比如PCB板过热点、电池发热隐患、电气柜局部过热才补购红外相机。艾睿光电IRay是国产红外相机里性价比很高的选择工业模组和整机都有USB 3.0接口的型号不少可以直接对接PC。1.2 USB 3.0接口在两套系统下的定位USB工业相机 vs 网口GigE相机的区别我多说两句。GigE相机布线距离远但带宽受限跑高分辨率高帧率时容易吃满千兆网口USB 3.0相机理论带宽5Gbps实际能比千兆网口高好几倍同分辨率下能支撑更高帧率而且即插即用不依赖复杂的网络配置。缺点是传输距离短一般不超过3米线缆质量要求高。对桌面级采集工作站来说USB 3.0是体验最好的接口对部署在产线远端的场景才需要换GigE或Camera Link。一个项目周期里开发机上跑Windows部署机上跑Ubuntu已经是常态。原因很简单Windows下相机SDK、调试工具、可视化做得最好适合写算法、做采集Ubuntu下做模型推理、docker容器化、无人值守服务更省心。相机连接方案必须在两套系统下都能稳定跑通这篇文章的核心就是这条双系统链路。2. Windows环境MVS和IRay SDK的安装顺序与驱动雷区2.1 海康MVS安装与USB 3.0控制器体检海康机器视觉相机的上位机软件叫MVSMachine Vision Software全称是MVS图像采集软件不是海康电商网站那个。去海康机器人官网下载对应产品的Windows安装包双击安装一直下一步就行。安装完会在桌面生成MVS图标插上USB 3.0相机之后打开MVS的设备管理正常情况下能枚举出相机点连接就能出图。如果你插上相机之后MVS里一个设备都看不到先别急着怀疑相机坏了。先看USB口是否真跑在3.0速率。工业相机用的是USB 3.0协议但USB 3.0和USB 2.0物理接口长得一样插到2.0口上也能识别只是帧率会掉得非常夸张。很多机箱的前面板USB口内部走的是主板USB 2.0插针即便接口是蓝色也会降速。推荐在Windows下用微软官方工具USBTreeView查看设备连接速率。打开之后找到你的相机设备如果显示Port Speed: 5000 Mbps说明跑在USB 3.0正确速率如果显示480 Mbps说明协商成了USB 2.0换个主板上直出的USB口再试。这一步是为什么相机只有几帧的首要排查点。2.2 艾睿红外相机驱动与SDK安装艾睿红外相机的安装比海康稍微复杂一点。不同型号的驱动方式不同一部分型号是UVC标准协议插上Windows就能识别为摄像头系统自带驱动即可出图另一部分型号需要使用厂商提供的USB驱动安装SDK时会自动装上。在Windows下建议直接安装艾睿官方提供的IRay Camera SDK。SDK安装包通常包含USB驱动文件动态库和头文件相机调试Demo源码固件升级工具安装完成后打开设备管理器在图像设备或通用串行总线设备下应该能看到IRay相关的设备条目。然后用SDK自带的Demo程序试运行能够实时显示红外图像并读取温度数据说明驱动链路正常。注意艾睿部分红外相机的调试软件和SDK是分开下载的不要只装了Demo软件就以为SDK也装好了。做二次开发的朋友务必确认头文件和库已经在默认安装路径下。2.3 两套相机同机取流的关键顺序我在Windows上一次接两个相机时遇到一种情况MVS和IRay的Demo程序都能分别打开各自的相机但两个程序同时运行时会争夺相机资源。原因不是冲突而是USB控制器和图像缓冲的调度问题。实际经验是先打开MVS连接海康相机并开始取流再打开IRay Demo连接红外相机。这个顺序能稳定出图反着来容易导致其中一个相机连接失败。如果哪个相机连不上就把两个软件全部退出拔掉两个相机重新插电后再按顺序启动。如果项目里需要自己写C或C#程序同时操作两套相机建议在代码中保持同样的初始化顺序先初始化海康SDK并注册回调再初始化IRay SDK打开红外设备。这个顺序在Windows和Ubuntu下我都验证过稳定性和资源占用比乱序好很多。3. Ubuntu环境udev规则、软链接与运行时库3.1 海康MVS Linux版安装海康的Linux SDK不是简单一个deb包就完事很多人的问题就出在这里。去官网下载MVS的Linux版本通常是如下结构MVS-4.x.x_x86_64_xxx.tar.gz ├─ install ├─ uninstall ├─ lib ├─ bin ├─ cfg ├─ doc └─ setup.sh解压之后在终端里执行sudo ./setup.sh进行安装。脚本会往 /opt/MVS 目录写入运行时库、配置文件和工具并且会尝试配置udev规则。如果Ubuntu版本较新或当前用户权限不完整setup.sh有可能中途退出但不会报很清楚的原因。实测最稳妥的安装方法sudo tar -xzf MVS-xxx.tar.gz -C /opt sudo mv /opt/MVS-xxx /opt/MVS然后手动添加环境变量echo export LD_LIBRARY_PATH/opt/MVS/lib:$LD_LIBRARY_PATH ~/.bashrc source ~/.bashrc海康相机的设备节点是 /dev/mvusb* 这样的名字。插上USB 3.0工业相机后执行ls /dev/mvusb*如果没有这个节点说明驱动识别失败或udev规则没生效。海康的setup.sh会把一个规则文件放到 /etc/udev/rules.d/比如 93-hikrobot-usb.rules 之类。如果setup.sh执行不完整手动把SDK包里的 rules 文件拷贝过去sudo cp /opt/MVS/xxx.rules /etc/udev/rules.d/ sudo udevadm control --reload-rules sudo udevadm trigger接着运行SDK自带的示例程序能出图就算完成。3.2 艾睿红外SDK在Ubuntu下的安装IRay SDK的Linux版本和海康思路类似也是解压后把动态库放到自定义路径然后设置环境变量。它的库文件通常叫 libirayCamAsync.so 或 libirayCamSync.so分别对应异步取流和同步取流接口。安装步骤tar -xzf iray_sdk_linux_xxx.tar.gz cd iray_sdk_linux_xxx sudo cp lib/* /usr/lib/ sudo cp include/* /usr/include/如果SDK包里有 rules 目录也需要拷贝到udisksudo cp rules/*.rules /etc/udev/rules.d/ sudo udevadm control --reload-rules sudo udevadm trigger然后用 lsusb 确认设备被识别lsusb | grep -i iray艾睿的USB设备厂商ID和产品ID不同批次可能不一样但grep iray能过滤出来。如果你的是非标设备grep不到也没关系可以插入相机前后分别执行lsusb做对比找到新增的USB设备条目。3.3 编程连接时的库加载与权限Ubuntu下编译程序要点是Include路径和动态库路径不能错。给一个典型的CMakeLists.txt片段include_directories(/opt/MVS/include) link_directories(/opt/MVS/lib) include_directories(/usr/include/iray) link_directories(/usr/lib/iray) target_link_libraries(your_project MvCameraControl irayCamAsync )如果运行时报 cannot open shared object file就是因为 LD_LIBRARY_PATH 没设置或者动态库没放到系统的默认搜索路径。我习惯把SDK的lib目录放一份到 /usr/lib这样不用每个终端都source环境变量。权限问题更隐蔽。很多初学者用sudo运行示例程序能出图普通用户运行就提示找不到设备这是典型的权限配置缺失。解决方案就是上文说的udev规则。没有udev规则时普通用户对USB设备的读写权限被限制SDK无法打开设备节点。加上规则文件并reload后普通用户跑程序就正常了。小经验Ubuntu升级内核或者系统版本大版本更新后/lib/modules里的内核模块可能和已有守护进程冲突如果相机突然识别不到先检查内核版本再重新执行一次 udevadm control --reload-rules 和 udevadm trigger比反复插拔更有效。4. 带宽、线缆、供电USB 3.0相机稳定的底层逻辑4.1 相机数据量怎么算才不会超带宽很多人以为USB 3.0有5Gbps就随便用事实上这是误把理论速率当成可用带宽。USB 3.0采用8b/10b编码有效速率大约4Gbps再扣除协议开销和帧间隙实际可用带宽大概在350~450MB/s之间。操作系统、USB控制器、其他USB设备都会抢占这个带宽。相机单帧大小计算公式单帧数据量 宽 × 高 × 像素位深 / 8单位字节 传输带宽需求 单帧数据量 × 帧率举例海康MV-CA050系列500万像素相机分辨率2448×20488bit灰度模式帧率10fps单帧数据量 2448 × 2048 × 1 5,013,504 B ≈ 4.78 MB 带宽需求 4.78 × 10 47.8 MB/s如果切到24bit彩色带宽需求变成约143MB/s单个相机仍然没问题。但如果同时跑两台500万彩色相机60fps那就逼近带宽上限了。艾睿红外相机分辨率通常是640×51216bit输出单帧数据量 640 × 512 × 2 655,360 B 640 KB 带宽需求按25fps算 ≈ 16 MB/s这个量级对USB 3.0来说非常轻松甚至USB 2.0理论带宽都能扛住但实际延迟和稳定性明显差一个档次所以还是优先接USB 3.0口。4.2 线缆和供电是隐藏的坑USB 3.0对线缆的要求比很多人想的更苛刻。便宜的线缆屏蔽差插上之后可能稳定掉帧或者偶尔识别不到。判断标准很简单短距离1米内用带屏蔽的成品线基本没问题超过3米就必须考虑有源USB延长线或光纤USB 3.0线。相机供电也要注意。USB 3.0接口标准供电电流是900mA海康一些高功耗相机如果同时带动补光灯或云台USB口的供电会不够。表现是相机偶尔掉线或者一直处于低帧率状态。工业相机通常带一个12V或24V外接电源接口建议接上不要纯靠USB口取电。艾睿红外相机的功耗相对低但某些型号带TEC制冷比如非制冷红外本来没有TEC但一些科研型号有峰值电流也不小最好外接电源。4.3 一个USB控制器下能挂几台相机主板原生USB 3.0控制器一般是1个最多2个每个控制器下所有端口共享5Gbps带宽。如果你有多台相机不要全插在一排紧挨着的USB口上那样它们多半共用同一个控制器带宽会被均分。建议用 lsusb -t 或 Windows的USBTreeView 查看设备挂在哪棵树上尽量让不同相机分配到不同的控制器。如果主板自带口不够插一张PCIe转USB 3.0扩展卡芯片最好是NEC/Renesas或ASMedia兼容性较好每个扩展卡有独立控制器带宽隔离效果明显。我实测过一个板载控制器上同时跑海康500万彩色相机 艾睿红外相机是没有问题的因为总带宽需求不到200MB/s。但再加一台高分辨率可见光相机就会出现偶发丢帧。规划相机数量时别只看单接口速率要看控制器总吞吐。5. 实测翻车识别不到、掉帧、热插拔崩系统5.1 识别不到相机从枚举过程逐层排查这个现象几乎是每个第一次接工业相机的人都会遇到。排查顺序可以固定下来看物理连接设备管理器或lsusb里有没有新增设备。Windows在设备管理器—图像设备里看有没有黄色感叹号Ubuntu执行dmesg | tail看内核日志观察是否有USB枚举错误。看速率协商是否正确USBTreeView或lsusb -t确认是不是5000Mbps。看SDK枚举列表MVS的搜索设备功能是否为空IRay Demo是否报设备数量0。在这四个步骤里第4步最容易误导人。因为MVS是按USB3 Vision标准去枚举相机设备的艾睿的红外相机用的是自己的一套协议虽然同样插在USB口上但MVS根本看不到它。反过来IRay SDK也不会把海康相机列出来。这不是电脑问题是协议不同不用折腾驱动。如果海康相机之前被识别过这次突然识别不到大概率是上次非正常拔出导致驱动状态卡住。Windows下直接重启比在设备管理器里反复禁用启用更省时间。5.2 帧率上不去先排除速率协商再看软件参数帧率低的第一嫌疑是USB 2.0。接口协商成480Mbps时500万相机10fps都跑不满表现是图像有明显间隔感。用USBTreeView看速率只要显示480Mbps就换口。其次是软件参数问题。MVS里帧率没设置为最大或者触发模式处于外部触发状态相机不会自己出图。这是很多人的疏忽点传感器带宽够USB也正常但相机工作在软件触发模式下没发Trigger指令就一帧都没有。红外相机掉帧还和温度校准有关。艾睿红外相机如果打开了辐射校正或非均匀性校正NUC这个过程会短暂中断取流有时表现为周期性掉帧。这不是故障是相机在做标定。如果测试时无法接受中断可以把NUC间隔调长或者关闭自动NUC改为手动时机触发。5.3 热插拔导致系统卡死或蓝屏USB工业相机比普通摄像头更依赖稳定的驱动握手。我遇到过一次在MVS取流过程中直接拔掉海康相机再插回去时MVS直接卡死无响应。更严重的一次在Ubuntu下运行IRay Demo时直接拔相机终端显示libusb报错整个Xorg会话卡住只能强制重启。后来总结的规范流程先停止软件取流退出程序再拔USB。如果无法正常取出先禁用设备再拔线。Linux下先卸载相关进程比如用killall MVS或关闭demo程序。不要带着取流buffer热插拔尤其是同时连接两台相机时。为什么工业相机的热插拔如此脆弱因为USB 3.0相机的数据传输是持续DMA模式操作系统在取流过程中已经为设备分配了固定的内存映射拔掉设备后驱动不知道数据流已经中断还在等中断请求或DMA完成这时候新的设备插入驱动状态机就乱了。遇到这种情况唯一的救星就是重启软件或重启系统。5.4 两套SDK同时使用的资源冲突海康SDK和IRay SDK同时在一个进程里初始化有潜在的内存共享库冲突吗我用的过程中没遇到符号冲突symbol collision因为两个库的导出符号名不同。但有一种坑线程优先级和调度冲突。海康相机取流回调里如果做耗时处理比如实时给红外图像叠加温度曲线很多人的习惯是通过全局变量或消息循环传递数据。如果两个取流回调都在各自线程里跑CPU核数又少75%的图像处理里其中一个会增加延迟导致套件程序消耗超过300%的CPU。我的方案是每个相机的取流回调里只做图像拷贝和加时间戳通过生产者消费者队列丢给后端的处理线程。这样视频采集和高计算负载解耦实测CPU占用率降了一半以上。5.5 Windows和Ubuntu行为差异带来的各种假故障同一套代码在Windows上正常换到Ubuntu上出了问题不一定是你程序的问题也可能是系统差异。一个典型例子Windows下USB设备可以由用户态直接访问权限模型粗放只要驱动装上普通用户就能开相机。Ubuntu下如果udev规则不对普通用户根本没有/dev/bus/usb节点的读写权限程序的打开设备会返回Operation not permitted。通道上看起来像设备没插好或SDK异常实际是权限问题用sudo运行一下立刻能对比出来。另一个例子Windows下MVS安装程序会把相机的固件和配置文件管理好Ubuntu下手动安装时配置文件路径不能带中文或空格。很多人把SDK解压到一个带空格/中文的目录编译时符号链接出现null字符程序莫名其妙段错误。把SDK放在纯英文路径下所有问题迎刃而解。6. 项目实操中的工程化建议6.1 统一时间戳保证双光谱数据对齐红外和可见光相机的帧率通常不一致海康可能是30fps艾睿红外可能是25fps或9fps如果要做像素级融合就必须给两路图像打统一时间戳。实际操作中不要用相机自带的timestamp因为两台相机的时钟源不同直接对比时间戳会有一个固定的偏移。我习惯在PC端用 chrono 或 std::chrono::steady_clock 在收到图像回调的瞬间打上主机时间戳再按最小时间间隔做对齐同时用棋盘格或加热靶标做空间标定双管齐下融合效果才稳定。6.2 保存原始数据还是只保存温度矩阵红外相机如果不做测温输出的可能已经是伪彩色图像比如铁红色但做测温项目时务必保留14bit或16bit原始温度数据。伪彩色图像会损失温度分辨率后期没法重算温度只能看个大概。海康可见光相机如果也是灰度场景建议同时开启Bayer原始输出或16bit模式后期做图像处理时动态范围更充足。提前在SDK初始化阶段把像素格式设置对比后期从8bit JPG里恢复信息靠谱得多。6.3 从演示Demo到服务部署的迁移很多人先在Windows的MVS里用鼠标点出图像或者在IRay Demo里看到红外画面就觉得万事大吉等到把代码迁移到Ubuntu并部署成systemd服务时才发现命令行的项目里缺了一堆依赖。建议从一开始就写成配置驱动的方式把相机型号、分辨率、帧率、曝光时间、增益、红外测温参数都放配置文件里环境换一台机器只改配置不重编译。SDK版本在项目里也锁死不要因为装了最新MVS就顺手升级SDK不然换一台机器后发现接口变了代码得重写。另一个部署细节Ubuntu服务器版默认没有 GUI而MVS本身依赖X11但MVS的Linux SDK里库本身可以在无GUI环境跑只是需要显式指定“无窗口模式”。如果你在命令行里运行出错检查一下是否错误地初始化了GUI组件或者直接改用SDK纯控制台接口不要依赖MVS的界面进程。IRay SDK也一样纯控制台方式在无头服务器上工作得很好前提是确保libusb和udev规则配好。7. 最后的经验之谈双光谱相机系统折腾到现在我最大的体会就是别跟USB较劲提前把带宽、控制器、线缆、供电和权限这些基础设施配到位后面会省掉无数麻烦。每次换系统或者换电脑先花十分钟做环境健康检查确认USB速率协商是5Gbps、确认udev规则已生效、确认SDK库的LD_LIBRARY_PATH是对的三个都没问题再谈取流。真要遇到相机识别不到也别慌沿着“物理层—枚举层—SDK层”顺序一层层查基本能在半小时内定位问题。这套流程我在Windows和Ubuntu之间来回切换了很多次核心逻辑完全一致只是命令和界面工具不同。希望这篇文章能让你在连接海康MVS和艾睿红外相机的路上少走几圈弯路。
返回列表