You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Aravis Python库获取Chunk数据失败,寻求技术指导

Aravis Python库无法读取Chunk数据的解决方案

问题描述

使用Aravis 0.8 Python库连接FLIR Blackfly S BFS-U3-120S4C相机,已通过代码开启Chunk模式并启用Timestamp Chunk,但采集帧时buffer.has_chunks()始终返回False,无法获取Chunk数据。

问题根源

  1. 缓冲区大小不匹配:开启Chunk后,相机输出的帧Payload会包含图像数据+Chunk数据,原代码在开启Chunk前获取Payload大小,导致分配的缓冲区仅能容纳纯图像数据,Chunk数据无法写入。
  2. 缺少软件触发信号:配置了软件触发源,但未主动发送触发指令,相机未生成包含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 ()

修改说明

  1. 调整Payload获取时机:将payload = camera.get_payload()移至Chunk配置完成后,确保缓冲区大小包含Chunk数据的容量。
  2. 添加软件触发指令:在每次采集前调用camera.software_trigger(),触发相机生成包含Chunk的有效帧。
  3. 优化Chunk解析器初始化:仅在确认Chunk成功启用后创建解析器,避免无效调用。

内容的提问来源于stack exchange,提问作者Chip Brommer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 02:34:58