大恒相机开发(2)—Python软触发调用采集图像

大恒相机开发(2)—Python软触发调用采集图像

    • 完整代码
    • 详细解读和功能说明
    • 扩展学习

这段代码是一个Python程序,用于从大恒相机采集图像,通过软件触发来采集图像。
在这里插入图片描述

完整代码

咱们直接上python的完整代码:

# version:1.0.1905.9071
import gxipy as gx
import time
from PIL import Imagedef 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 commanddevice.TriggerSoftware.send_command()# get raw imageraw_image = device.data_stream[0].get_image()if raw_image is None:print("Getting image failed.")continue# get RGB image from raw imagergb_image = raw_image.convert("RGB")if rgb_image is None:continue# create numpy array with data from raw imagenumpy_image = rgb_image.get_numpy_array()if numpy_image is None:continue# show acquired imageimg = Image.fromarray(numpy_image, 'RGB')img.show()# print height, width, and frame ID of the acquisition imageprint("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 commanddevice.TriggerSoftware.send_command()# get raw imageraw_image = device.data_stream[0].get_image()if raw_image is None:print("Getting image failed.")continue# create numpy array with data from raw imagenumpy_image = raw_image.get_numpy_array()if numpy_image is None:continue# show acquired imageimg = Image.fromarray(numpy_image, 'L')img.show()# print height, width, and frame ID of the acquisition imageprint("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 informationprint("")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 managerdevice_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 devicecam = device_manager.open_device_by_index(1)# set exposurecam.ExposureTime.set(10000)# set gaincam.Gain.set(10.0)if dev_info_list[0].get("device_class") == gx.GxDeviceClassList.USB2:# set trigger modecam.TriggerMode.set(gx.GxSwitchEntry.ON)else:# set trigger mode and trigger sourcecam.TriggerMode.set(gx.GxSwitchEntry.ON)cam.TriggerSource.set(gx.GxTriggerSourceEntry.SOFTWARE)# start data acquisitioncam.stream_on()# camera is color cameraif cam.PixelColorFilter.is_implemented() is True:acq_color(cam, 1)# camera is mono cameraelse:acq_mono(cam, 1)# stop acquisitioncam.stream_off()# close devicecam.close_device()if __name__ == "__main__":main()

详细解读和功能说明

下面是代码的详细解读和功能说明:

  1. 导入必要的库

    • gxipy:大恒相机的SDK,用于控制相机。
    • time:用于在采集图像之间添加延迟。
    • PIL(Python Imaging Library):用于图像处理,这里用于显示图像。
  2. 定义采集函数

    • acq_color(device, num):用于彩色相机的采集函数。
    • acq_mono(device, num):用于单色相机的采集函数。
  3. 采集函数的共同步骤

    • 循环num次,每次采集一幅图像。
    • time.sleep(0.1):在每次采集之间添加0.1秒的延迟。
    • device.TriggerSoftware.send_command():发送软件触发命令,告诉相机现在可以采集图像。
    • raw_image = device.data_stream[0].get_image():从相机的第一个数据流中获取原始图像。
    • 如果raw_imageNone,则打印错误信息并继续下一次循环。
    • 对于彩色相机,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_imageNone,则跳过当前循环。
    • img = Image.fromarray(numpy_image, 'RGB')img = Image.fromarray(numpy_image, 'L'):将numpy数组转换为PIL图像对象,'RGB’用于彩色图像,'L’用于单色图像。
    • img.show():显示采集到的图像。
    • 打印采集图像的帧ID、高度和宽度。
  4. 定义main函数

    • 打印程序信息和初始化步骤。
    • 创建设备管理对象device_manager
    • 枚举设备并检查是否有设备连接。
    • 打开第一个设备cam
    • 设置曝光时间cam.ExposureTime.set(10000)和增益cam.Gain.set(10.0)
    • 根据设备类型设置触发模式,对于USB2设备,只设置触发模式为开启;对于其他设备,还需要设置触发源为软件触发。
    • 开始数据采集cam.stream_on()
    • 检查相机是否为彩色相机,并调用相应的采集函数。
    • 停止数据采集cam.stream_off()
    • 关闭设备cam.close_device()
  5. 程序入口

    • if __name__ == "__main__"::确保当脚本被直接运行时,才执行main函数。

这个程序的主要功能是初始化大恒相机,设置曝光时间和增益,然后通过软件触发采集一幅图像,并显示采集到的图像。程序还根据相机的类型(彩色或单色)调用不同的采集函数。最后,程序停止数据采集并关闭相机设备。
的一些信息,如帧ID和帧率。

扩展学习

