Merge remote-tracking branch 'origin/master'

This commit is contained in:
edo-neo 2025-02-06 16:17:57 +01:00
commit 041393ff61

View File

@ -19,6 +19,9 @@ class HikrobotSmartCamera(Component):
self.simulate = "--sim-camera" in sys.argv self.simulate = "--sim-camera" in sys.argv
self.num_cameras=1 self.num_cameras=1
self.connected = False self.connected = False
self.ok_memory = True
self.ok_frames = []
self.ok_results =[]
def config_changed(self): def config_changed(self):
self.connected = False self.connected = False
@ -99,39 +102,53 @@ class HikrobotSmartCamera(Component):
for cam_idx in range(self.num_cameras): for cam_idx in range(self.num_cameras):
cam = self.cam_list[cam_idx] cam = self.cam_list[cam_idx]
self.log.info(f"GET FRAME CAMERA # {cam_idx}") self.log.info(f"GET FRAME CAMERA # {cam_idx}")
if self.ok_results[cam_idx]:
# Trigger acquisition & test execution # keep last good result
nRet = mv_lib.MV_VS_SetCommandValue(cam["handle"], b"AcquisitionStart") frame = self.ok_frames[cam_idx]
if nRet != MV_VS_OK: res = False
self.log.error(f"CAM{cam_idx} AcquisitionStart failed! [{nRet&0xFFFFFFFF:#x}]")
self.connected = False
# get frame
frame_res = MV_VS_GetFrame(cam["handle"])
if frame_res is not None:
res = frame_res["res"]["ScDeviceSolutionRunningResult"]
frame = frame_res["frame"]
# rotate frame
if rot[cam_idx] == "1":
frame = cv2.rotate(frame, cv2.ROTATE_90_CLOCKWISE)
if rot[cam_idx] == "2":
frame = cv2.rotate(frame, cv2.ROTATE_90_COUNTERCLOCKWISE)
if rot[cam_idx] == "3":
frame = cv2.rotate(frame, cv2.ROTATE_180)
if concat_frame is None:
concat_frame = copy.deepcopy(frame)
else:
concat_frame = cv2.hconcat([concat_frame, frame])
concat_results.append(not res)
else: else:
self.connected = False # Trigger acquisition & test execution
super()._get([concat_frame, concat_results]) nRet = mv_lib.MV_VS_SetCommandValue(cam["handle"], b"AcquisitionStart")
if nRet != MV_VS_OK:
self.log.error(f"CAM{cam_idx} AcquisitionStart failed! [{nRet&0xFFFFFFFF:#x}]")
self.connected = False
frame_res = None
else:
# get frame
frame_res = MV_VS_GetFrame(cam["handle"])
if frame_res is not None:
res = frame_res["res"]["ScDeviceSolutionRunningResult"]
frame = frame_res["frame"]
# rotate frame
if rot[cam_idx] == "1":
frame = cv2.rotate(frame, cv2.ROTATE_90_CLOCKWISE)
if rot[cam_idx] == "2":
frame = cv2.rotate(frame, cv2.ROTATE_90_COUNTERCLOCKWISE)
if rot[cam_idx] == "3":
frame = cv2.rotate(frame, cv2.ROTATE_180)
else:
self.connected = False
if concat_frame is None:
concat_frame = copy.deepcopy(frame)
else:
concat_frame = cv2.hconcat([concat_frame, frame])
concat_results.append(not res)
if not res:
self.ok_results[cam_idx] = True
self.ok_frames[cam_idx] = copy.deepcopy(frame)
super()._get([concat_frame, self.ok_results])
def resume(self): def resume(self):
self.log.info(f"RESUMING") self.log.info(f"RESUMING")
if not self.connected: if not self.connected:
self.config_changed() self.config_changed()
if self.connected: if self.connected:
# init OK result memory
self.ok_frames = [None for n in range(self.num_cameras)]
self.ok_results = [False for n in range(self.num_cameras)]
if len(self.cam_list) == self.num_cameras: if len(self.cam_list) == self.num_cameras:
# Dummy acquisition for each camera to avoid reading past images # Dummy acquisition for each camera to avoid reading past images
for cam_idx in range(self.num_cameras): for cam_idx in range(self.num_cameras):