这段代码是一个Python程序,用于从大恒相机采集彩色图像,并将其保存到本地。

大恒相机开发(1)—Python调用采集彩色图像并另存为本地-LMLPHP

咱们直接上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()
    

下面是代码的详细解读和功能说明:

  1. 导入必要的库

    • cv2:OpenCV库,用于图像处理。
    • gxipy:大恒相机的SDK,用于控制相机。
    • PIL(Python Imaging Library):用于图像处理,这里用于将numpy数组转换为图像。
    • datetime:用于获取当前时间,以便在保存图片时添加时间戳。
  2. 定义main函数:这是程序的主函数,所有操作都在这个函数中执行。

  3. 设置相机参数

    • Width_setHeight_set:分别设置相机的分辨率宽度和高度。
    • framerate_set:设置相机的帧率。
    • num:设置采集图像的帧数。
  4. 创建设备对象

    • device_manager = gx.DeviceManager():创建一个设备管理对象。
    • dev_num, dev_info_list = device_manager.update_device_list():枚举所有可用的设备,并获取设备列表。
  5. 检查设备数量

    • 如果没有设备,打印信息并退出程序。
  6. 打开设备

    • 通过设备序列号打开一个设备。
  7. 检查相机类型

    • 如果相机不支持彩色图像,打印信息并关闭设备。
  8. 设置相机参数

    • cam.Width.set(Width_set)cam.Height.set(Height_set):设置相机的宽度和高度。
    • cam.AcquisitionFrameRateMode.set(gx.GxSwitchEntry.ON):设置为连续采集模式。
    • cam.AcquisitionFrameRate.set(framerate_set):设置帧率。
  9. 获取当前帧率

    • framerate_get = cam.CurrentAcquisitionFrameRate.get():获取当前采集的帧率,并打印。
  10. 开始数据采集

    • cam.stream_on():开启数据流。
  11. 采集图像

    • 循环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():保存图像到指定路径,并添加时间戳。
  12. 打印采集信息

    • 打印每帧图像的ID、高度、宽度、设置的帧率和当前帧率。
  13. 停止采集和关闭设备

    • cam.stream_off():停止数据流。
    • cam.close_device():关闭设备。
  14. 程序入口

    • if __name__ == "__main__"::确保当脚本被直接运行时,才执行main函数。

这个程序的主要功能是初始化大恒相机,设置分辨率、帧率等参数,然后连续采集指定数量的图像,并将每幅图像保存到本地。程序还打印了采集过程中的一些信息,如帧ID和帧率。

12-24 16:52