大恒相机开发(2)---Python软触发调用采集图像
这段代码是一个Python程序,用于从大恒相机采集图像,通过软件触发来采集图像。
完整代码
咱们直接上python的完整代码:
python
# version:1.0.1905.9071
import gxipy as gx
import time
from PIL import Image
def acq_color(device, num):
"""
:brief acquisition function of color device
:param device: device object[Device]
:param num: number of acquisition images[int]
"""
for i in range(num):
time.sleep(0.1)
# send software trigger command
device.TriggerSoftware.send_command()
# get raw image
raw_image = device.data_stream[0].get_image()
if raw_image is None:
print("Getting image failed.")
continue
# get RGB image from raw image
rgb_image = raw_image.convert("RGB")
if rgb_image is None:
continue
# create numpy array with data from raw image
numpy_image = rgb_image.get_numpy_array()
if numpy_image is None:
continue
# show acquired image
img = Image.fromarray(numpy_image, 'RGB')
img.show()
# print height, width, and frame ID of the acquisition image
print("Frame ID: %d Height: %d Width: %d"
% (raw_image.get_frame_id(), raw_image.get_height(), raw_image.get_width()))
def acq_mono(device, num):
"""
:brief acquisition function of mono device
:param device: device object[Device]
:param num: number of acquisition images[int]
"""
for i in range(num):
time.sleep(0.1)
# send software trigger command
device.TriggerSoftware.send_command()
# get raw image
raw_image = device.data_stream[0].get_image()
if raw_image is None:
print("Getting image failed.")
continue
# create numpy array with data from raw image
numpy_image = raw_image.get_numpy_array()
if numpy_image is None:
continue
# show acquired image
img = Image.fromarray(numpy_image, 'L')
img.show()
# print height, width, and frame ID of the acquisition image
print("Frame ID: %d Height: %d Width: %d"
% (raw_image.get_frame_id(), raw_image.get_height(), raw_image.get_width()))
def main():
# print the demo information
print("")
print("-------------------------------------------------------------")
print("Sample to show how to acquire mono or color image by soft trigger "
"and show acquired image.")
print("-------------------------------------------------------------")
print("")
print("Initializing......")
print("")
# create a device manager
device_manager = gx.DeviceManager()
dev_num, dev_info_list = device_manager.update_device_list()
if dev_num is 0:
print("Number of enumerated devices is 0")
return
# open the first device
cam = device_manager.open_device_by_index(1)
# set exposure
cam.ExposureTime.set(10000)
# set gain
cam.Gain.set(10.0)
if dev_info_list[0].get("device_class") == gx.GxDeviceClassList.USB2:
# set trigger mode
cam.TriggerMode.set(gx.GxSwitchEntry.ON)
else:
# set trigger mode and trigger source
cam.TriggerMode.set(gx.GxSwitchEntry.ON)
cam.TriggerSource.set(gx.GxTriggerSourceEntry.SOFTWARE)
# start data acquisition
cam.stream_on()
# camera is color camera
if cam.PixelColorFilter.is_implemented() is True:
acq_color(cam, 1)
# camera is mono camera
else:
acq_mono(cam, 1)
# stop acquisition
cam.stream_off()
# close device
cam.close_device()
if __name__ == "__main__":
main()
详细解读和功能说明
下面是代码的详细解读和功能说明:
-
导入必要的库:
gxipy
:大恒相机的SDK,用于控制相机。time
:用于在采集图像之间添加延迟。PIL
(Python Imaging Library):用于图像处理,这里用于显示图像。
-
定义采集函数:
acq_color(device, num)
:用于彩色相机的采集函数。acq_mono(device, num)
:用于单色相机的采集函数。
-
采集函数的共同步骤:
- 循环
num
次,每次采集一幅图像。 time.sleep(0.1)
:在每次采集之间添加0.1秒的延迟。device.TriggerSoftware.send_command()
:发送软件触发命令,告诉相机现在可以采集图像。raw_image = device.data_stream[0].get_image()
:从相机的第一个数据流中获取原始图像。- 如果
raw_image
为None
,则打印错误信息并继续下一次循环。 - 对于彩色相机,
rgb_image = raw_image.convert("RGB")
:将原始图像转换为RGB格式。 - 对于单色相机,直接使用
raw_image
。 numpy_image = rgb_image.get_numpy_array()
或numpy_image = raw_image.get_numpy_array()
:将图像数据转换为numpy数组。- 如果
numpy_image
为None
,则跳过当前循环。 img = Image.fromarray(numpy_image, 'RGB')
或img = Image.fromarray(numpy_image, 'L')
:将numpy数组转换为PIL图像对象,'RGB'用于彩色图像,'L'用于单色图像。img.show()
:显示采集到的图像。- 打印采集图像的帧ID、高度和宽度。
- 循环
-
定义
main
函数:- 打印程序信息和初始化步骤。
- 创建设备管理对象
device_manager
。 - 枚举设备并检查是否有设备连接。
- 打开第一个设备
cam
。 - 设置曝光时间
cam.ExposureTime.set(10000)
和增益cam.Gain.set(10.0)
。 - 根据设备类型设置触发模式,对于USB2设备,只设置触发模式为开启;对于其他设备,还需要设置触发源为软件触发。
- 开始数据采集
cam.stream_on()
。 - 检查相机是否为彩色相机,并调用相应的采集函数。
- 停止数据采集
cam.stream_off()
。 - 关闭设备
cam.close_device()
。
-
程序入口:
if __name__ == "__main__":
:确保当脚本被直接运行时,才执行main
函数。
这个程序的主要功能是初始化大恒相机,设置曝光时间和增益,然后通过软件触发采集一幅图像,并显示采集到的图像。程序还根据相机的类型(彩色或单色)调用不同的采集函数。最后,程序停止数据采集并关闭相机设备。
的一些信息,如帧ID和帧率。
扩展学习
使用大恒相机进行图像采集时,以下是一些性能优化技巧:
-
合理设置相机参数:
- 根据应用需求合理设置分辨率、曝光时间、增益等参数,以达到最佳的图像质量和采集速度。
-
使用软件触发:
- 通过软件触发来控制图像采集,可以更精确地控制采集时机,减少不必要的图像数据。
-
图像格式转换和预处理:
- 利用大恒相机SDK提供的功能,对图像进行格式转换(如Bayer转RGB)和预处理(如红蓝转换、垂直镜像等),以减少后续处理的负担。
-
利用回调采集提高效率:
- 使用回调采集方式,当图像就绪时自动触发处理,这样可以避免轮询检查图像是否就绪的开销,提高采集效率。
-
图像增强功能:
- 通过图像增强功能,如坏点校正、锐化、对比度、亮度调节等,可以在采集阶段就优化图像质量,减少后续处理的复杂度。
-
流对象属性控制:
- 通过流对象控制相机采集相关的属性和统计信息,可以更精细地管理采集过程,提高性能。
-
多相机采集稳定性:
- 对于多相机系统,使用支持多路I/O输入/输出信号和丰富图像预处理功能的图像采集卡,可以提高多相机采集的稳定性和效率。
-
使用高速接口:
- 如果相机支持,使用高速接口如CoaXPress或千兆网接口,可以显著提高数据传输速度,减少传输延迟。
-
优化代码逻辑:
- 在图像采集的代码中,避免不必要的图像复制和转换操作,直接在相机端进行必要的处理,可以减少CPU占用率,提高整体性能。
-
合理管理资源:
- 及时释放不再使用的资源,如关闭数据流、注销事件回调等,可以避免资源泄露,保持系统的稳定性和性能。
通过上述技巧,可以有效地提升大恒相机在图像采集过程中的性能和效率。