COI实验室技能:python控制相机的方法——采集、处理、显示、实时

COI实验室技能:python控制相机的方法——采集、处理、显示、实时

  本文介绍如何利用python控制办公摄像头、工业相机和科研相机。将数据采集和处理统一到python代码中。
  主要围绕解决采用什么库、掌握这个库的控制相机方法(参数配置、读取数据等等)、结合自己的算法进行处理、保存显示结果。
  基本流程:导入相关的库 -> 读取图片的方法 -> 处理数据 -> 结果保存、显示等等。

在这里插入图片描述

目录

  • 1. python控制办公摄像头
  • 2. python控制工业相机的例子
    • 2.1 环境配置
    • 2.2 控制pointgray相机
  • 3. python控制科研相机
  • 4. 实时监测系统的实现

预备内容:
● 掌握python语言以及安装加载包的方法(cv2)
● pointgray官网SDK及Python库:https://meta.box.lenovo.com/v/link/view/a1995795ffba47dbbe45771477319cc3
● PCO相机介绍python控制方法:https://www.pco.cn/software/third-party-software/python/

1. python控制办公摄像头

   使用cv2库可以直接控制家用摄像头(usb连接主机后,可以直接用电脑自带相机软件打开),读取的图像是numpy数组。具体实现方法如下:

# 实时在线测试家用摄像头
# 流程:读取图像 -> 预处理 -> 实时显示

import cv2
import time
import numpy as np

# 初始化
cv2.destroyAllWindows(), time.sleep(0.003)  # 清空cv2显示的窗口
# gap = (np.ones([448, 20], dtype=np.float32)*65535).astype(np.uint16)
cap = cv2.VideoCapture(0)		# 指定相机
one = np.ones([480, 640, 3], dtype=np.uint8)*255	# 本demo的需求,用于计算1-img的结果,实现图像色彩负片

while True:
    start = time.time()	# 记录开始时间
    # 读取图像
    ret, frame = cap.read()	# 读取为numpy数组
    # 预处理
    frame_1 = one - frame
    # 显示图像
    cv2.imshow('frame', np.concatenate([frame, frame_1], axis=1))	# 并排显示原图和处理后的图像
    if cv2.waitKey(1) == 27:    # 按下ESC键退出
        break
    # 打印帧率
    print('帧率:{:.4f} fps'.format(1.0/(time.time()-start)))

# 释放资源
cap.release()
cv2.destroyAllWindows()

运行结果:
在这里插入图片描述
图1 家用相机的python控制运行结果

2. python控制工业相机的例子

  这一节以工业相机pointgray为例,介绍python如何控制pointgray相机。
  控制工业相机笔者测试了很多办法(cv2.VideoCapture(0),pyflycap2,PyCapture2),很多方法都不行,最后成功运行的是用官网提供的相关资料,pointgray官网SDK及Python库:https://meta.box.lenovo.com/v/link/view/a1995795ffba47dbbe45771477319cc3,下面下载的压缩包中有readme文件,它也详细讲述了安装步骤。

2.1 环境配置

  装包流程:下载应用程序和python库 -> 进行安装 -> 运行demo程序 -> 进行自己的开发。

1)从官网中下载对应的SpinnakerSDK应用程序(笔者是64位电脑,就安装了x64的包),下载完之后进行安装(默认形式安装即可),装完之后打开应用程序,应用程序在安装路径的bin文件夹下,如何可以用软件打开相机,说明连接上没有问题,准备下一步;
在这里插入图片描述
软件成功打开相机,并能够控制相机;
在这里插入图片描述
2)下载python版本的压缩包,如下图,进入到python文件夹中,下载对应电脑系统和python版本的压缩包;
在这里插入图片描述
3)随便解压到一个文件夹,打开文件夹,复制.whl文件到cmd的默认路径(一般是C:\user\xxx),使用pip install xxx.whl进行安装。
在这里插入图片描述在这里插入图片描述
安装完之后,可以在命令行中输入pip list来检查pyspin包是否安装好了:
在这里插入图片描述
安装成功之后就可以使用这个库对相机进行控制了。

