如何快速连接Basler工业摄像头,获取并保存图像和视频(python+opencv+pypylon)
Posted @你若安好
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何快速连接Basler工业摄像头,获取并保存图像和视频(python+opencv+pypylon)相关的知识,希望对你有一定的参考价值。
写在前面:电脑已经安装anaconda(或者miniconda)
如有需要,请联系:qq:2953392202
1.打开anaconda
2.搭建虚拟环境
conda create -n yanshi python=3.7
3.激活虚拟环境
conda activate yanshi
4.新建文件夹用于存python文件
5.进入虚拟环境
cd yanshi
6.下载opencv-python
pip install opencv-python
7.下载pypylon
pip3 install pypylon
8.用记事本新建一个python文件并保存
9.将以下python代码复制到新建的文件中
from pypylon import pylon
import cv2
import datetime
import time
# conecting to the first available camera
camera = pylon.InstantCamera(pylon.TlFactory.GetInstance().CreateFirstDevice())
# Grabing Continusely (video) with minimal delay
camera.StartGrabbing(pylon.GrabStrategy_LatestImageOnly)
converter = pylon.ImageFormatConverter()
# converting to opencv bgr format
converter.OutputPixelFormat = pylon.PixelType_BGR8packed
converter.OutputBitAlignment = pylon.OutputBitAlignment_MsbAligned
while camera.IsGrabbing():
grabResult = camera.RetrieveResult(1000, pylon.TimeoutHandling_ThrowException)
if grabResult.GrabSucceeded():
# Access the image data
image = converter.Convert(grabResult)
img = image.GetArray()
cv2.namedWindow('title', cv2.WINDOW_NORMAL)
cv2.imshow('title', img)
k = cv2.waitKey(1)
#按键盘“s"保存图像
if k == ord('s'):
#保存图像路径
cv2.imwrite('D:/learn/photos/a.jpg', img)
#按键盘‘q'退出
elif k == ord('q'):
break
grabResult.Release()
# Releasing the resource
camera.StopGrabbing()
cv2.destroyAllWindows()
以上代码是获取摄像头图像
10.在终端中跑python文件
python huoqu.py
附:
连续获取获取摄像头图像并保存的代码:
#连续输出并保存图像
from pypylon import pylon
import cv2
import datetime
import time
# conecting to the first available camera
camera = pylon.InstantCamera(pylon.TlFactory.GetInstance().CreateFirstDevice())
# Grabing Continusely (video) with minimal delay
camera.StartGrabbing(pylon.GrabStrategy_LatestImageOnly)
converter = pylon.ImageFormatConverter()
# converting to opencv bgr format
converter.OutputPixelFormat = pylon.PixelType_BGR8packed
converter.OutputBitAlignment = pylon.OutputBitAlignment_MsbAligned
i = 0
while camera.IsGrabbing():
grabResult = camera.RetrieveResult(1000, pylon.TimeoutHandling_ThrowException)
if grabResult.GrabSucceeded():
# Access the image data
image = converter.Convert(grabResult)
img = image.GetArray()
cv2.namedWindow('title', cv2.WINDOW_NORMAL)
cv2.imshow('title', img)
#连续输出图像路径,按数字顺序给图像命名
cv2.imwrite('D:/learn/photos/'+str(i)+'.jpg', img)
i=i+1
#每隔0.025秒采集一张图像
time.sleep(0.025)
k = cv2.waitKey(1)
if k == ord('s'):
break
grabResult.Release()
# Releasing the resource
camera.StopGrabbing()
cv2.destroyAllWindows()
将图像组合成视频的代码:
#组合图片为视频
import cv2
import os
#图片路径
im_dir = 'D:/learn/photos'
#输出视频路径
video_dir = 'D:/learn/photos/video/a.avi'
#帧率
fps = 30
#图片数
num = 232
#图片尺寸
img_size = (1920,1200)
#fourcc = cv2.cv.CV_FOURCC('M','J','P','G')#opencv2.4
fourcc = cv2.VideoWriter_fourcc('M','J','P','G') #opencv3.0
videoWriter = cv2.VideoWriter(video_dir, fourcc, fps, img_size)
for i in range(1,num):
im_name = os.path.join(im_dir, str(i)+'.jpg')
frame = cv2.imread(im_name)
videoWriter.write(frame)
videoWriter.release()
print('finish')
直接获取视频代码:
#连续输出并保存图像
from pypylon import pylon
import cv2
import os
import time
# conecting to the first available camera
camera = pylon.InstantCamera(pylon.TlFactory.GetInstance().CreateFirstDevice())
# Grabing Continusely (video) with minimal delay
camera.StartGrabbing(pylon.GrabStrategy_LatestImageOnly)
converter = pylon.ImageFormatConverter()
# converting to opencv bgr format
converter.OutputPixelFormat = pylon.PixelType_BGR8packed
converter.OutputBitAlignment = pylon.OutputBitAlignment_MsbAligned
i = 0
while camera.IsGrabbing():
grabResult = camera.RetrieveResult(1000, pylon.TimeoutHandling_ThrowException)
if grabResult.GrabSucceeded():
# Access the image data
image = converter.Convert(grabResult)
img = image.GetArray()
cv2.namedWindow('title', cv2.WINDOW_NORMAL)
cv2.imshow('title', img)
cv2.imwrite('D:/learn/photos/'+str(i)+'.jpg', img)
i=i+1
time.sleep(0.025)
k = cv2.waitKey(1)
if k == ord('s'):
#图片路径
im_dir = 'D:/learn/photos'
#输出视频路径
video_dir = 'D:/learn/photos/video/a.avi'
#帧率
fps = 40
#图片数
num = i
#图片尺寸
img_size = (1920,1200)
fourcc = cv2.VideoWriter_fourcc('M','J','P','G') #opencv3.0
videoWriter = cv2.VideoWriter(video_dir, fourcc, fps, img_size)
for i in range(1,num):
im_name = os.path.join(im_dir, str(i)+'.jpg')
frame = cv2.imread(im_name)
videoWriter.write(frame)
videoWriter.release()
print('finish')
break
grabResult.Release()
# Releasing the resource
camera.StopGrabbing()
cv2.destroyAllWindows()
在 openCV 中快速将图像保存到磁盘
【中文标题】在 openCV 中快速将图像保存到磁盘【英文标题】:Fast saving of images to disk in openCV 【发布时间】:2017-11-27 14:19:11 【问题描述】:我正在使用 Basler 相机,想尽快将我以 1000x1000 像素抓取的图像写入磁盘。 保持电影容器打开并保存为 .avi 并没有真正帮助(减慢 2 倍),保存单个图像甚至更慢。 我目前正在使用 openCV cvVideoCreator 和 imwrite 函数。 我的电脑应该足够快(Intel Xeon 3.6 GHz、64GB RAM、SSD)。 有什么想法吗?
【问题讨论】:
未压缩和压缩图像的典型尺寸是多少(以及压缩需要多长时间)?你使用什么帧率?您的硬盘的可持续传输率是多少?上面的数字有意义吗? 什么是“cvVideoCreator”?快速搜索没有任何有用的结果。 对数据的表示方式有什么要求吗?彩色还是单色?我认为压缩(如果有的话)应该是无损的? 什么对你来说快?每秒200帧? 30 ? 5?还有,你现在的速度是多少? 1000 x 1000 像素并不是一个巨大的图像,在这样的 pc 配置下,您应该使用 imwrite 实现快速的速度......这又回到了一个问题,什么对你来说是快速的? 如果是彩色相机,最好能捕捉原始 (Bayer) 图像(在去马赛克完成之前)。这些是单通道,因此如果将它们存储在该状态下,则可以将数据量减少到 1/3。 |当然,在单独的线程中运行的捕获和存储是有一定道理的。 【参考方案1】:为了达到您的目标(以 50 FPS 或 150 MB/s 的速度保存彩色图像 (1K x 1K x 3)),您可能需要考虑多个因素(步骤)。
图像编码:大多数众所周知的图像格式,如 png、tif、jpg 都需要时间来编码图像(例如,在具有 3.6 GHz 4 核 CPU 的 OpenCV 中,png 为 5.7 ms,tif 为 11.5 ms)甚至在将编码格式数据保存到磁盘之前,就可以转换为特定格式。
文件打开:与文件大小无关,这可能需要一些时间(例如,在 3.5" WD Black 上需要 1.5 毫秒)
文件写入:取决于文件大小,这可能需要一些时间(例如,3.5" WD Black 需要 2.0 毫秒)
文件关闭:取决于文件大小,这可能需要很长时间(例如,在 3.5" WD Black 上需要 14.0 毫秒)
这意味着您必须在每张图像 20 毫秒内完成所有步骤才能达到您的目标,并且正如我给出的时间示例,您可能无法使用 JPG 格式的 OpenCV imwrite 实现您的目标,因为该库会按顺序完成所有操作上述步骤在一个线程中完成。
我认为你有几个选择
在 SSD 上写入 BMP 格式,因为其编码时间几乎为零(例如,小于 0.3 毫秒)
在单独的线程中执行上述一些步骤(例如,编码或文件关闭)。
特别是,文件关闭是一个很好的候选,可以在单独的线程中运行,因为它可以与其他步骤异步完成。使用第二个选项、BMP 文件格式和更好的硬盘,我能够达到 400 MB/s 的保存带宽。
希望这对您和其他有类似目标的人有所帮助。
【讨论】:
【参考方案2】:您在问题中陈述的规格与您处理和缓冲数据的能力有关,但与您可以转储到磁盘的速度无关。
您正在尝试编写(假设一些数字,只需替换为您自己的数字) 每秒 1000*1000(大小)* 4(数据/像素)* 25(帧速率)字节。 (或 100M/s)
这大约是传统 HDD 的极限,但如果磁盘碎片或满了,它就不太可能跟上。 因此,您必须找到一种方法来加快写入时间(例如切换到 SSD);减少正在写入的数据(压缩、降低颜色深度/质量/帧速率)或在后台线程保存到磁盘时缓冲您想要写入的内容。
您必须问的问题是您计划录制多长时间。如果它的时间不足以填满您的 RAM,那么您拥有所有可用的选项。但是,如果您打算长时间录制,则必须在其他 2 个中选择一个。
【讨论】:
可能每个像素 3 个字节,不像透明度与来自相机的图像相关。 @DanMašek 我想说这会有所不同,但我已经看到硬盘在 10M/s 写入方面遇到了困难……我确实说过这些值是假设的。跨度>以上是关于如何快速连接Basler工业摄像头,获取并保存图像和视频(python+opencv+pypylon)的主要内容,如果未能解决你的问题,请参考以下文章