37from dataclasses
import dataclass
38from pathlib
import Path
39from typing
import List, Optional, Tuple
45from visp.core
import CameraParameters, HomogeneousMatrix
46from visp.core
import Color, Display, ImageConvert
47from visp.core
import ImageGray, ImageUInt16, ImageRGBa
48from visp.io
import ImageIo
49from visp.mbt
import MbGenericTracker
51import pyrealsense2
as rs
56 print(
'Could not import opencv-python! make sure that it is installed as it is required')
60import matplotlib.pyplot
as plt
64 def __init__(self, data_root: Path, object_name: str):
65 model_path = data_root /
'model' / object_name
66 assert model_path.exists()
69 self.
cad_file = model_path / f
'{object_name}.cao'
75 data_path = data_root /
'data'
76 assert data_path.exists()
83 I_depth: Optional[ImageUInt16]
84 point_cloud: Optional[np.ndarray]
89def read_data(cam_depth: CameraParameters |
None, I: ImageGray, pipe: rs.pipeline):
90 use_depth = cam_depth
is not None
92 point_cloud_computer = rs.pointcloud()
94 frames = pipe.wait_for_frames()
95 I_np = np.asanyarray(frames.get_color_frame().as_frame().get_data())
96 I_np = np.concatenate((I_np, np.ones_like(I_np[..., 0:1], dtype=np.uint8)), axis=-1)
97 I_rgba = ImageRGBa(I_np)
98 ImageConvert.convert(I_rgba, I, 0)
102 I_depth_raw = np.asanyarray(frames.get_depth_frame().as_frame().get_data())
103 point_cloud = np.asanyarray(point_cloud_computer.calculate(frames.get_depth_frame()).get_vertices()).view((np.float32, 3))
105 yield FrameData(I, ImageUInt16(I_depth_raw), point_cloud)
110 intr = profile.as_video_stream_profile().get_intrinsics()
111 return CameraParameters(intr.fx, intr.fy, intr.ppx, intr.ppy), intr.height, intr.width
113if __name__ ==
'__main__':
114 parser = argparse.ArgumentParser()
115 parser.add_argument(
'--data-root', type=str, required=
True,
116 help=
'Path to the folder containing all the data for the MBT example.')
117 parser.add_argument(
'--object-name', type=str, required=
True,
118 help=
'Name of the object to track.')
119 parser.add_argument(
'--disable-klt', action=
'store_true', help=
'Disable KLT features for tracking.')
120 parser.add_argument(
'--disable-depth', action=
'store_true', help=
'Do not use depth to perform tracking.')
121 parser.add_argument(
'--step-by-step', action=
'store_true', help=
'Perform tracking frame by frame. Go to the next frame by clicking.')
124 args = parser.parse_args()
125 data_root = Path(args.data_root)
131 config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 60)
132 config.enable_stream(rs.stream.color, 640, 480, rs.format.rgb8, 60)
134 cfg = pipe.start(config)
136 assert data_root.exists()
and data_root.is_dir()
145 rgb_tracker: int = MbGenericTracker.EDGE_TRACKER | (MbGenericTracker.KLT_TRACKER
if not args.disable_klt
else 0)
146 tracker_types: List[int] = [rgb_tracker]
147 if not args.disable_depth:
148 depth_tracker = MbGenericTracker.DEPTH_DENSE_TRACKER
149 tracker_types.append(depth_tracker)
151 tracker = MbGenericTracker(tracker_types)
153 if args.disable_depth:
154 tracker.loadConfigFile(
str(mbt_model.config_color))
156 tracker.loadConfigFile(
str(mbt_model.config_color),
str(mbt_model.config_depth))
157 tracker.loadModel(
str(mbt_model.cad_file))
161 tracker.setCameraParameters(*((cam_color,)
if args.disable_depth
else (cam_color, cam_depth)))
162 tracker.setDisplayFeatures(
True)
164 print(
'Color intrinsics:', cam_color)
165 print(
'Depth intrinsics:', cam_depth)
168 frame_data = next(data_generator)
170 depth_M_color = HomogeneousMatrix()
171 if not args.disable_depth:
172 depth_M_color.load(exp_config.extrinsic_file)
173 tracker.setCameraTransformationMatrix(
'Camera2', depth_M_color)
177 dI.init(I, 0, 0,
'Color image')
179 I_depth =
None if args.disable_depth
else ImageGray()
180 dDepth = get_display()
181 if not args.disable_depth:
182 ImageConvert.createDepthHistogram(frame_data.I_depth, I_depth)
183 dDepth.init(I_depth, I.getWidth(), 0,
'Depth')
185 for frame
in data_generator:
187 Display.displayText(I, 0, 0,
'Click to initialize tracking', Color.red)
189 event = Display.getClick(I, blocking=
False)
193 tracker.initClick(I,
str(mbt_model.init_file))
194 start_time = time.time()
195 for frame_data
in data_generator:
196 if I_depth
is not None:
197 ImageConvert.createDepthHistogram(frame_data.I_depth, I_depth)
200 if not args.disable_depth:
201 Display.display(I_depth)
203 if args.disable_depth:
206 pc = frame_data.point_cloud
211 tracker.track(image_dict, {
'Camera2': pc.reshape(depth_height, depth_width, 3)})
212 cMo = HomogeneousMatrix()
215 Display.displayFrame(I, cMo, cam_color, 0.05, Color.none, 2)
216 tracker.display(I, cMo, cam_color, Color.red, 2)
218 if not args.disable_depth:
219 Display.flush(I_depth)
221 if args.step_by_step:
222 Display.getKeyboardEvent(I, blocking=
True)
224 event = Display.getClick(I, blocking=
False)
227 end_time = time.time()
228 print(f
'total time = {end_time - start_time}s')
__init__(self, Path data_root)
__init__(self, Path data_root, str object_name)
Tuple[CameraParameters, int, int] cam_from_rs_profile(profile)
read_data(CameraParameters|None cam_depth, ImageGray I, rs.pipeline pipe)