Aravis Python库获取Chunk数据失败,寻求技术指导
Aravis Python库无法读取Chunk数据的解决方案
问题描述
使用Aravis 0.8 Python库连接FLIR Blackfly S BFS-U3-120S4C相机,已通过代码开启Chunk模式并启用Timestamp Chunk,但采集帧时buffer.has_chunks()始终返回False,无法获取Chunk数据。
问题根源
- 缓冲区大小不匹配:开启Chunk后,相机输出的帧Payload会包含图像数据+Chunk数据,原代码在开启Chunk前获取Payload大小,导致分配的缓冲区仅能容纳纯图像数据,Chunk数据无法写入。
- 缺少软件触发信号:配置了软件触发源,但未主动发送触发指令,相机未生成包含Chunk的有效帧。
修改后的代码
import sys import gi gi.require_version ('Aravis', '0.8') from gi.repository import Aravis # 尝试查找连接的相机 try: camera = Aravis.Camera.new (None) except TypeError: print ("未找到相机") exit () # 配置相机基础参数 camera.set_region (0,0,128,128) camera.set_frame_rate (15.0) camera.set_pixel_format (Aravis.PIXEL_FORMAT_MONO_8) # 配置软件触发 if camera.is_software_trigger_supported(): print("软件触发可用,正在尝试配置...") camera.set_trigger_source("Software") trigger = camera.get_trigger_source() if trigger == "Software": print("软件触发配置确认。") else: print("软件触发配置失败,当前触发源为: ", trigger) else: print("软件触发不可用。") # 启用Chunk数据 chunk_parser = None if camera.are_chunks_available(): # 启用指定Chunk camera.set_chunks("Timestamp") # 确认Chunk模式状态 if camera.get_chunk_mode(): print("Chunk模式已确认开启。") if camera.get_chunk_state("Timestamp"): print("Timestamp已启用。") # 创建Chunk解析器 chunk_parser = camera.create_chunk_parser() else: print("Timestamp启用失败。") else: print("Chunk模式开启确认失败。") else: print("该相机不支持Chunk数据") # 打印相机信息 print ("相机厂商 : %s" %(camera.get_vendor_name ())) print ("相机型号 : %s" %(camera.get_model_name ())) print ("帧率 : %d" %(camera.get_frame_rate())) # 开启Chunk后获取正确的Payload大小 payload = camera.get_payload () stream = camera.create_stream (None, None) # 创建适配Chunk的采集缓冲区池 for i in range(0,5): stream.push_buffer(Aravis.Buffer.new_allocate (payload)) print ("开始采集...") camera.start_acquisition() # 采集循环 try: for i in range(0,5): # 发送软件触发信号 camera.software_trigger() # 获取缓冲区 buffer = stream.pop_buffer() if buffer: print(buffer) # 检查并读取Chunk数据 if chunk_parser is not None and buffer.has_chunks(): ts = chunk_parser.get_float_value(buffer, "Timestamp") print("Timestamp: ", ts) else: print("无Chunk数据。") stream.push_buffer (buffer) else: print("未获取到缓冲区。") except Exception as error: print(error) finally: print ("停止采集。") camera.stop_acquisition ()
修改说明
- 调整Payload获取时机:将
payload = camera.get_payload()移至Chunk配置完成后,确保缓冲区大小包含Chunk数据的容量。 - 添加软件触发指令:在每次采集前调用
camera.software_trigger(),触发相机生成包含Chunk的有效帧。 - 优化Chunk解析器初始化:仅在确认Chunk成功启用后创建解析器,避免无效调用。
内容的提问来源于stack exchange,提问作者Chip Brommer
相关产品推荐
相关产品推荐

