python调用海康工业相机实现拍一张图片,支持调整曝光、增益、帧率

使用的时候,只需要修改导入的MvImport库的位置就好了,这个库是下载windows 的mvs客户端带着的,
调整曝光、增益、帧率去125行自己修改

# -- coding: utf-8 --

import sys
import copy
import msvcrt

from ctypes import *
import time
import datetime



# sys.path.append("../MvImport")
sys.path.append("F:\\APP\\haikang20230906\\MVS\\Development\\Samples\\Python\\MvImport")

from MvCameraControl_class import *

def save_bmp_img(save_bmg_path):
    # 获取当前日期和时间
    current_datetime = datetime.datetime.now()

    # 格式化日期和时间为指定格式
    formatted_datetime = current_datetime.strftime("%Y_%m_%d_%H_%M_%S")

    print("当前日期和时间:", formatted_datetime)
    #下边的函数进行拍一张照
    deviceList = MV_CC_DEVICE_INFO_LIST()
    tlayerType = MV_GIGE_DEVICE | MV_USB_DEVICE

    # ch:枚举设备 | en:Enum device
    ret = MvCamera.MV_CC_EnumDevices(tlayerType, deviceList)
    if ret != 0:
        print("enum devices fail! ret[0x%x]" % ret)
        sys.exit()

    if deviceList.nDeviceNum == 0:
        print("find no device!")
        sys.exit()

    print("find %d devices!" % deviceList.nDeviceNum)

    for i in range(0, deviceList.nDeviceNum):
        mvcc_dev_info = cast(deviceList.pDeviceInfo[i], POINTER(MV_CC_DEVICE_INFO)).contents
        if mvcc_dev_info.nTLayerType == MV_GIGE_DEVICE:
            print("\ngige device: [%d]" % i)
            strModeName = ""
            for per in mvcc_dev_info.SpecialInfo.stGigEInfo.chModelName:
                strModeName = strModeName + chr(per)
            print("device model name: %s" % strModeName)

            nip1 = ((mvcc_dev_info.SpecialInfo.stGigEInfo.nCurrentIp & 0xff000000) >> 24)
            nip2 = ((mvcc_dev_info.SpecialInfo.stGigEInfo.nCurrentIp & 0x00ff0000) >> 16)
            nip3 = ((mvcc_dev_info.SpecialInfo.stGigEInfo.nCurrentIp & 0x0000ff00) >> 8)
            nip4 = (mvcc_dev_info.SpecialInfo.stGigEInfo.nCurrentIp & 0x000000ff)
            print("current ip: %d.%d.%d.%d\n" % (nip1, nip2, nip3, nip4))
        elif mvcc_dev_info.nTLayerType == MV_USB_DEVICE:
            print("\nu3v device: [%d]" % i)
            strModeName = ""
            for per in mvcc_dev_info.SpecialInfo.stUsb3VInfo.chModelName:
                if per == 0:
                    break
                strModeName = strModeName + chr(per)
            print("device model name: %s" % strModeName)

            strSerialNumber = ""
            for per in mvcc_dev_info.SpecialInfo.stUsb3VInfo.chSerialNumber:
                if per == 0:
                    break
                strSerialNumber = strSerialNumber + chr(per)
            print("user serial number: %s" % strSerialNumber)

    nConnectionNum = 0
    # 默认使用0这个相机
    # nConnectionNum = input("please input the number of the device to connect:")

    if int(nConnectionNum) >= deviceList.nDeviceNum:
        print("intput error!")
        sys.exit()

    # ch:创建相机实例 | en:Creat Camera Object
    cam = MvCamera()

    # ch:选择设备并创建句柄 | en:Select device and create handle
    stDeviceList = cast(deviceList.pDeviceInfo[int(nConnectionNum)], POINTER(MV_CC_DEVICE_INFO)).contents

    ret = cam.MV_CC_CreateHandle(stDeviceList)
    if ret != 0:
        print("create handle fail! ret[0x%x]" % ret)
        sys.exit()

    # ch:打开设备 | en:Open device
    ret = cam.MV_CC_OpenDevice(MV_ACCESS_Exclusive, 0)
    if ret != 0:
        print("open device fail! ret[0x%x]" % ret)
        sys.exit()

    # ch:探测网络最f佳包大小(只对GigE相机有效) | en:Detection network optimal package size(It only works for the GigE camera)
    if stDeviceList.nTLayerType == MV_GIGE_DEVICE:
        nPacketSize = cam.MV_CC_GetOptimalPacketSize()
        if int(nPacketSize) > 0:
            ret = cam.MV_CC_SetIntValue("GevSCPSPacketSize", nPacketSize)
            if ret != 0:
                print("Warning: Set Packet Size fail! ret[0x%x]" % ret)
        else:
            print("Warning: Get Packet Size fail! ret[0x%x]" % nPacketSize)

    # ch:设置触发模式为off | en:Set trigger mode as off
    ret = cam.MV_CC_SetEnumValue("TriggerMode", MV_TRIGGER_MODE_OFF)
    if ret != 0:
        print("set trigger mode fail! ret[0x%x]" % ret)
        sys.exit()

    # ch:获取数据包大小 | en:Get payload size
    stParam = MVCC_INTVALUE()
    memset(byref(stParam), 0, sizeof(MVCC_INTVALUE))

    ret = cam.MV_CC_GetIntValue("PayloadSize", stParam)
    if ret != 0:
        print("get payload size fail! ret[0x%x]" % ret)
        sys.exit()
    nPayloadSize = stParam.nCurValue

    # ch:开始取流 | en:Start grab image
    start_time = time.time()
    #设置曝光时间 单位毫秒 我一般用20000左右
    cam.MV_CC_SetFloatValue("ExposureTime", float(20000))
    #设置图像增益,我一般用5左右
    cam.MV_CC_SetFloatValue("Gain", float(5))
    #设置帧率,我一般就用默认,这款相机好像是74帧率
    cam.MV_CC_SetFloatValue("AcquisitionFrameRate", float(74))
    ret = cam.MV_CC_StartGrabbing()
    if ret != 0:
        print("start grabbing fail! ret[0x%x]" % ret)
        sys.exit()
    stDeviceList = MV_FRAME_OUT_INFO_EX()
    memset(byref(stDeviceList), 0, sizeof(stDeviceList))
    data_buf = (c_ubyte * nPayloadSize)()
    ret = cam.MV_CC_GetOneFrameTimeout(byref(data_buf), nPayloadSize, stDeviceList, 1000)
    if ret == 0:
        # Stop = time()
        # print(Stop - start)
        print("get one frame: Width[%d], Height[%d], nFrameNum[%d]" % (
            stDeviceList.nWidth, stDeviceList.nHeight, stDeviceList.nFrameNum))

        stConvertParam = MV_SAVE_IMAGE_PARAM_EX()
        stConvertParam.nWidth = stDeviceList.nWidth
        stConvertParam.nHeight = stDeviceList.nHeight
        stConvertParam.pData = data_buf
        stConvertParam.nDataLen = stDeviceList.nFrameLen
        stConvertParam.enPixelType = stDeviceList.enPixelType


        # MV_Image_Undefined  = 0, //未定义
        #   MV_Image_Bmp        = 1, //BMP图片
        #   MV_Image_Jpeg       = 2, //JPEG图片
        #   MV_Image_Png        = 3, //PNG图片,暂不支持
        #   MV_Image_Tif        = 4, //TIF图片,暂不支持

        # jpg参数
        # stConvertParam.nJpgQuality   = 99  # 压缩质量选择范围[50-99]
        # file_path = "save.jpg"
        # stConvertParam.enImageType = MV_Image_Jpeg
        # bmpsize = nPayloadSize

        file_path = save_bmg_path+formatted_datetime+".bmp"
        stConvertParam.enImageType = MV_Image_Bmp

        bmpsize = stDeviceList.nWidth * stDeviceList.nHeight * 3 + 54

        stConvertParam.nBufferSize = bmpsize
        bmp_buf = (c_ubyte * bmpsize)()
        stConvertParam.pImageBuffer = bmp_buf

        ret = cam.MV_CC_SaveImageEx2(stConvertParam)
        if ret != 0:
            print("save file executed failed0:! ret[0x%x]" % ret)
            del data_buf
            sys.exit()
        end_time = time.time()
        print(start_time - end_time)
        # print(stop - start)
        file_open = open(file_path.encode('ascii'), 'wb+')
        try:
            img_buff = (c_ubyte * stConvertParam.nImageLen)()
            cdll.msvcrt.memcpy(byref(img_buff), stConvertParam.pImageBuffer, stConvertParam.nImageLen)
            file_open.write(img_buff, )
            print(img_buff)
        except:
            raise Exception("save file executed failed1::%s" % e.message)
        finally:
            file_open.close()


    else:
        print("get one frame fail, ret[0x%x]" % ret)

    # ch:停止取流 | en:Stop grab image
    ret = cam.MV_CC_StopGrabbing()
    if ret != 0:
        print("stop grabbing fail! ret[0x%x]" % ret)
        del data_buf
        sys.exit()

    # ch:关闭设备 | Close device
    ret = cam.MV_CC_CloseDevice()
    if ret != 0:
        print("close deivce fail! ret[0x%x]" % ret)
        del data_buf
        sys.exit()

    # ch:销毁句柄 | Destroy handle
    ret = cam.MV_CC_DestroyHandle()
    if ret != 0:
        print("destroy handle fail! ret[0x%x]" % ret)
        del data_buf
        sys.exit()

    del data_buf
    return file_path
if __name__ == "__main__":
    save_bmp_path = './hik_cam_img/'
    ret_save_path =     save_bmp_img(save_bmp_path)
    print("ret_save_path",ret_save_path)

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值