2.2 控制pointgray相机

  因为安装好的库是小写的,官网给的代码示例都是大写的,直接导入PySpin会出错,因此这里需要到入库名称为pyspin。

# 使用PySpin控制pointgray相机

import cv2
import numpy as np
import pyspin as PySpin

# 初始化
system = PySpin.System.GetInstance()    # 创建系统对象
cam_list = system.GetCameras()          # 获取相机列表
cam = cam_list.GetByIndex(0)            # 选择要使用的相机
cam.Init()
cam.AcquisitionMode.SetValue(PySpin.AcquisitionMode_Continuous) # 采集模式为连续采集
cam.BeginAcquisition()                  # 开始采集

# 循环
while True:
    # 读取图像
    image_result = cam.GetNextImage(1000)
    img = image_result.GetNDArray()         # 转为numpy数组
    # 显示图像
    n, m = (int(img.shape[0]/3), int(img.shape[1]/3))   # 缩小尺寸
    img_resize = cv2.resize(img, (m, n))                # 缩小后的图像
    cv2.imshow('frame', np.concatenate([img_resize, 255-img_resize], axis=1))  # 并排显示原图和处理后的图像
    # 按下 'q' 键退出循环
    if cv2.waitKey(1) == ord('q'):
        break

# 停止采集
cam.EndAcquisition()
# 关闭相机
cam.DeInit()
# 释放系统资源
del cam
del cam_list
system.ReleaseInstance()
cv2.destroyAllWindows()

结果:
在这里插入图片描述

3. python控制科研相机

  以PCO相机为例,1) 使用pip install pco安装控制PCO相机所需要的库;2)使用库初始化相机参数和读取数据;3)进行后续自己的数据处理;
  PCO官网提供的说明文档也有非常具体的操作指南,读者可以下载下来进一步学习。
PCO相机介绍python控制方法:https://www.pco.cn/software/third-party-software/python/

import cv2
import pco

# 清空cv2显示的窗口
cv2.destroyAllWindows(), time.sleep(0.003)  

# 初始化相机
cam = pco.Camera()  # 指定相机
exp_time = 0.01
cam.set_exposure_time(exp_time)
cam.record(4, mode='ring buffer')  # 启动相机
cam.wait_for_first_image()

while True:
	img, meta = cam.image(image_number=0xFFFFFFFF)	# 读取为numpy数组
	# 执行数据处理
	# xxx

	# 显示图像
	cv2.imshow('frame', img)	# 并排显示原图和处理后的图像
	# 按下 'q' 键退出循环
    if cv2.waitKey(1) == ord('q'):
        break
# 释放资源
cv2.waitKey(-1)
cam.close()
cv2.destroyAllWindows()

如图是笔者实时运行一个去散射的结果:
在这里插入图片描述
如果有自动调节曝光时间的需求,可以在上面循环语句中的xxx位置放置下面这段代码:

if np.max(img[543:1438:2, 560:1455:2]) == 65535:    # 过曝了,缩小曝光时间
    exp_time = exp_time*55000/65535
    cam.set_exposure_time(exp_time)
    print('exp_time: ', exp_time)
elif np.max(img[543:1438:2, 560:1455:2]) > 50000:   # 最大像素值>50000, 无需调节
    pass
else:                                               # 最大像素值<50000, 增加曝光时间
    exp_time = exp_time*55000/np.max(img[543:1438:2, 560:1455:2])
    cam.set_exposure_time(exp_time)
    print('exp_time: ', exp_time)

自适应曝光的实现过程:利用图像的最大值分布在50000~65535之间的约束来调节曝光时间,首先计算采集图像的最大值I_max,执行判断:1)如果最大值等于65535(说明过曝),增益系数α=55000/65535,用exp_time = αexp_time来缩小曝光时间;2)如果最大值大于50000,略过;3)如果最大值小于50000,增益系数α=55000/I_max,用exp_time = αexp_time来增大曝光时间。说明:考虑到不同帧之间最大值会波动,所以用55000这个中间值来计算增益α,这样即使有波动,只要最大值大于50000,我们就不用更新曝光时间,从而在程序上只执行一行判断语句,对整体运行效率几乎没有影响。

