拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Ubuntu 22.04下海康MVS工业相机安装配置全攻略:从依赖到出图

Ubuntu 22.04下海康MVS工业相机安装配置全攻略:从依赖到出图

做机器视觉的同行应该都有体会,Windows下装海康MVS就是一直“下一步”的事,但换到Ubuntu 22.04上,情况完全不一样。依赖缺失、Client打不开、相机枚举不到、网络配置不生效、权限问题一堆,随便一个坑都能卡你半天。我最近在Ubuntu 22.04上从头配置海康工业相机MVS 2.1.2,从系统准备到相机出图整个流程走下来,把能踩的坑基本都踩了一遍。这篇就把完整过程整理出来,目标是让只懂Windows的人照着做也能把环境跑通。

这篇文章适合三类人看:一是刚把机器视觉项目迁移到Linux平台的软件工程师,二是需要在Ubuntu下调用工业相机做二次开发的算法工程师,三是实验室或现场需要快速搭一套相机调试环境的学生和调试人员。内容会覆盖MVS安装、依赖处理、网络静态IP配置、相机枚举与取流验证,以及最常见的错误排查,全部基于Ubuntu 22.04 LTS和MVS 2.1.2 Linux版实测。

1. 环境准备:先把系统底子打牢

1.1 版本搭配与确认安装包

先说版本选择。海康机器人官网的Linux版MVS分Client和SDK两部分,Client是带图形界面的调试工具,SDK是给开发用的库和头文件,安装包是同一个tar.gz,安装时选组件就行。Ubuntu 22.04对应的是x86_64架构,如果你用的是ARM板子(比如RK3588、Jetson),需要下载对应的ARM版本,安装逻辑类似但依赖会不同,这篇文章默认x86_64。

拿到安装包后别急着解压,先确认系统架构和安装包类型:

uname -m # 输出 x86_64 表示64位 file MVS-2.1.2_x86_64_20221021.tar.gz # 确认是gzip压缩的tar包

另外老规矩,先更新索引再动手,避免后面装依赖时遇到包列表过期的问题。

sudo apt update sudo apt upgrade -y

这一步很关键,特别是刚装完系统的新机器,不更新的话很多软件包版本不一致,装MVS依赖时容易出一些莫名其妙的错误。

1.2 安装前必须装的依赖库

MVS的Client基于Qt开发,运行时需要图形界面相关的库。Ubuntu 22.04默认不带这些,直接解压安装大概率会出问题。安装前先把这些依赖补上:

sudo apt install -y libgl1-mesa-glx libgl1-mesa-dri sudo apt install -y libqt5gui5 libqt5core5a libqt5widgets5 sudo apt install -y libusb-1.0-0 libglib2.0-0 libgstreamer1.0-0 sudo apt install -y gcc g++ make

其中libqt5gui5是Client图形界面能不能打开的关键,很多人装完MVS后双击启动没反应,八成就是缺了这个。libusb-1.0-0是USB3 Vision相机需要的,如果你只用网口相机,可以先不装,但建议还是提前装好,万一后面临时要接USB相机也不用再折腾。

还建议装一下net-tools,后面看网卡信息、查IP会用:

sudo apt install -y net-tools

装完依赖后重启一次系统(或者至少注销重新登录),确保环境变量和用户组状态是干净的。

2. 保姆级安装步骤:解压、安装、配置环境变量

2.1 解压安装包并运行安装脚本

MVS的安装包是个tar.gz压缩包,解压到任意目录都可以,但建议放在/home/用户名/Downloads这种可控的位置,方便后续管理和卸载。解压时注意看压缩包实际解出来的目录名:

mkdir -p ~/Downloads/mvs cd ~/Downloads/mvs tar -zxvf MVS-2.1.2_x86_64_20221021.tar.gz ls

解压后会得到一个文件夹,里面通常是一个setup.sh脚本和几个deb包、文档。进入目录查看脚本内容:

cd <解压出来的目录> cat setup.sh

我建议安装前先快速看一遍这个脚本,它会告诉你要装什么、装到哪里,以及它会帮你配置哪些系统级的东西。默认情况它会:

  1. 把SDK和Client安装到/opt/MVS。
  2. 创建/usr/bin/mvs之类的软链接。
  3. 为USB相机写入udev规则(设备权限)。
  4. 配置共享库路径到/etc/ld.so.conf.d/。

确认没问题后执行安装:

sudo ./setup.sh