使用大恒相机进行图像采集时,以下是一些性能优化技巧:

  1. 合理设置相机参数

    • 根据应用需求合理设置分辨率、曝光时间、增益等参数,以达到最佳的图像质量和采集速度。
  2. 使用软件触发

    • 通过软件触发来控制图像采集,可以更精确地控制采集时机,减少不必要的图像数据。
  3. 图像格式转换和预处理

    • 利用大恒相机SDK提供的功能,对图像进行格式转换(如Bayer转RGB)和预处理(如红蓝转换、垂直镜像等),以减少后续处理的负担。
  4. 利用回调采集提高效率

    • 使用回调采集方式,当图像就绪时自动触发处理,这样可以避免轮询检查图像是否就绪的开销,提高采集效率。
  5. 图像增强功能

    • 通过图像增强功能,如坏点校正、锐化、对比度、亮度调节等,可以在采集阶段就优化图像质量,减少后续处理的复杂度。
  6. 流对象属性控制

    • 通过流对象控制相机采集相关的属性和统计信息,可以更精细地管理采集过程,提高性能。
  7. 多相机采集稳定性

    • 对于多相机系统,使用支持多路I/O输入/输出信号和丰富图像预处理功能的图像采集卡,可以提高多相机采集的稳定性和效率。
  8. 使用高速接口

    • 如果相机支持,使用高速接口如CoaXPress或千兆网接口,可以显著提高数据传输速度,减少传输延迟。
  9. 优化代码逻辑

    • 在图像采集的代码中,避免不必要的图像复制和转换操作,直接在相机端进行必要的处理,可以减少CPU占用率,提高整体性能。
  10. 合理管理资源

    • 及时释放不再使用的资源,如关闭数据流、注销事件回调等,可以避免资源泄露,保持系统的稳定性和性能。

通过上述技巧,可以有效地提升大恒相机在图像采集过程中的性能和效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/495272.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——12使用YOLO-Bin

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——12使用YOLO-Bin ​ 根据前面内容,所有的子任务已经基本结束,接下来就是调用转化的bin模型进行最后的逻辑控制了 1 .YOLO的bin使用 ​ 对于yolo其实有个简单的办法,也…

Golang的容器化技术实践总结

Golang的容器化技术实践总结 一、容器化技术概述 什么是容器化技术 容器化技术是一种轻量级、可移植的虚拟化解决方案,它将应用程序、运行环境和依赖项打包到一个被称为容器的独立单元中。容器可以在不同的操作系统中运行,具有更高的资源利用率和更快的部…

修改el-select下拉框高度;更新:支持动态修改

文章目录 效果动态修改:效果代码固定高度版本动态修改高度版本(2024-12-25 更新: 支持动态修改下拉框高度) 效果 动态修改:效果 代码 固定高度版本 注意点: popper-class 尽量独一无二,防止影…

运动控制卡网络通讯的心跳检测之C#上位机编程

本文导读 今天,正运动小助手给大家分享一下如何使用C#上位机编程实现运动控制卡网络通讯的心跳检测功能。 01 ECI2618B硬件介绍 ECI2618B经济型多轴运动控制卡是一款脉冲型、模块化的网络型运动控制卡。控制卡本身最多支持6轴,可扩展至12轴的运动控制…

自动控制系统综合与LabVIEW实现

自动控制系统综合是为了优化系统性能,确保其可靠性、稳定性和灵活性。常用方法包括动态性能优化、稳态误差分析、鲁棒性设计等。结合LabVIEW,可以通过图形化编程、高效数据采集与处理来实现系统综合。本文将阐述具体方法,并结合硬件选型提供实…

lxml提取某个外层标签里的所有文本

html如下 <div data-v-1cf6f280"" class"analysis-content">选项D错误&#xff1a;<strong>在衡量通货膨胀时&#xff0c;</strong><strong>消费者物价指数使用得最多、最普遍</strong>。 </div> 解析html文本 fro…

学习因子异步化的粒子群优化算法(AsyLnCPSO)——源码

目录 1. 学习因子异步化的概念 2. 算法步骤 2.1 初始化 2.2 迭代过程 3.优势 4. 与传统粒子群算法的区别 5.代码下载&#xff1a; 学习因子异步化的粒子群优化算法&#xff08;AsyLnCPSO&#xff09;是一种改进的粒子群优化&#xff08;PSO&#xff09;算法&#xff0c;…

直流有刷电机多环控制(PID闭环死区和积分分离)

直流有刷电机多环控制 提高部分-第8讲 直流有刷电机多环控制实现(1)_哔哩哔哩_bilibili PID模型 外环的输出作为内环的输入,外环是最主要控制的效果,主要控制电机的位置。改变位置可以改变速度,改变速度是受电流控制。 实验环境 【 !】功能简介: 按下KEY1使能电机,按下…

Verdi -- 打开Consol,创建和执行tcl命令举例