4. 实时监测系统的实现

  采集完图片和处理之后,只要外部增加一个循环语句,就可以实现实时监测,实时看到自己算法的效果。

while True:
	img = cam.capture()	# 这行命名是示例,要根据具体的读取命令进行编写
	cv2.imshow('windows', img)
	# 按下 'q' 键退出循环
    if cv2.waitKey(1) == ord('q'):
        break

其他相关资料:
● matlab控制pointgray工业相机:https://www.flir.cn/support-center/iis/machine-vision/application-note/getting-started-with-matlab/
● matlab控制pco相机:https://blog.csdn.net/qq_34917728/article/details/121527862

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Go 反射

目录 什么是反射 反射的弊端 reflect 包 Go 提供的反射方法 type Type 类型 type Kind 类型 TypeOf ValueOf 什么是反射 ​反射&#xff08;reflection&#xff09;是在 Java 出现后迅速流行起来的一种概念&#xff0c;通过反射可以获取丰富的类型信息&#xff0c;并可…

实战!项目管理实施过程的五大难点和痛点

作为一个在项目摸爬滚打十余年的管理人员&#xff0c;对项目管理的难点和痛点深有体会&#xff0c;这就结合我自身体验来说一说。 我认为&#xff0c;项目管理实施中的难点和痛点其实可以归结为两类&#xff1a;一类是对于项目任务本身&#xff0c;另一类则涉及到团队内部的管…

2023年,转行学Java还是web前端?

2023年要想顺利入行IT建议选择Java。 理由很简单&#xff0c;前端开发岗位需求大量减少&#xff0c;大厂裁员导致大量有经验的前端开发人员或者初级后端开发人员流入就业市场&#xff1b;作为新人缺乏技能优势和项目优势&#xff0c;而用人单位也更愿意招聘熟手&#xff0c;或…

Python 自动化指南(繁琐工作自动化)第二版:八、输入验证

原文&#xff1a;https://automatetheboringstuff.com/2e/chapter8/ 输入验证代码检查用户输入的值&#xff0c;比如来自input()函数的文本&#xff0c;格式是否正确。例如&#xff0c;如果您希望用户输入他们的年龄&#xff0c;您的代码不应该接受无意义的答案&#xff0c;如负…

chatgpt大模型赋能人形机器人之我见

我个人的看法&#xff08;不涉及任何和他项目相关的细节或商业机密&#xff0c;仅仅是我个人的泛泛而谈&#xff09;&#xff1a; 1、从大趋势来说&#xff0c;人形机器人的灵活度和通用性确实非常的高&#xff0c;是有前景的。另外轮式足式也不是他独一例&#xff0c;像 ETH …

【Redis学习】Redis管道

理论简介 问题由来 客户端向服务端发送命令分四步(发送命令→命令排队→命令执行→返回结果)&#xff0c;并监听Socket返回&#xff0c;通常以阻塞模式等待服务端响应。 服务端处理命令&#xff0c;并将结果返回给客户端。 上述两步称为:Round Trip Time(简称RTT,数据包往返…

STM32基于STM32CubeMX DMA + EXTI读取DS1307数据

STM32基于STM32CubeMX DMA EXTI读取DS1307数据✨申明&#xff1a;本文章仅发表在CSDN网站&#xff0c;任何其他网站&#xff0c;未注明来源&#xff0c;见此内容均为盗链和爬取&#xff0c;请多多尊重和支持原创!&#x1f341;对于文中所提供的相关资源链接将作不定期更换。&a…

JVM垃圾回收机制简介

内存管理 Java的内存管理很大程度指的就是对象的管理&#xff0c;其中包括对象空间的分配和释放。 对象空间的分配&#xff1a;使用new关键字创建对象即可 对象空间的释放&#xff1a;将对象赋值null即可。垃圾回收器将负责所有“不可达”对象的内存空间。 垃圾回收过程 任…

蓝桥杯web备赛——Node.js