安装过程会有一个文本交互界面,问你是否安装MVS Client、SDK等组件,全选Yes就行。安装完成会提示Installation finished或类似字样。如果中途卡住不动的,注意看终端提示,一般是要你按y确认。

2.2 配置环境变量,让命令随处可用

MVS安装好后,动态库默认在/opt/MVS/lib,Client和SDK可执行文件在/opt/MVS/bin。为了让系统能找到这些库,需要把对应目录加入LD_LIBRARY_PATH。最稳妥的方式是写进当前用户的~/.bashrc:

echo 'export MVS_ROOT=/opt/MVS' >> ~/.bashrc echo 'export LD_LIBRARY_PATH=$MVS_ROOT/lib:$MVS_ROOT/lib/arm64:$LD_LIBRARY_PATH' >> ~/.bashrc echo 'export PATH=$MVS_ROOT/bin:$PATH' >> ~/.bashrc source ~/.bashrc

注意lib/arm64这个路径在x86机器上没有,但写进去也没问题。另外还要更新一次系统共享库缓存:

sudo ldconfig

验证环境变量和库是否正常:

ldconfig -p | grep -i mvs which MVS.sh

如果有输出说明库被系统找到了,which能找到MVS启动脚本的路径。

2.3 启动MVS Client并验证安装

MVS的图形客户端启动脚本叫MVS.sh,一般路径是/opt/MVS/bin/MVS.sh。直接执行:

/opt/MVS/bin/MVS.sh

如果你前面依赖装对了,应该能看到一个深色主题的客户端界面弹出来,侧边栏有相机列表、设备管理、参数调节等区域。

如果启动报错,最常见的是:

MVS.sh: error while loading shared libraries: libQt5Gui.so.5: cannot open shared object file

这就是libqt5gui5没装或者LD_LIBRARY_PATH没配好。按1.2节补装后重新source ~/.bashrc再试。

验证SDK是否安装成功,可以看看头文件和库文件:

ls /opt/MVS/include ls /opt/MVS/lib

里面应该有MvCameraControl.h、MvErrorDefine.h等头文件,以及libMvCameraControl.so等动态库。有这些就说明SDK部分装好了。

3. 网络配置:让Ubuntu和工业相机连通

3.1 理解GigE Vision相机的网络要求

海康工业相机大部分型号走GigE Vision协议,也就是通过网络线传输图像和控制指令。要让Ubuntu识别到相机,核心条件就一个:电脑网卡和相机处于同一个网段。

这里有个概念需要先理清,相机本身不自带“显示器”,它的网口背后是一个嵌入式系统,有自己的MAC地址和IP。如果你想直接通过网线把相机连到电脑,就需要给电脑网卡配置一个和相机同网段的静态IP。如果相机默认IP是192.168.1.100,那电脑网卡IP就要设成192.168.1.x(x不能是100),子网掩码255.255.255.0。

还有一类相机默认IP是169.254.x.x(APIPA自动私有地址),这种需要先通过MVS的IPConfig工具或者相机SDK把相机IP改成固定IP,再配合网卡静态IP使用。

我们先看系统网络拓扑:

ip addr

或者用之前装的net-tools:

ifconfig

找到你要接相机的网卡,记下它的名字,一般是eth0、enp3s0、eno1这种形式。如果名称为空,说明网卡没启动或没接网线,先检查物理连接。

3.2 用netplan配置静态IP(推荐)

Ubuntu 22.04默认用netplan管理网络,配置文件在/etc/netplan/目录下,一般是01-network-manager-all.yaml或者00-installer-config.yaml。编辑前先备份:

sudo cp /etc/netplan/01-network-manager-all.yaml /etc/netplan/01-network-manager-all.yaml.bak

然后编辑配置文件:

sudo nano /etc/netplan/01-network-manager-all.yaml

假设相机IP是192.168.1.100,电脑网卡名是enp3s0,配置内容如下:

network: version: 2 renderer: NetworkManager ethernets: enp3s0: dhcp4: no addresses: - 192.168.1.10/24 routes: - to: default via: 192.168.1.1 nameservers: addresses: [114.114.114.114]

这里有个细节要说明:routes和nameservers只有在需要上外网时才需要。如果这张网卡只用来接相机,也就是一张纯内网卡,建议不要配置默认路由和DNS,避免影响上网:

network: version: 2 ethernets: enp3s0: dhcp4: no addresses: - 192.168.1.10/24

保存后应用配置:

sudo netplan apply

验证IP是否生效:

ip addr show enp3s0 ping 192.168.1.100

能ping通则网络通路没问题。

3.3 网卡MTU的坑:为什么明明通了但取流断断续续

很多人网络配好后能ping通相机,但一取流就掉线、画面持续几秒后卡死,问题多半出在MTU。GigE Vision协议通过UDP传图像,默认每个包大约1500字节,但如果网卡支持巨型帧(Jumbo Frame),把MTU调到9000能显著提高传输效率、减少CPU占用,同时降低丢包率。

Ubuntu 22.04下永久设置MTU有两种方式,一是naetplan配置:

ethernets: enp3s0: mtu: 9000

二是临时用命令:

sudo ip link set enp3s0 mtu 9000

需要注意的是,MTU不是单方面生效的,交换机或相机如果只支持1500,那网卡设9000反而会导致大包被丢弃、完全无法通信。所以如果改了MTU后ping都不通了,把MTU改回1500即可。我在实际使用中,网线直连相机时设9000很稳定,但经过交换机时会有兼容性问题,建议先用默认1500跑通,再尝试优化。

3.4 防火墙与多网卡冲突

Ubuntu默认防火墙ufw通常是关闭的,但如果你改过设置,需要确认不会拦截相机的UDP包。GigE Vision使用UDP端口3956(SDK控制通道)和大范围的数据端口,最简单的做法是直接对这张网卡关闭ufw,或者放行相机通信:

sudo ufw status sudo ufw allow out on enp3s0 sudo ufw allow in on enp3s0

如果只是调试环境,最简单粗暴的就是sudo ufw disable,生产环境再根据实际端口收紧。

另外,笔记本如果同时连着Wi-Fi和网线,建议优先使用有线网卡,并确保路由表不会把相机的包走到无线网卡上。出现这种问题的时候,用ip route查看路由,给相机网段加一条静态路由:

sudo ip route add 192.168.1.0/24 dev enp3s0

4. 软件上手:从相机枚举到第一次取流

4.1 在MVS Client里找到并连接相机

网络配置好后,打开MVS Client,主界面左侧“设备列表”区域会自动刷出相机。如果没自动刷新,点一下刷新按钮。正常情况下会看到一个设备节点,显示相机型号、IP、厂商信息。

如果列表里没东西,先执行:

/opt/MVS/bin/MVS.sh

确认客户端正常。然后检查相机指示灯状态——海康GigE相机网口旁边通常有个绿色或黄色小灯,网络连接正常时会亮。

在设备列表里选中相机,右键或双击可以连接。连接成功后,右边属性面板会显示相机的实时参数,包括曝光、增益、分辨率、帧率等。此时可以把“图像显示”窗口拖出来,点击“开始预览”,就能看到实时画面了。

如果连接时报错“设备忙”或者“无法打开”,一般是因为相机被其他进程(比如自己写的SDK程序)占用了,释放后再连接即可。

4.2 修改相机IP的方法

相机在MVS里枚举出来后,建议把它的IP固定下来,免得每次开机IP漂移。海康MVS提供了IP Config工具,GUI界面里右键相机节点选“IP配置”,可以设置静态IP、子网掩码、网关,填完之后相机内部会保存,重启后依然有效。

还有一种方式是直接用SDK指令改IP,后面开发的时候会用到。在MVS安装目录的/opt/MVS/SDK里有示例代码,可以参考:

/opt/MVS/SDK/Samples/GigE/GrabImage

把源码里的目标IP改成相机当前IP,执行后程序会枚举设备、连接相机、设置抓图参数,然后保存一张BMP图片。编译方式:

cd /opt/MVS/SDK/Samples/GigE/GrabImage mkdir build && cd build cmake .. make ./GrabImage

如果这一步能成功保存图片,说明SDK环境完全正常,后续开发可以放心对接。

4.3 取流参数与带宽设置

相机连上后,第一件事别急着调曝光和增益,先确认带宽和传输参数。GigE Vision下,画面分辨率越高、帧率越高,对网络带宽的要求就越大。以200万像素黑白相机为例,1080p@30fps大约需要:

  • 原始数据量:1920 × 1080 × 1字节 × 30帧 = 62.2 MB/s ≈ 500 Mbps。

这已经超过百兆网卡的上限,所以务必用千兆网卡直连或者走千兆交换机。在MVS的参数面板里,找到“GigE Vision传输层”相关的参数,确认“包大小”和“帧传输延迟”的自动配置是开启的。通常MVS会自动协商这些参数,不需要手动干涉,只有在跨网段或经过特殊交换机时才需要手动指定。

