这段代码是一个Python程序,用于从大恒相机采集彩色图像,并将其保存到本地。
咱们直接上python的完整代码:
import cv2
import gxipy as gx
from PIL import Image
import datetime
def main():
Width_set = 2448 # 设置分辨率宽 360
Height_set = 2048 # 设置分辨率高 480
framerate_set = 1.4 # 设置帧率 #r=400r
num = 4000 # 采集帧率次数(为调试用,可把后边的图像采集设置成while循环,进行无限制循环采集)
# 打印
# print("")
# print("###############################################################")
# print(" 连续获取彩色图像并显示获取的图像.")
# print("###############################################################")
# print("")
# print("摄像机初始化......")
# print("")
# 创建设备
device_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
else:
# print("")
# print("**********************************************************")
print("创建设备成功,设备号为:%d" % dev_num)
# 通过设备序列号打开一个设备
cam = device_manager.open_device_by_sn(dev_info_list[0].get("sn"))
# 如果是黑白相机
if cam.PixelColorFilter.is_implemented() is False: # is_implemented判断枚举型属性参数是否已实现
print("该示例不支持黑白相机.")
cam.close_device()
return
else:
print("")
print("**********************************************************")
print("打开彩色摄像机成功,SN号为:%s" % dev_info_list[0].get("sn"))
# 设置宽和高
cam.Width.set(Width_set)
cam.Height.set(Height_set)
# 设置连续采集
# cam.TriggerMode.set(gx.GxSwitchEntry.OFF) # 设置触发模式
cam.AcquisitionFrameRateMode.set(gx.GxSwitchEntry.ON)
# 设置帧率
cam.AcquisitionFrameRate.set(framerate_set)
print("")
# print("**********************************************************")
# print("用户设置的帧率为:%d fps" % framerate_set)
framerate_get = cam.CurrentAcquisitionFrameRate.get() # 获取当前采集的帧率
print("当前采集的帧率为:%d fps" % framerate_get)
# 开始数据采集
# print("")
# print("**********************************************************")
# print("开始数据采集......")
# print("")
cam.stream_on()
# 采集图像
for i in range(num):
raw_image = cam.data_stream[0].get_image() # 打开第0通道数据流
if raw_image is None:
print("获取彩色原始图像失败.")
continue
rgb_image = raw_image.convert("RGB") # 从彩色原始图像获取RGB图像
if rgb_image is None:
continue
# rgb_image.image_improvement(color_correction_param, contrast_lut, gamma_lut) # 实现图像增强
numpy_image = rgb_image.get_numpy_array() # 从RGB图像数据创建numpy数组
if numpy_image is None:
continue
img = Image.fromarray(numpy_image, 'RGB') # 展示获取的图像
# img.show()
mtime = datetime.datetime.now().strftime('%Y-%m-%d_%H_%M_%S')
img.save(r"D:\pytorch\waibujiance\photo13\\" + str(i) + str("-") + mtime + ".jpg") # 保存图片到本地
print("Frame ID: %d Height: %d Width: %d framerate_set:%dfps framerate_get:%dfps"
% (raw_image.get_frame_id(), raw_image.get_height(), raw_image.get_width(), framerate_set,
framerate_get)) # 打印采集的图像的高度、宽度、帧ID、用户设置的帧率、当前采集到的帧率
# 停止采集
# print("")
# print("**********************************************************")
# print("摄像机已经停止采集")
cam.stream_off()
# 关闭设备
# print("")
# print("**********************************************************")
print("系统提示您:设备已经关闭!")
cam.close_device()
if __name__ == "__main__":
main()
下面是代码的详细解读和功能说明:
-
导入必要的库:
cv2
:OpenCV库,用于图像处理。gxipy
:大恒相机的SDK,用于控制相机。PIL
(Python Imaging Library):用于图像处理,这里用于将numpy数组转换为图像。datetime
:用于获取当前时间,以便在保存图片时添加时间戳。
-
定义
main
函数:这是程序的主函数,所有操作都在这个函数中执行。 -
设置相机参数:
Width_set
和Height_set
:分别设置相机的分辨率宽度和高度。framerate_set
:设置相机的帧率。num
:设置采集图像的帧数。
-
创建设备对象:
device_manager = gx.DeviceManager()
:创建一个设备管理对象。dev_num, dev_info_list = device_manager.update_device_list()
:枚举所有可用的设备,并获取设备列表。
-
检查设备数量:
- 如果没有设备,打印信息并退出程序。
-
打开设备:
- 通过设备序列号打开一个设备。
-
检查相机类型:
- 如果相机不支持彩色图像,打印信息并关闭设备。
-
设置相机参数:
cam.Width.set(Width_set)
和cam.Height.set(Height_set)
:设置相机的宽度和高度。cam.AcquisitionFrameRateMode.set(gx.GxSwitchEntry.ON)
:设置为连续采集模式。cam.AcquisitionFrameRate.set(framerate_set)
:设置帧率。
-
获取当前帧率:
framerate_get = cam.CurrentAcquisitionFrameRate.get()
:获取当前采集的帧率,并打印。
-
开始数据采集:
cam.stream_on()
:开启数据流。
-
采集图像:
- 循环
num
次,每次从相机获取一幅图像。 raw_image = cam.data_stream[0].get_image()
:从第0通道获取原始图像。rgb_image = raw_image.convert("RGB")
:将原始图像转换为RGB格式。numpy_image = rgb_image.get_numpy_array()
:将RGB图像转换为numpy数组。img = Image.fromarray(numpy_image, 'RGB')
:将numpy数组转换为PIL图像对象。img.save()
:保存图像到指定路径,并添加时间戳。
- 循环
-
打印采集信息:
- 打印每帧图像的ID、高度、宽度、设置的帧率和当前帧率。
-
停止采集和关闭设备:
cam.stream_off()
:停止数据流。cam.close_device()
:关闭设备。
-
程序入口:
if __name__ == "__main__":
:确保当脚本被直接运行时,才执行main
函数。
这个程序的主要功能是初始化大恒相机,设置分辨率、帧率等参数,然后连续采集指定数量的图像,并将每幅图像保存到本地。程序还打印了采集过程中的一些信息,如帧ID和帧率。