node.js之前只能说是略有了解&#xff0c;这次好好了解一下吧&#xff01; 东西还是比较多的。 目前来看就了解比赛会用到的http模块就可以了&#xff0c;其他的暂且不做了解 const http require("http");//1.引入http模块const app http.createServer();//2.创建…

华为OD机试题【狼羊过河 or 羊、狼、农夫过河】用 C++ 编码,速通

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:狼羊过河 or 羊、狼、农夫过河…

Stata 回归结果详解

目录一、数据信息二、指标1.上半部分2.下半部分三、详细解释SSM - 模型平方和SSR - 残差平方和SST - 总平方和R-squared - R方 - 拟合系数Adj R-squared - 调整后的拟合系数df - 自由度MS - 均方差F - 总体显著性检验Prob > F - P值Root MSECoef.Std. Err.tP > | t |95% …

Python(黄金时代)—— python深入使用

深拷贝和浅拷贝 可变类型与不可变类型 可变对象是指&#xff0c;一个对象在不改变其引用的前提下&#xff0c;可以修改其所指向的地址中的值 不可变对象是指&#xff0c;一个对象引用指向的值是不能修改的 浅拷贝 浅拷贝是对于一个对象的顶层拷贝&#xff1b; 简单理解就是&…

蓝桥杯基础8:BASIC-7试题 特殊的数字

资源限制 内存限制&#xff1a;512.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 153是一个非常特殊的数&#xff0c;它等于它的每位数字的立方和&#xff0c;即1531*1*15*5*53*3*3。编程求所有满足这种条件…

JavaSE——运算符

目录 一.运算符 二.赋值运算符 三.算术运算符 1.四则运算 2.加法运算 3.除法运算 4.取模运算 5.增量运算符 6.自增自减 四.关系运算符 五.逻辑运算符 1.逻辑与 && 2.逻辑或 || 3.逻辑非 &#xff01; 4. 短路求值 六.位运算符 1.按位与& 2.按位…

6款无版权可商用的图片网站

今天给大家分享几个无版权可商用的图片网站&#xff0c;无论是网页设计、还是数字营销、商业海报制作等等都可以非常简单方便的查询到自己想要的图片。 免费可商用图标库 unDraw https://undraw.co/illustrations unDraw是作者Katerina Limpitsouni一手创作的扁平化图标库&…

国内IT软件外包公司汇总(2023 最新版)!

大环境不行&#xff0c;面试太少了&#xff0c;很多本科生想进外包都没机会。非常时期&#xff0c;不需要在意那么多&#xff0c;外包作为过渡也是没问题的&#xff0c;很多外包其实比小公司还要好多了。 也不要太担心去外包会污染自己的简历&#xff0c;只要接触的项目还可以…

电商平台API接口,店铺所有商品

item_search_shop-店铺的所有商品 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥&#xff08;注册Key和secret接入&#xff1a; https://o0b.cn/anzexi&#xff09;api_nameString是API接口名称&#xff08;包括…

动态规划-构造最优二叉树的解路径_20230403

动态规划-最优二叉搜索树的解路径&#xff08;算法导论) 前言 本文将探索递归的先序和后续对信息表达的影响&#xff0c;通过考察最优二叉搜索树的解roo[i][j]的解&#xff0c;我们可以分析先序和后续遍历之间的互相转换关系&#xff0c;以及为了转换&#xff0c;所付出的空间…

蓝桥杯第23天(Python)(疯狂刷题第6天)

题型&#xff1a; 1.思维题/杂题&#xff1a;数学公式&#xff0c;分析题意&#xff0c;找规律 2.BFS/DFS&#xff1a;广搜&#xff08;递归实现&#xff09;&#xff0c;深搜&#xff08;deque实现&#xff09; 3.简单数论&#xff1a;模&#xff0c;素数&#xff08;只需要…

下一个系统不是Win12,微软要复活Win10X

先是 Windows 三年发布周期回归又是官方 UI 泄露&#xff0c;再到前不久新增的测试频道… 微软将在2024年推出或许名为 Windows 12 的下一代系统基本已经板上钉钉了。 相比过去&#xff0c;小蝾总觉得即便是换代更新能带来的震撼都越来越少了。 当年每一个版本都是划时代的更…