如何快速连接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)的主要内容,如果未能解决你的问题,请参考以下文章

如何用matlab来实现绘制工业摄像机站位的

在 openCV 中快速将图像保存到磁盘

跪求用USB摄像头获取并保存图像的c或c++代码

halcon相机采集的时候,图像为啥是反着的

如何opencv读取摄像头并保存每一帧图像?

如何opencv读取摄像头并保存每一帧图像