使用 Python SDK 调试大恒相机记录

大恒相机使用 SDK调试记录
文章目录三、报错记录四、编写相机上位机界面实现多线程采集图片
前言
使用长广溪机器人作画需要用到摄像头拍摄人像照片,经过推荐,使用大恒相机,型号为MER-503-36U3C , 该相机为USB彩色相机 。
更新了
大恒相机多线程采集图像
一、驱动下载及文档使用
在官网下载驱动软件bits-.23.2305.9161.zip并安装 。
安装完成后,在安装路径下可以看到如图所示两个文件夹 Doc 及,Doc 文件夹内为大恒相机软件开发说明书,有 C++软件开发说明书.pdf ,  C软件开发说明书.pdf,用户使用说明书.pdf,软件开发说明书.pdf,接口开发说明书.pdf,接口开发说明书.pdf及示例程序说明书.pdf,文件夹下为各语言开发包及示例代码 。开发需要将 gxipy 文件夹放到项目文件夹中,并且需要额外安装 PIL 包以处理图像格式 。
二、相机调试 1.软件调试
打开软件,连接设备,打开相机,调试好的画面如图所示
未调试相机参数时屏幕可能出现偏绿色,画面卡顿,频闪,颜色错乱现象 , 参考网上资料及售后支持,我主要调节了以下几个参数,
在属性一栏设置设备带宽限制模式为 off,
可以看到设备带宽限制模式对于的 API 为,在SDK 中有同名的API可以调用设置,采集控制下设置自动曝光模式为 ,将自动曝光最大值()限制为 10000.0 , 对应的也可以在 中调用设置,在模拟控制下设置自动增益()及自动白平衡()为 ,查看接口开发说明书可以看到, 对应值为1 。
这里需要用到查找表生成工具插件,调节 Gamma,亮度及对比度,选择合适的值并保存,这里的属性依旧有对应的API可以调用在程序中设置,

使用 Python SDK 调试大恒相机记录

文章插图
售后支持提到用户参数组设置,需要保存用户参数组,在 SDK中也有对应API 。
2.开发
相机的工作流程如图所示,
开发即按照该流程进行,
2.1 引入库
import gxipy as gxdevice_manager = gx.DeviceManager()
2.2 枚举设备
device_manager = gx.DeviceManager()dev_num, dev_info_list = device_manager.update_device_list()if dev_num == 0:sys.exit(1)
2.3 打开设备
# 方法一# 获取设备基本信息列表str_sn = dev_info_list[0].get("sn")# 通过序列号打开设备cam = device_manager.open_device_by_sn(str_sn)# 方法二# 通过用户 ID 打开设备str_user_id = dev_info_list[0].get("user_id")cam = device_manager.open_device_by_user_id(str_user_id)# 方法三# 通过索引打开设备str_index = dev_info_list[0].get("index")cam = device_manager.open_device_by_index(str_index)# 下面为只针对千兆网相机使用的打开方式# 方法四# 通过 ip 地址打开设备str_ip= dev_info_list[0].get("ip")cam = device_manager.open_device_by_ip(str_ip)# 方法五# 通过 mac 地址打开设备str_mac = dev_info_list[0].get("mac")cam = device_manager.open_device_by_mac(str_mac)# 关闭设备cam.close_device()
2.4 采集控制
# 开始采集cam.stream_on()# 获取流通道个数# 如果 int_channel_num == 1 , 设备只有一个流通道,列表 data_stream 元素个数为 1# 如果 int_channel_num > 1,设备有多个流通道,列表 data_stream 元素个数大于 1# 目前千兆网相机、USB3.0、USB2.0 相机均不支持多流通道# int_channel_num = cam.get_stream_channel_num()# 获取数据# num 为采集图片次数num = 1for i in range(num):# 打开第 0 通道数据流raw_image = cam.data_stream[0].get_image()if raw_image.get_status() == gx.GxFrameStatusList.INCOMPLETE:print("incomplete frame")# 停止采集cam.stream_off()
回调方式
# 定义采集回调函数def capture_callback(raw_image):if raw_image.get_status() == gx.GxFrameStatusList.INCOMPLETE:print("incomplete frame")# 注册回调cam.data_stream[0].register_capture_callback(capture_callback)# 开始采集cam.stream_on()# 等待一段时间 , 这段时间会自动调用采集回调函数time.sleep(1)# 停止采集cam.stream_off()# 注销回调cam.data_stream[0].unregister_capture_callback()
2.5 图像处理
图像处理主要分为图像格式转换 , 图像质量提升 , 图像显示和保存 。
2.5.1图像格式转换
主要将 Bayer 格式图像转换成 RGB 格式图像 。
1)对于彩色相机
raw_image = cam.data_stream[0].get_image()# 保存 raw 图raw_image.save_raw("raw_image.raw")# 从彩色原始图像获取 RGB 图像rgb_image = raw_image.convert("RGB")if rgb_image is None:continue# 从 RGB 图像数据创建 numpy 数组numpy_image = rgb_image.get_numpy_array()if numpy_image is None:continue# 之后,用户可根据获取的 numpy_array 显示、保存图像
2)对于黑白相机
raw_image = cam.data_stream[0].get_image()# 从黑白原始图像获取 numpy 数组numpy_image = raw_image.get_numpy()if numpy_image is None:continue# 之后 , 用户可根据获取的 numpy_array 显示、保存图像
2.5.2图像质量提升
# 设置图像质量提升的参数if cam.GammaParam.is_readable():gamma_value = http://www.kingceram.com/post/cam.GammaParam.get()gamma_lut = gx.Utility.get_gamma_lut(gamma_value)else:gamma_lut = Noneif cam.ContrastParam.is_readable():contrast_value = cam.ContrastParam.get()contrast_lut = gx.Utility.get_contrast_lut(contrast_value)else:contrast_lut = Nonecolor_correction_param = cam.ColorCorrectionParam.get()# 采集获取图像、格式转换# .......# 实现图像质量提升rgb_image.image_improvement(color_correction_param, contrast_lut, gamma_lut)
2.5.3图像显示与保存
调用 PIL()的接口 Image.() , 将 numpy 数组转换成 Image 图像 , 显示
并保存 。代码如下:
1)对于黑白相机
# 显示并保存获得的黑白图片image = Image.fromarray(numpy_image, 'L')image.show()image.save("acquisition_mono_image.jpg")
2)对于彩色相机
# 显示并保存获得的彩色图片image = Image.fromarray(numpy_image, 'RGB')image.show()image.save("acquisition_RGB_image.jpg")
三、报错记录
几个月之后再运行程序报错,内容为:
gxipy.gxiapi.InvalidAccess: DeviceManager.open_device_by_index:{-1004}{{-1004}
提示相机已经打开,原因可能为之前的程序运行之后没有正常关闭相机,解决办法为断电重启相机,或者重新安装相机驱动 。
四、编写相机上位机界面实现多线程采集图片
【使用 Python SDK 调试大恒相机记录】大恒相机多线程采集图像