sys.path.append("../MvImport")
from CameraParams_const import *
from CameraParams_header import *
from MvCameraControl_header import *
from MvCameraControl_class import *
from MvErrorDefine_const import *
from PixelType_const import *
from PixelType_header import *
class AccessToImages():
def FindDevices(self):
device_list = MV_CC_DEVICE_INFO_LIST()
find_device_ret = MvCamera.MV_CC_EnumDevices(MV_USB_DEVICE, device_list)
if find_device_ret == 0:
return device_list
else:
return False
def GetImages(self, show_device_num, device_list):
i = 0
if show_device_num <= device_list.nDeviceNum:
device_info = cast(device_list.pDeviceInfo[int(show_device_num)], POINTER(MV_CC_DEVICE_INFO)).contents
cam = MvCamera()
handle_ret = cam.MV_CC_CreateHandle(device_info)
if handle_ret != 0:
print("创建句柄失败")
# 打开设备
open_device = cam.MV_CC_OpenDevice(MV_ACCESS_Exclusive, 0)
if open_device != 0:
print('开启失败')
# 获取相机int型节点值 "PayloadSize" 为当前节点得名称,一帧节点的大小
camera_int_param = MVCC_INTVALUE()
int_value_ret = cam.MV_CC_GetIntValue("PayloadSize", camera_int_param)
if int_value_ret != 0:
print('获取图像信息失败')
image_data_size = (c_ubyte * camera_int_param.nCurValue)()
image_data_length = camera_int_param.nCurValue
# 开始抓流
grab_ret = cam.MV_CC_StartGrabbing()
if grab_ret != 0:
print('抓起流失败')
# 获取数据大小
# 下面将获得每一帧的图像
while True:
frame_info = MV_FRAME_OUT_INFO_EX()
memset(byref(frame_info), 0, sizeof(frame_info))
frame_ret = cam.MV_CC_GetOneFrameTimeout(image_data_size, image_data_length, frame_info, 1000)
if frame_ret != 0:
print('获取帧信息失败')
nRGBSize = frame_info.nWidth * frame_info.nHeight
convert_param = MV_CC_PIXEL_CONVERT_PARAM()
memset(byref(convert_param), 0, sizeof(convert_param))
convert_param.nWidth = frame_info.nWidth
convert_param.nHeight = frame_info.nHeight
convert_param.pSrcData = image_data_size
convert_param.nSrcDataLen = frame_info.nFrameLen
convert_param.enSrcPixelType = frame_info.enPixelType
convert_param.enDstPixelType = frame_info.enPixelType
convert_param.pDstBuffer = (c_ubyte * nRGBSize)()
convert_param.nDstBufferSize = nRGBSize
ret = cam.MV_CC_ConvertPixelType(convert_param)
img = np.array(image_data_size)
Img = img.reshape(480,640,3)
# img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 这一步获取到的颜色不对,因为默认是BRG,要转化成RGB,颜色才正常
cv2.namedWindow("result", cv2.WINDOW_AUTOSIZE)
cv2.imwrite("result.jpg", Img)
cv2.imshow("result", Img)
print(Img)
print(image_data_size)
print(image_data_length)
if ret != 0:
print("convert pixel fail! ret[0x%x]" % ret)
del image_data_size
sys.exit()
img_buff = (c_ubyte * convert_param.nDstLen)()
cdll.msvcrt.memcpy(byref(img_buff), convert_param.pDstBuffer, convert_param.nDstLen)
img = np.array(img_buff, dtype=np.int8)
Img = img.reshape(1024, 1280)
Img = cv.flip(Img, -1)
Img = cv.flip(Img, -1)
cv.imshow('img' + str(show_device_num), Img)
cv.waitKey(25)
if __name__ == '__main__':
a = AccessToImages()
device_list = a.FindDevices()
if a:
a.GetImages(0, device_list)
# print(device_list.nDeviceNum)