双GigE相机连接主机

硬件:1.basler-acA1920-48gm,

1. 连接手段:
用交换机连接即可,千兆交换机+千兆网线,传输速率理论最大值在125MB/s

2. 连接实测:

通过Basler相机自带软件测试:

OpenCvSharp连接两个摄像头 opencv实现gige相机连接_General

这里最大传输速度为10.7MB/s,应该是旧的路由器限制的缘故,像素点为1920*1200=2304000;
单色相机,每个像素只有灰度显示,8位位深,故每个像素点1bit,2304000bit为2.1972MB,即单幅图像大小为2.1972MB,根据最大其传输传输速率10.7MB/s,帧率理论值为4.86fps,实际为4.7fps,相差不大,可以接受。

不通过路由器直接连接相机:

OpenCvSharp连接两个摄像头 opencv实现gige相机连接_General_02


实际传输速度100MB/s左右,帧率40fps左右,略低于理论值,可以应用。

其他配置:

https://www.51halcon.com/thread-534-1-1.html

中提到,需要将连接GigE的网卡配置改为:1.0Gbps全双工, 巨帧数据包改为9014字节:

OpenCvSharp连接两个摄像头 opencv实现gige相机连接_General_03


OpenCvSharp连接两个摄像头 opencv实现gige相机连接_Qt_04


OpenCvSharp连接两个摄像头 opencv实现gige相机连接_帧率_05


但是实测之后,帧率及传输速率在改变前后并无太大变化。

发明以太网的时候,网络带宽是10M,规定一个数据包最大为1500,但是随着以太网的发展,带宽已经到了10G,如果还沿最开始的最大数据包1500字节,就意味着设备要处理更多的数据包。打个比方,一个150000的数据,如果数据包最大为1500,则需要处理100个包,如果最大为15000,则只要处理10个包,效率就大大提高了,于是就出现了巨型帧技术。巨型帧有两种,一种是2KB,一种9KB。但是就目前的情况而言,他没有什么意义,因为网络上的所有设备都还是最大处理1500的包,如果你启用了巨型帧,数据到达这个设备的时候还要把数据包分解,重新打包成1500的数据包,会使你的数据处理更慢! 总之一句话,现在来说,要关闭巨型帧,因为他可能使你的数据处理速度降低。

3. 相机设置:

单相机测试正常,如上图最大帧率可达到47.4,几乎已达到限制帧率48fps,但是经过计算已占用几乎全部带宽,故在更换了千兆交换机及网线之后把分辨率下调至原来的1/4,为1920*1200,同时需要下调最高采样率至30fps及巨帧包大小为1500k,经12小时不间断测试,丢帧率大幅下降:

OpenCvSharp连接两个摄像头 opencv实现gige相机连接_Qt_06


看传输速率,帧率还可提高一些。设置为60fps,软件直接自动关闭;设置为45fps,恢复稳定。

4. 通过C++ Api连接到Qt:

Basler相机其C++的实例是visual studio项目,需要配置如下:
属性(Configuration Properties) -> C/C++ -> 通用(General)-> 附加包含目录(Additional Include Directories):
$(PYLON_DEV_DIR) \include;
属性(Configuration Properties) -> 链接器(Linker) -> 通用(General)-> 附加库目录(Additional Library Directories):
$(PYLON_DEV_DIR) \lib\win32(x64);

5. Qt配置Basler相机
项目->附加库->外部库;
或者直接粘贴到pro文件:

win32: LIBS += -L'C:/Program Files/Basler/pylon 6/Development/lib/x64/' -lPylonC
win32: LIBS += -L'C:/Program Files/Basler/pylon 6/Development/lib/x64/' -lGCBase_MD_VC141_v3_1_Basler_pylon
win32: LIBS += -L'C:/Program Files/Basler/pylon 6/Development/lib/x64/' -lGenApi_MD_VC141_v3_1_Basler_pylon
win32: LIBS += -L'C:/Program Files/Basler/pylon 6/Development/lib/x64/' -lPylonBase_v6_2
win32: LIBS += -L'C:/Program Files/Basler/pylon 6/Development/lib/x64/' -lPylonGUI_v6_2
win32: LIBS += -L'C:/Program Files/Basler/pylon 6/Development/lib/x64/' -lPylonUtility_v6_2


INCLUDEPATH += 'C:/Program Files/Basler/pylon 6/Development/lib/x64'
DEPENDPATH += 'C:/Program Files/Basler/pylon 6/Development/lib/x64'

#includes
INCLUDEPATH += 'C:/Program Files/Basler/pylon 6/Development/include'
DEPENDPATH += 'C:/Program Files/Basler/pylon 6/Development/include'