添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
销魂的馒头  ·  Server names (Guides) ...·  1 年前    · 
才高八斗的啄木鸟  ·  Error:Unable to ...·  1 年前    · 
文武双全的蚂蚁  ·  javascript - Convert ...·  1 年前    · 

预备内容:
● 掌握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, 无需调节
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

好的,我会尽力使用中文回答。在写一段 Python相机控制程序之前,你需要确定一下你想要控制的是什么相机,是计算机内置的摄像头还是外接的数码相机?具体的程序实现方式也会有所不同。 如果想要控制计算机内置的摄像头,可以使用 Python 的 OpenCV 库。例如,下面是一段 Python 代码,用于打开摄像头并实时显示相机捕获的画面: import cv2 # 打开摄像头,设置为 0 号设备...
一般是用C++控制Kinect,用Python还是比较少的,但还是存在用Python控制Kinect相机的需求,毕竟Python更简单些,能进一步降低开发门槛。 开发环境 Windows系统 Python 3.8或更低版本,Python版本不能高于3.8 Open3D 0.13.0 Open3D – A Modern Library for 3D Data Processing Azure kinect SDK 1.4.1 Azure-Kinect-Sensor-SDK/usage.md at
Python 安装pypylon 建议先下载pypylon轮子文件(下载地址),下载后Pip install 轮子文件, 安装即可。 注意不要用Python 3.8, pypylon 只能支持到Python3.7。 Basler相机 连上电源、插上网线,用Pylon Viewer 配置相机参数 定义几个函数采集数据、保存照片 from pypylon import pylon import cv2...
4.3.1 (1) 假设你要访问第k通道、第i行、第j列的像素。 4.3.2 (2) 间接访问: (通用,但效率低,可访问任意格式的图像) 4.3.3 (3) 直接访问: (效率高,但容易出错) 4.3.4 (4) 基于指针的直接访问: (简单高效) 4.3.5 (5) 基于 c++ wrapper 的直接访问: (更简单高效) 4.4 4、图像转换 4.4.1 (1) 字节型图像的灰度-彩色转换: 4.4.2 (2) 彩色图像->灰度图像: 4.4.3 (3) 不同彩色空间之间的转换: 4.5 5、绘图指令 4.5.1 (1) 绘制矩形: 4.5.2 (2) 绘制圆形: 4.5.3 (3) 绘制线段: 4.5.4 (4) 绘制一组线段: 4.5.5 (5) 绘制一组填充颜色的多边形: 4.5.6 (6) 文本标注: 5 五、矩阵处理 5.1 1、矩阵的内存分配与释放 5.1.1 (1) 总体上: 5.1.2 (2) 为新矩阵分配内存: 5.1.3 (3) 释放矩阵内存: 5.1.4 (4) 复制矩阵: 5.1.5 (5) 初始化矩阵: 5.1.6 (6) 初始化矩阵为单位矩阵: 5.2 2、访问矩阵元素 5.2.1 (1) 假设需要访问一个2D浮点型矩阵的第(i, j)个单元. 5.2.2 (2) 间接访问: 5.2.3 (3) 直接访问(假设矩阵数据按4字节行对齐): 5.2.4 (4) 直接访问(当数据的行对齐可能存在间隙时 possible alignment gaps): 5.2.5 (5) 对于初始化后的矩阵进行直接访问: 5.3 3、矩阵/向量运算 5.3.1 (1) 矩阵之间的运算: 5.3.2 (2) 矩阵之间的元素级运算: 5.3.3 (3) 向量乘积: 5.3.4 (4) 单一矩阵的运算: 5.3.5 (5) 非齐次线性方程求解: 5.3.6 (6) 特征值与特征向量 (矩阵为方阵): 6 六、视频处理 6.1 1、从视频流中捕捉一帧画面 6.1.1 (1) OpenCV 支持从摄像头或视频文件(AVI格式)中捕捉帧画面. 6.1.2 (2) 初始化一个摄像头捕捉器: 6.1.3 (3) 初始化一个视频文件捕捉器: 6.1.4 (4) 捕捉一帧画面: 6.1.5 (5) 释放视频流捕捉器: 6.2 2、获取/设置视频流信息 6.2.1 (1) 获取视频流设备信息: CSDN-Ada助手: 非常感谢博主的分享,这篇博客对我学习python控制相机这方面的知识帮助非常大。博主的讲解清晰易懂,内容丰富实用,看得出您花了很多时间和精力。希望博主能够继续分享更多的知识和经验,我们期待着您的下一篇文章!感谢博主的辛勤付出,您的努力让我们受益匪浅。 为了方便博主创作,提高生产力,CSDN上线了AI写作助手功能,就在创作编辑器右侧哦~(https://mp.csdn.net/edit?utm_source=blog_comment_recall )诚邀您来加入测评,到此(https://activity.csdn.net/creatActivity?id=10450&utm_source=blog_comment_recall)发布测评文章即可获得「话题勋章」,同时还有机会拿定制奖牌。 光学成像系统的模型及MATLAB仿真 qq_23730673: 博主,打扰了,有问题想请教一下。我不是光学专业的,我自己编程实现的光学系统的衍射限MTF、相差MTF还有离焦MTF,找图片测试的时候(lena图片)感觉效果并不明显啊,不知道确实是因为选择的光学系统参数就是这样的结果还是哪里有问题。不知道你是否方便,能不能跟你交流一下? 光(复振幅)在自由空间中传播的matlab仿真——傅里叶光学方法 山颠海涯: 我在定义频谱坐标的时候是按照fft2的零频位置的,左上角为0频,所以在相乘时就不需要做fftshift变换了。