海康机器人线阵相机(GetImageBuffer)采图并保存

# -*- coding: utf-8 -*-
# @Time    : 2023/6/7  18:06
# @Author  : lyy
# @FileName: GetImageBuffer.py
# @Software: PyCharm
"""
    Description:缓存采集照片并保存
        
"""
import os
import sys
import numpy as np
import cv2 as cv
import time
import threading
from ctypes import *

sys.path.append("./MvImport")
from MvImport.MvCameraControl_class import *

class hkcamera():
    def __init__(self):
        self.save_path = []
        self.Image = cv.imread('./buchang.jpg')
        self.Image_date = np.array(self.Image)
        self.buchang = self.Image_date[0: 900, 240: 2040]
    def open_device(self):
        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)
            return False
        if deviceList.nDeviceNum == 0:
            print("find no device!")
            return False
        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'
        if int(nConnectionNum) >= deviceList.nDeviceNum:
            print("intput error!")
            return False
        # ch:创建相机实例 | en:Creat Camera Object
        self.cam = MvCamera()
        # ch:选择设备并创建句柄 | en:Select device and create handle
        stDeviceList = cast(deviceList.pDeviceInfo[int(nConnectionNum)], POINTER(MV_CC_DEVICE_INFO)).contents
        ret = self.cam.MV_CC_CreateHandle(stDeviceList)
        if ret != 0:
            print("create handle fail! ret[0x%x]" % ret)
            return False
        # ch:打开设备 | en:Open device
        ret = self.cam.MV_CC_OpenDevice(MV_ACCESS_Exclusive, 0)
        if ret != 0:
            print("open device fail! ret[0x%x]" % ret)
            return False
        #########################传输配置文件####################################
        self.cam.MV_CC_SetEnumValue(strKey="PixelFormat", nValue=0x02180014)
        self.cam.MV_CC_SetIntValue(strKey="Height", nValue=900)
        self.cam.MV_CC_SetIntValue(strKey="width", nValue=3600)
        self.cam.MV_CC_SetIntValue(strKey="OffsetX", nValue=240)
        self.cam.MV_CC_SetIntValue(strKey="AcquisitionLineRate", nValue=10850)
        self.cam.MV_CC_SetFloatValue(strKey="ExposureTime", fValue=70.00)
        # self.cam.MV_CC_SetEnumValue(strKey="PixelFormat", nValue= 0x02100032)
        # ch:探测网络最佳包大小(只对GigE相机有效) | en:Detection network optimal package size(It only works for the GigE camera)
        if stDeviceList.nTLayerType == MV_GIGE_DEVICE:
            nPacketSize = self.cam.MV_CC_GetOptimalPacketSize()
            if int(nPacketSize) > 0:
                ret = self.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)

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

        self.dakaisymbol = 1
    # 保存图像
    def image_save(self, save_path):
        self.path = save_path

        img_name = str(time.localtime(time.time())) + str(self.stOutFrame.stFrameInfo.nFrameNum)
        cv.imwrite(self.path + img_name + ".jpg", self.img_out)
        # k = cv.waitKey(1) & 0xff


    # 开始采集
    def image_grab(self):
        # ch:开始取流 | en:Start grab image
        ret = self.cam.MV_CC_StartGrabbing()
        if ret != 0:
            print("start grabbing fail! ret[0x%x]" % ret)
            return False

        while self.dakaisymbol == 1:
            print(0)
            self.access_get_image()

    # 主动图像采集
    def access_get_image(self):
        """
        :param cam:     相机实例
        :active_way:主动取流方式的不同方法 分别是(getImagebuffer)(getoneframetimeout)
        :return:
        """
        # 主动图像采集
        self.stOutFrame = MV_FRAME_OUT()
        memset(byref(self.stOutFrame), 0, sizeof(self.stOutFrame))
        ret = self.cam.MV_CC_GetImageBuffer(self.stOutFrame, 1000)
        print("get one frame:RGB8 Width[%d], Height[%d], nFrameNum[%d]" % (
            self.stOutFrame.stFrameInfo.nWidth, self.stOutFrame.stFrameInfo.nHeight,
            self.stOutFrame.stFrameInfo.nFrameNum))
        if None != self.stOutFrame.pBufAddr and 0 == ret and self.stOutFrame.stFrameInfo.enPixelType == 35127316:
            pData = (c_ubyte * self.stOutFrame.stFrameInfo.nWidth * self.stOutFrame.stFrameInfo.nHeight * 3)()
            cdll.msvcrt.memcpy(byref(pData), self.stOutFrame.pBufAddr,
                               self.stOutFrame.stFrameInfo.nWidth * self.stOutFrame.stFrameInfo.nHeight * 3)
            self.data = np.frombuffer(pData,
                                      count=int(
                                          self.stOutFrame.stFrameInfo.nWidth * self.stOutFrame.stFrameInfo.nHeight * 3),
                                      dtype=np.uint8)
            nRet = self.cam.MV_CC_FreeImageBuffer(self.stOutFrame)
        else:
            print("no data[0x%x]" % ret)
        while ret != 0:
            ret = self.cam.MV_CC_GetImageBuffer(self.stOutFrame, 1000)
            print("get one frame:RGB8 Width[%d], Height[%d], nFrameNum[%d]" % (
                self.stOutFrame.stFrameInfo.nWidth, self.stOutFrame.stFrameInfo.nHeight,
                self.stOutFrame.stFrameInfo.nFrameNum))
            if None != self.stOutFrame.pBufAddr and 0 == ret and self.stOutFrame.stFrameInfo.enPixelType == 35127316:
                pData = (c_ubyte * self.stOutFrame.stFrameInfo.nWidth * self.stOutFrame.stFrameInfo.nHeight * 3)()
                cdll.msvcrt.memcpy(byref(pData), self.stOutFrame.pBufAddr,
                                   self.stOutFrame.stFrameInfo.nWidth * self.stOutFrame.stFrameInfo.nHeight * 3)
                self.data = np.frombuffer(pData,
                                          count=int(
                                              self.stOutFrame.stFrameInfo.nWidth * self.stOutFrame.stFrameInfo.nHeight * 3),
                                          dtype=np.uint8)
                nRet = self.cam.MV_CC_FreeImageBuffer(self.stOutFrame)
            else:
                print("no data[0x%x]" % ret)
        self.data = self.data.reshape(self.stOutFrame.stFrameInfo.nHeight, self.stOutFrame.stFrameInfo.nWidth, -1)
        self.image = cv.cvtColor(self.data, cv.COLOR_RGB2BGR)
        # 读取原始图像
        img = self.image
        # 获取原始图像尺寸
        height, width = img.shape[:2]
        # 压缩比例
        ratio = 0.5
        # 计算压缩后的图像尺寸
        new_height = int(height)
        new_width = int(width * ratio)
        # 根据新尺寸进行线性压缩
        self.img_in = cv.resize(img, (new_width, new_height), interpolation=cv.INTER_LINEAR)
        self.img_out = np.vstack([self.buchang, self.img_in])
        self.buchang = self.img_in
        self.image_save(save_path="D:\\2023\\GrabImages\\")


    def close_device(self):
        # ch:停止取流 | en:Stop grab image
        self.dakaisymbol = 0
        ret = self.cam.MV_CC_StopGrabbing()
        if ret != 0:
            print("stop grabbing fail! ret[0x%x]" % ret)
            return False
        # ch:关闭设备 | Close device
        ret = self.cam.MV_CC_CloseDevice()
        if ret != 0:
            print("close deivce fail! ret[0x%x]" % ret)

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

            return False

if __name__ == "__main__":
    hk = hkcamera()
    hk.open_device()
    hk.image_grab()
    # hk.image_control()
    # hk.image_show()
    # hk.close_device()

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值