如果取流画面出现花屏、撕裂、丢帧,优先做三件事:

  1. 检查网线是否六类以上,线缆质量差是丢包的主要来源。
  2. 关闭网卡节能模式,尤其笔记本千兆网卡经常因为节能导致UDP丢包。
  3. 适当降低相机帧率或分辨率,找系统瓶颈。

5. 常见问题与排查技巧实录

5.1 问题速查表

现象可能原因解决方法
MVS.sh启动后没有窗口缺Qt库安装libqt5gui5等依赖,source环境变量
相机枚举不到网卡IP不在同一网段给网卡配置静态IP,和相机同网段
相机枚举到了但连接失败相机被其他进程占用释放进程,或重启相机重试
能连接但预览画面卡死MTU不匹配或网线质量差检查MTU、换网线、关闭网卡节能
相机无法通过USB枚举udev权限不足安装时选择安装udev规则,或手动配置权限
相机IP每次变化相机未设置静态IP用MVS IP Config把相机设为静态IP
编译SDK示例时找不到头文件环境变量未设置确认LD_LIBRARY_PATH和C_INCLUDE_PATH

5.2 几个容易忽视的细节

第一个细节,系统时间。别笑,海康相机的GigE Vision协议里会用时间戳做传输同步,如果电脑系统时间和相机时间差异过大,部分固件版本会拒绝建立稳定的流通道。先把Ubuntu的时间同步打开:

sudo timedatectl set-ntp true

第二个细节,网卡驱动的参数。如果你的电脑是Realtek网卡,Linux自带驱动在吞吐量大的情况下容易丢包,可以用ethtool检查并优化:

sudo ethtool -K enp3s0 rx-checksumming on sudo ethtool -K enp3s0 tx-checksumming on sudo ethtool -K enp3s0 scatter-gather on

如果还不行,建议换Intel网卡,机器视觉场景下Realtek确实不是最佳选择。

第三个细节,权限问题。除root外,普通用户访问USB相机需要正确配置udev规则。MVS安装时自动配好了一部分,但如果你手动改过设备权限、或者换过USB口,可能还是遇到权限拒绝。手动添加规则的方式:

sudo nano /etc/udev/rules.d/99-hikrobot.rules

内容填:

SUBSYSTEM=="usb", ATTRS{idVendor}=="2b03", MODE="0666"

然后:

sudo udevadm control --reload-rules sudo udevadm trigger

重新插拔USB线即可生效。

5.3 卸载与重装

如果安装过程中途出错,或者想换一个版本,需要彻底卸载。MVS的卸载脚本也在安装目录里,一般是uninstall.sh,执行:

sudo /opt/MVS/uninstall.sh

然后手动清理残留:

sudo rm -rf /opt/MVS sudo rm -f /usr/bin/MVS.sh sudo ldconfig

重装时建议先把依赖和系统更新做好,再走一遍安装流程。

6. SDK开发的一点点拓展思路

装好MVS不只是为了用Client看画面,对开发人员来说,真正的价值在于SDK。MVS 2.1.2的SDK在/opt/MVS/SDK下,目录结构很清晰:

Samples/ C/C++/C#/Python等语言的示例 Development/ include、lib库文件 Documentations/ 开发文档

如果你是先用Python做原型验证,可以看看Python示例,MVS官方提供了MvCameraControl_class.py。用Python写一个最简取流程序,代码量不超过30行。核心流程就是:枚举设备 → 创建句柄 → 连接设备 → 开始抓流 → 保存图片 → 关闭设备。这一步跑通后,后面接OpenCV做算法处理就顺理成章了。

如果你要给相机写一个服务程序,建议用C++版本,线程模型和内存管理更可控。SDK里的GrabImage示例是很好的起点,我在它基础上封装了一个采集类,支持回调模式和主动拉流模式,后续写ROS驱动或接推理管线都很方便。

我个人在实际操作中的体会是,MVS安装本身不难,难的是“装完之后不知道怎样才算成功”。所以一定要以“相机出图”作为安装是否成功的最终标准,而不是以“安装程序没报错”为标准。按照前面的流程走完,看到预览画面出来的那一刻,这套环境才算真正通了。最后再分享一个小技巧:把常用的网络配置和MVS启动命令写成一个初始化脚本,放在~/scripts/mvs_env.sh,方便每次开新环境时一次性恢复配置,省去反复敲命令的麻烦。

返回列表