1.Verdi打开Console的步骤&#xff1a; For ref: 2创建tcl脚本. tcl脚本路径&#xff1a; 在Makefile下&#xff0c;与.v文件在同一个目录8_demo这个文件夹下。 font.tcl代码内容&#xff1a; verdiSetFont -monoFont "Courier" -monoFontSize "24" 作用…

GamePlay UE网络同步

基本同步方式: ①未复制:函数仅在本机运行,不对任何人造成影响 ②在服务器上运行:当函数在客户端上调用时才能生效。客户端会通知服务器:“请在服务器上执行这个事件”,事件的具体内容会被在服务器上执行。 ③组播(多播,Multicast):当函数在服务器上调用时才能生效…

RabbitMQ中的Topic模式

在现代分布式系统中&#xff0c;消息队列&#xff08;Message Queue&#xff09;是实现异步通信、解耦系统组件的重要工具。RabbitMQ 是一个广泛使用的开源消息代理&#xff0c;支持多种消息传递模式&#xff0c;其中 Topic 模式 是一种灵活且强大的模式&#xff0c;允许生产者…

Scala_【1】概述

第一章 语言特点环境搭建(Windows)idea编写scalaHelloWorld注意事项 Scala是一门以Java虚拟机&#xff08;JVM&#xff09;为运行环境并将面向对象和函数式编程的最佳特性结合在一起的静态类型编程语言 语言特点 Scala是一门多范式的编程语言&#xff0c;Scala支持面向对象和函…

【时间之外】IT人求职和创业应知【74】-运维机器人

目录 OpenAI最强推理模型o3发布&#xff0c;AGI测试能力暴涨 英伟达宣布收购以色列AI初创企业Runai 汤姆猫首款AI机器人产品明日发售 心勿贪&#xff0c;贵知足。 感谢所有打开这个页面的朋友。人生不如意&#xff0c;开越野车去撒野&#xff0c;会害了自己&#xff0c;不如…

移动端网页兼容适配方案小结

文章目录 前言一、使用viewport配置&#xff0c;确保完美视口二、使用rem实现弹性布局三、CSS媒体查询处理不同尺寸四、1px边框问题解决方案五、安全区域适配六、图片适配方案七、横屏适配处理八、软键盘弹出处理总结 前言 移动端适配一直是前端开发中的重点难题&#xff0c;分…

教培行业数字化未来:一站​式开发在线教育系统源码与网校APP详解

时下&#xff0c;如何有效地搭建一个全面、稳定、易于管理的在线教育系统&#xff0c;已成为越来越多教育机构关注的焦点。本篇文章&#xff0c;小编将深入探讨如何一站式开发在线教育系统源码与网校APP&#xff0c;为教培行业的数字化未来提供技术支持。 一、开发在线教育系统…

【C++基础】09、结构体

一、结构体(struct) C/C 数组允许定义可存储相同类型数据项的变量&#xff0c;但是结构体是 C 中另一种用户自定义的可用的数据类型&#xff0c;它允许存储不同类型的数据项。 结构体用于表示一条记录&#xff0c;假设现在想要跟踪图书馆中书本的动态&#xff0c;可能需要跟踪每…

android sqlite 数据库简单封装示例(java)

sqlite 数据库简单封装示例&#xff0c;使用记事本数据库表进行示例。 首先继承SQLiteOpenHelper 使用sql语句进行创建一张表。 public class noteDBHelper extends SQLiteOpenHelper {public noteDBHelper(Context context, String name, SQLiteDatabase.CursorFactory fact…

在vscode的ESP-IDF中使用自定义组件

以hello-world为例&#xff0c;演示步骤和注意事项 1、新建ESP-IDF项目 选择模板 从hello-world模板创建 2、打开项目 3、编译结果没错 正在执行任务: /home/azhu/.espressif/python_env/idf5.1_py3.10_env/bin/python /home/azhu/esp/v5.1/esp-idf/tools/idf_size.py /home…

golangci-lint安装与Goland集成

golangci-lint安装与Goland集成 1.golangci-lint概述2.golangci-lint安装3.Goland 中集成 golangci-lint4.golangci-lint 的使用5.排除代码检查 1.golangci-lint概述 golangci-lint是用于go语言的代码静态检查工具集 官网地址&#xff1a;golangci-lint 特性&#xff1a; 快…

一次成功流水账-RBDL库的安装与验证

1.安装 2.编写CMakeLists.txt文件并验证例子 1.安装 从git源码下载&#xff0c;安装依赖&#xff0c;cmake编译并安装 安装依赖库 sudo apt update sudo apt upgrade ​ sudo apt install cmake ​ sudo apt install libeigen3-dev ​ sudo apt-get install build-essentia…