# -*- 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()
海康机器人线阵相机(GetImageBuffer)采图并保存
最新推荐文章于 2024-01-23 10:23:28 发布