31 from argparse
import ArgumentParser
35 def read_raw_file(fpath, resize_to=None, verbose=False)
38 print(f
'I Reading: {fpath}', end=
' ', flush=
True)
40 np_arr = np.fromfile(f, dtype=np.uint16, count=-1)
43 print(f
'done!\nI Raw array: shape: {np_arr.shape} dtype: {np_arr.dtype}')
44 if resize_to
is not None
45 np_arr = np_arr.reshape(resize_to, order=
'C')
47 print(f
'I Reshaped array: shape: {np_arr.shape} dtype: {np_arr.dtype}')
48 pil_img = Image.fromarray(np_arr, mode=
"I;16L")
51 raise ValueError(f
'E Cannot process raw input: {fpath}')
54 def process_arguments()
55 parser = ArgumentParser()
57 parser.add_argument(
'backend', choices=[
'cuda',
'ofa',
'ofa-pva-vic'],
58 help=
'Backend to be used for processing')
59 parser.add_argument(
'left', help=
'Rectified left input image from a stereo pair')
60 parser.add_argument(
'right', help=
'Rectified right input image from a stereo pair')
61 parser.add_argument(
'--width', default=-1, type=int, help=
'Input width for raw input files')
62 parser.add_argument(
'--height', default=-1, type=int, help=
'Input height for raw input files')
63 parser.add_argument(
'--downscale', default=1, type=int, help=
'Output downscale factor')
64 parser.add_argument(
'--window_size', default=5, type=int, help=
'Median filter window size')
65 parser.add_argument(
'--skip_confidence', default=
False, action=
'store_true', help=
'Do not calculate confidence')
66 parser.add_argument(
'--conf_threshold', default=32767, type=int, help=
'Confidence threshold')
67 parser.add_argument(
'--conf_type', default=
'best', choices=[
'best',
'absolute',
'relative',
'inference'],
68 help=
'Computation type to produce the confidence output. Default will pick best option given backend.')
69 parser.add_argument(
'-p1', default=3, type=int, help=
'Penalty P1 on small disparities')
70 parser.add_argument(
'-p2', default=48, type=int, help=
'Penalty P2 on large disparities')
71 parser.add_argument(
'--p2_alpha', default=0, type=int, help=
'Alpha for adaptive P2 Penalty')
72 parser.add_argument(
'--uniqueness', default=-1, type=float, help=
'Uniqueness ratio')
73 parser.add_argument(
'--skip_diagonal', default=
False, action=
'store_true', help=
'Do not use diagonal paths')
74 parser.add_argument(
'--num_passes', default=3, type=int, help=
'Number of passes')
75 parser.add_argument(
'--min_disparity', default=0, type=int, help=
'Minimum disparity')
76 parser.add_argument(
'--max_disparity', default=256, type=int, help=
'Maximum disparity')
77 parser.add_argument(
'--output_mode', default=0, type=int, help=
'0: color; 1: grayscale; 2: raw binary')
78 parser.add_argument(
'-v',
'--verbose', default=
False, action=
'store_true', help=
'Verbose mode')
80 return parser.parse_args()
84 args = process_arguments()
88 if args.backend ==
'cuda'
89 backend = vpi.Backend.CUDA
90 elif args.backend ==
'ofa'
91 backend = vpi.Backend.OFA
92 elif args.backend ==
'ofa-pva-vic'
93 backend = vpi.Backend.OFA|vpi.Backend.PVA|vpi.Backend.VIC
95 raise ValueError(f
'E Invalid backend: {args.backend}')
98 if args.conf_type ==
'best'
99 conftype = vpi.ConfidenceType.INFERENCE
if args.backend ==
'ofa-pva-vic' else vpi.ConfidenceType.ABSOLUTE
100 elif args.conf_type ==
'absolute'
101 conftype = vpi.ConfidenceType.ABSOLUTE
102 elif args.conf_type ==
'relative'
103 conftype = vpi.ConfidenceType.RELATIVE
104 elif args.conf_type ==
'inference'
105 conftype = vpi.ConfidenceType.INFERENCE
107 raise ValueError(f
'E Invalid confidence type: {args.conf_type}')
109 minDisparity = args.min_disparity
110 maxDisparity = args.max_disparity
111 includeDiagonals =
not args.skip_diagonal
112 numPasses = args.num_passes
113 calcConf =
not args.skip_confidence
114 downscale = args.downscale
115 windowSize = args.window_size
119 print(f
'I Backend: {backend}\nI Left image: {args.left}\nI Right image: {args.right}\n'
120 f
'I Disparities (min, max): {(minDisparity, maxDisparity)}\n'
121 f
'I Input scale factor: {scale}\nI Output downscale factor: {downscale}\n'
122 f
'I Window size: {windowSize}\nI Quality: {quality}\n'
123 f
'I Calculate confidence: {calcConf}\nI Confidence threshold: {args.conf_threshold}\n'
124 f
'I Confidence type: {conftype}\nI Uniqueness ratio: {args.uniqueness}\n'
125 f
'I Penalty P1: {args.p1}\nI Penalty P2: {args.p2}\nI Adaptive P2 alpha: {args.p2_alpha}\n'
126 f
'I Include diagonals: {includeDiagonals}\nI Number of passes: {numPasses}\n'
127 f
'I Output mode: {args.output_mode}\nI Verbose: {args.verbose}\n'
128 , end=
'', flush=
True)
130 if 'raw' in args.left
131 pil_left = read_raw_file(args.left, resize_to=[args.height, args.width], verbose=args.verbose)
132 np_left = np.asarray(pil_left)
135 pil_left = Image.open(args.left)
136 if pil_left.mode ==
'I'
137 np_left = np.asarray(pil_left).astype(np.int16)
139 np_left = np.asarray(pil_left)
141 raise ValueError(f
'E Cannot open left input image: {args.left}')
143 if 'raw' in args.right
144 pil_right = read_raw_file(args.right, resize_to=[args.height, args.width], verbose=args.verbose)
145 np_right = np.asarray(pil_right)
148 pil_right = Image.open(args.right)
149 if pil_right.mode ==
'I'
150 np_right = np.asarray(pil_right).astype(np.int16)
152 np_right = np.asarray(pil_right)
154 raise ValueError(f
'E Cannot open right input image: {args.right}')
157 streamLeft = vpi.Stream()
158 streamRight = vpi.Stream()
161 with vpi.Backend.CUDA
163 left = vpi.asimage(np_left).convert(vpi.Format.Y16_ER, scale=scale)
165 right = vpi.asimage(np_right).convert(vpi.Format.Y16_ER, scale=scale)
170 if args.backend
in {
'ofa-pva-vic',
'ofa'}
172 print(f
'W {args.backend} forces to convert input images to block linear', flush=
True)
175 left = left.convert(vpi.Format.Y16_ER_BL)
177 right = right.convert(vpi.Format.Y16_ER_BL)
180 print(f
'I Input left image: {left.size} {left.format}\n'
181 f
'I Input right image: {right.size} {right.format}', flush=
True)
186 if args.backend
not in {
'cuda',
'ofa-pva-vic'}
190 print(f
'W {args.backend} does not allow to calculate confidence', flush=
True)
193 outWidth = (left.size[0] + downscale - 1) // downscale
194 outHeight = (left.size[1] + downscale - 1) // downscale
197 confidenceU16 = vpi.Image((outWidth, outHeight), vpi.Format.U16)
200 streamStereo = streamLeft
202 if args.backend ==
'ofa-pva-vic' and maxDisparity
not in {128, 256}
203 maxDisparity = 128
if (maxDisparity // 128) < 1
else 256
205 print(f
'W {args.backend} only supports 128 or 256 maxDisparity. Overriding to {maxDisparity}', flush=
True)
208 if 'ofa' not in args.backend
209 print(
'W Ignoring P2 alpha and number of passes since not an OFA backend', flush=
True)
210 if args.backend !=
'cuda'
211 print(
'W Ignoring uniqueness since not a CUDA backend', flush=
True)
212 print(
'I Estimating stereo disparity ... ', end=
'', flush=
True)
215 with streamStereo, backend
216 disparityS16 = vpi.stereodisp(left, right, downscale=downscale, out_confmap=confidenceU16,
217 window=windowSize, maxdisp=maxDisparity, confthreshold=args.conf_threshold,
218 quality=quality, conftype=conftype, mindisp=minDisparity,
219 p1=args.p1, p2=args.p2, p2alpha=args.p2_alpha, uniqueness=args.uniqueness,
220 includediagonals=includeDiagonals, numpasses=numPasses)
223 print(
'done!\nI Post-processing ... ', end=
'', flush=
True)
226 with streamStereo, vpi.Backend.CUDA
229 if disparityS16.format == vpi.Format.S16_BL
230 disparityS16 = disparityS16.convert(vpi.Format.S16, backend=vpi.Backend.VIC)
238 disparityU8 = disparityS16.convert(vpi.Format.U8, scale=255.0/(32*maxDisparity)).cpu()
242 disparityColor = cv2.applyColorMap(disparityU8, cv2.COLORMAP_JET)
245 disparityColor = cv2.cvtColor(disparityColor, cv2.COLOR_BGR2RGB)
248 confidenceU8 = confidenceU16.convert(vpi.Format.U8, scale=255.0/65535).cpu()
251 mask = cv2.threshold(confidenceU8, 1, 255, cv2.THRESH_BINARY)[1]
252 mask = cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR)
253 disparityColor = cv2.bitwise_and(disparityColor, mask)
255 fext =
'.raw' if args.output_mode == 2
else '.png'
257 disparity_fname = f
'disparity_python{sys.version_info[0]}_{args.backend}' + fext
258 confidence_fname = f
'confidence_python{sys.version_info[0]}_{args.backend}' + fext
261 print(f
'done!\nI Disparity output: {disparity_fname}', flush=
True)
263 print(f
'I Confidence output: {confidence_fname}', flush=
True)
267 if args.output_mode == 0
268 Image.fromarray(disparityColor).save(disparity_fname)
270 print(f
'I Output disparity image: {disparityColor.shape} '
271 f
'{disparityColor.dtype}', flush=
True)
272 elif args.output_mode == 1
273 Image.fromarray(disparityU8).save(disparity_fname)
275 print(f
'I Output disparity image: {disparityU8.shape} '
276 f
'{disparityU8.dtype}', flush=
True)
277 elif args.output_mode == 2
278 disparityS16.cpu().tofile(disparity_fname)
280 print(f
'I Output disparity image: {disparityS16.size} '
281 f
'{disparityS16.format}', flush=
True)
284 if args.output_mode == 0
or args.output_mode == 1
285 Image.fromarray(confidenceU8).save(confidence_fname)
287 print(f
'I Output confidence image: {confidenceU8.shape} '
288 f
'{confidenceU8.dtype}', flush=
True)
290 confidenceU16.cpu().tofile(confidence_fname)
292 print(f
'I Output confidence image: {confidenceU16.size} '
293 f
'{confidenceU16.format}', flush=
True)
296 raise ValueError(f
'E Cannot write outputs: {disparity_fname}, {confidence_fname}\n'
297 f
'E Using output mode: {args.output_mode}')
300 if __name__ ==
'__main__'