Files
AutoControlSystem-G/Vision/tool/CameraPe.py

195 lines
7.2 KiB
Python
Raw Normal View History

2025-07-29 13:16:30 +08:00
#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
# @Time : 2024/9/19 16:08
# @Author : hjw
# @File : CameraPe.py
'''
from Vision.tool.percipio.win import pcammls
from Vision.tool.percipio.win.pcammls import *
from Expection import VisionError_Code
import cv2
class PythonPercipioDeviceEvent(pcammls.DeviceEvent):
Offline = False
def __init__(self):
pcammls.DeviceEvent.__init__(self)
def run(self, handle, eventID):
if eventID==TY_EVENT_DEVICE_OFFLINE:
print('=== Event Callback: Device Offline!')
self.Offline = True
return 0
def IsOffline(self):
return self.Offline
class camera_pe():
def __init__(self):
super().__init__()
self.caminit_isok = False
self.cl = PercipioSDK()
dev_list = self.cl.ListDevice()
for idx in range(len(dev_list)):
dev = dev_list[idx]
print('{} -- {} \t {}'.format(idx, dev.id, dev.iface.id))
if len(dev_list) == 0:
print('no device')
return
if len(dev_list) == 1:
selected_idx = 0
else:
selected_idx = int(input('select a device:'))
if selected_idx < 0 or selected_idx >= len(dev_list):
return
sn = dev_list[selected_idx].id
# 设备ID
self.handle = self.cl.Open(sn)
if not self.cl.isValidHandle(self.handle):
err = self.cl.TYGetLastErrorCodedescription()
print('no device found : ', end='')
print(err)
return
self.event = PythonPercipioDeviceEvent()
self.cl.DeviceRegiststerCallBackEvent(self.event)
color_fmt_list = self.cl.DeviceStreamFormatDump(self.handle, PERCIPIO_STREAM_COLOR)
if len(color_fmt_list) == 0:
print('device has no color stream.')
return
# print('color image format list:')
# for idx in range(len(color_fmt_list)): # 查看图像分辨率
# fmt = color_fmt_list[idx]
# print('\t{} -size[{}x{}]\t-\t desc:{}'.format(idx, cl.Width(fmt), cl.Height(fmt), fmt.getDesc()))
self.cl.DeviceStreamFormatConfig(self.handle, PERCIPIO_STREAM_COLOR, color_fmt_list[2])
depth_fmt_list = self.cl.DeviceStreamFormatDump(self.handle, PERCIPIO_STREAM_DEPTH)
if len(depth_fmt_list) == 0:
print('device has no depth stream.')
return
# print('depth image format list:') # 查看深度图分辨率
# for idx in range(len(depth_fmt_list)):
# fmt = depth_fmt_list[idx]
# print('\t{} -size[{}x{}]\t-\t desc:{}'.format(idx, cl.Width(fmt), cl.Height(fmt), fmt.getDesc()))
self.cl.DeviceStreamFormatConfig(self.handle, PERCIPIO_STREAM_DEPTH, depth_fmt_list[2])
err = self.cl.DeviceLoadDefaultParameters(self.handle)
if err:
print('Load default parameters fail: ', end='')
print(self.cl.TYGetLastErrorCodedescription())
else:
print('Load default parameters successful')
self.scale_unit = self.cl.DeviceReadCalibDepthScaleUnit(self.handle)
#print('depth image scale unit :{}'.format(scale_unit))
self.depth_calib = self.cl.DeviceReadCalibData(self.handle, PERCIPIO_STREAM_DEPTH)
self.color_calib = self.cl.DeviceReadCalibData(self.handle, PERCIPIO_STREAM_COLOR)
self.pointcloud_data_arr = pointcloud_data_list()
self.img_registration_depth = image_data()
self.img_registration_render = image_data()
self.img_parsed_color = image_data()
self.img_undistortion_color = image_data()
err = self.cl.DeviceStreamEnable(self.handle, PERCIPIO_STREAM_COLOR | PERCIPIO_STREAM_DEPTH)
if err:
print('device stream enable err:{}'.format(err))
return
self.cl.DeviceStreamOn(self.handle)
self.caminit_isok = True
print(VisionError_Code.CAMERA_SUCCESS)
def get_img(self):
""
'''
:param api: None
:return: ret ,img
'''
if self.caminit_isok == False or self.event.IsOffline():
return 0, None
else:
image_list = self.cl.DeviceStreamRead(self.handle, 2000)
if len(image_list) == 2:
for i in range(len(image_list)):
frame = image_list[i]
if frame.streamID == PERCIPIO_STREAM_COLOR:
img_color = frame
self.cl.DeviceStreamImageDecode(frame, self.img_undistortion_color)
img = self.img_undistortion_color.as_nparray()
return 1, img
return 0, None
def get_point_map(self):
""
'''
:param api: None
:return: img
'''
if self.caminit_isok == False or self.event.IsOffline():
return 0, None
else:
pass
def get_img_and_point_map(self):
""
'''
:param api: None
:return: ret , img, point_map
'''
if self.caminit_isok == False or self.event.IsOffline():
return 0, None, None
else:
image_list = self.cl.DeviceStreamRead(self.handle, 2000)
if len(image_list) == 2:
for i in range(len(image_list)):
frame = image_list[i]
if frame.streamID == PERCIPIO_STREAM_DEPTH:
img_depth = frame
if frame.streamID == PERCIPIO_STREAM_COLOR:
img_color = frame
self.cl.DeviceStreamMapDepthImageToColorCoordinate(self.depth_calib, img_depth.width, img_depth.height,
self.scale_unit, img_depth, self.color_calib, img_color.width,
img_color.height, self.img_registration_depth)
# self.cl.DeviceStreamDepthRender(self.img_registration_depth, self.img_registration_render)
# mat_depth_render = self.img_registration_render.as_nparray()
# cv2.imshow('registration', mat_depth_render)
self.cl.DeviceStreamMapDepthImageToPoint3D(self.img_registration_depth, self.depth_calib, self.scale_unit,
self.pointcloud_data_arr)
# show p3d arr data
p3d_nparray = self.pointcloud_data_arr.as_nparray()
#cv2.imshow('p3d2', p3d_nparray)
self.cl.DeviceStreamImageDecode(img_color, self.img_parsed_color)
self.cl.DeviceStreamDoUndistortion(self.color_calib, self.img_parsed_color, self.img_undistortion_color)
mat_undistortion_color = self.img_undistortion_color.as_nparray()
return 1, mat_undistortion_color, p3d_nparray
else:
return 0, None, None
def release(self):
if self.caminit_isok == False:
pass
else:
self.cl.DeviceStreamOff(self.handle)
self.cl.Close(self.handle)
pass
# my_camera = camera()
# while True:
# ret, img, p3d_nparray = my_camera.get_img_and_point_map()
# cv2.imshow('img', img)
# cv2.imshow('3d',p3d_nparray)
# cv2.waitKey(1)