Commit aea4edb6c9856baaef7a5e5a7e67bc5236969f60
1 parent
23bc5efd
Deal with the ctypes pointer bullshit so users don't need to
Showing
1 changed file
with
111 additions
and
35 deletions
scripts/brpy/__init__.py
| @@ -16,20 +16,23 @@ def _string_args(n): | @@ -16,20 +16,23 @@ def _string_args(n): | ||
| 16 | ''' | 16 | ''' |
| 17 | Returns n char* | 17 | Returns n char* |
| 18 | ''' | 18 | ''' |
| 19 | - s = [] | ||
| 20 | - for i in range(n): | ||
| 21 | - s.append(c_char_p) | ||
| 22 | - return s | 19 | + return [c_char_p]*n |
| 23 | 20 | ||
| 24 | -def _var_string_args(n): | 21 | +def _var_string_args_func(func, n, *args): |
| 25 | ''' | 22 | ''' |
| 26 | - Returns one int and one char** followed by n char* | 23 | + Translates the C functions that are |
| 24 | + (int, char**, n char*, and optional extra types in *args) | ||
| 25 | + to a more pythonic version that wraps the char** arg in | ||
| 26 | + the appropriate type. | ||
| 27 | ''' | 27 | ''' |
| 28 | - s = [c_int, POINTER(c_char_p)] | ||
| 29 | - s.extend(_string_args(n)) | ||
| 30 | - return s | 28 | + def call_func(one, two, *rest): |
| 29 | + arr_type = c_char_p*len(two) | ||
| 30 | + func.argtypes = [c_int, arr_type] + _string_args(n) + args | ||
| 31 | + arr = arr_type(*map(c_char_p, two)) | ||
| 32 | + return func(one, arr, *rest) | ||
| 33 | + return call_func | ||
| 31 | 34 | ||
| 32 | -def _handle_string_func(func): | 35 | +def _handle_string_func(func, *moretypes): |
| 33 | ''' | 36 | ''' |
| 34 | A helper function to make the C functions | 37 | A helper function to make the C functions |
| 35 | that populate string buffers more pythonic. | 38 | that populate string buffers more pythonic. |
| @@ -42,6 +45,7 @@ def _handle_string_func(func): | @@ -42,6 +45,7 @@ def _handle_string_func(func): | ||
| 42 | Then it returns the string itself. This way, the user of brpy | 45 | Then it returns the string itself. This way, the user of brpy |
| 43 | doesn't need to do this stupid magic for themselves. Hooray! | 46 | doesn't need to do this stupid magic for themselves. Hooray! |
| 44 | ''' | 47 | ''' |
| 48 | + func.argtypes = [c_char_p, c_int] + list(moretypes) | ||
| 45 | def call_func(*args): | 49 | def call_func(*args): |
| 46 | howlong = func('', 0, *args) | 50 | howlong = func('', 0, *args) |
| 47 | msg = 'x'*(howlong-1) | 51 | msg = 'x'*(howlong-1) |
| @@ -73,107 +77,179 @@ def init_brpy(br_loc='/usr/local/lib'): | @@ -73,107 +77,179 @@ def init_brpy(br_loc='/usr/local/lib'): | ||
| 73 | if not found: | 77 | if not found: |
| 74 | raise ValueError('Neither .so nor .dylib libopenbr found in %s' % br_loc) | 78 | raise ValueError('Neither .so nor .dylib libopenbr found in %s' % br_loc) |
| 75 | 79 | ||
| 76 | - plot_args = _var_string_args(1) + [c_bool] | ||
| 77 | br.br_about.restype = c_char_p | 80 | br.br_about.restype = c_char_p |
| 78 | - br.br_cat.argtypes = _var_string_args(1) | ||
| 79 | - br.br_cluster.argtypes = [c_int, POINTER(c_char_p), c_float, c_char_p] | ||
| 80 | - br.br_combine_masks.argtypes = _var_string_args(2) | 81 | + |
| 82 | + br.br_cat = _var_string_args_func(br.br_cat, 1) | ||
| 83 | + | ||
| 84 | + br.br_cluster = _var_string_args_func(br.br_cluster, 0, c_float, c_char_p) | ||
| 85 | + | ||
| 86 | + br.br_combine_masks = _var_string_args_func(br.br_combine_masks, 2) | ||
| 87 | + | ||
| 81 | br.br_compare.argtypes = _string_args(3) | 88 | br.br_compare.argtypes = _string_args(3) |
| 82 | - br.br_compare_n.argtypes = [c_int, POINTER(c_char_p)] + _string_args(2) | 89 | + |
| 90 | + br.br_compare_n = _var_string_args_func(br.br_compare_n, 2) | ||
| 91 | + | ||
| 83 | br.br_pairwise_compare.argtypes = _string_args(3) | 92 | br.br_pairwise_compare.argtypes = _string_args(3) |
| 93 | + | ||
| 84 | br.br_convert.argtypes = _string_args(3) | 94 | br.br_convert.argtypes = _string_args(3) |
| 95 | + | ||
| 85 | br.br_enroll.argtypes = _string_args(2) | 96 | br.br_enroll.argtypes = _string_args(2) |
| 86 | - br.br_enroll_n.argtypes = _var_string_args(1) | 97 | + |
| 98 | + br.br_enroll_n = _var_string_args_func(br.br_enroll_n, 1) | ||
| 99 | + | ||
| 87 | br.br_eval.argtypes = _string_args(3) | 100 | br.br_eval.argtypes = _string_args(3) |
| 88 | br.br_eval.restype = c_float | 101 | br.br_eval.restype = c_float |
| 102 | + | ||
| 89 | br.br_eval_classification.argtypes = _string_args(4) | 103 | br.br_eval_classification.argtypes = _string_args(4) |
| 104 | + | ||
| 90 | br.br_eval_clustering.argtypes = _string_args(3) | 105 | br.br_eval_clustering.argtypes = _string_args(3) |
| 106 | + | ||
| 91 | br.br_eval_detection.argtypes = _string_args(3) | 107 | br.br_eval_detection.argtypes = _string_args(3) |
| 92 | br.br_eval_detection.restype = c_float | 108 | br.br_eval_detection.restype = c_float |
| 109 | + | ||
| 93 | br.br_eval_landmarking.argtypes = _string_args(3) + [c_int, c_int] | 110 | br.br_eval_landmarking.argtypes = _string_args(3) + [c_int, c_int] |
| 94 | br.br_eval_landmarking.restype = c_float | 111 | br.br_eval_landmarking.restype = c_float |
| 112 | + | ||
| 95 | br.br_eval_regression.argtypes = _string_args(4) | 113 | br.br_eval_regression.argtypes = _string_args(4) |
| 96 | - br.br_fuse.argtypes = _var_string_args(3) | ||
| 97 | - br.br_initialize.argtypes = _var_string_args(1) | 114 | + |
| 115 | + br.br_fuse = _var_string_args_func(br.br_fuse, 3) | ||
| 116 | + | ||
| 117 | + def br_initialize_wrap(func): | ||
| 118 | + def call_func(argc, argv, sdk_path='', use_gui=False): | ||
| 119 | + arr_type = c_char_p*len(argv) | ||
| 120 | + func.argtypes = [POINTER(c_int),arr_type,c_char_p,c_bool] | ||
| 121 | + arr = arr_type(*map(c_char_p, argv)) | ||
| 122 | + return func(pointer(c_int(argc)), arr, sdk_path, use_gui) | ||
| 123 | + return call_func | ||
| 124 | + br.br_initialize = br_initialize_wrap(br.br_initialize) | ||
| 125 | + | ||
| 98 | br.br_is_classifier.argtypes = [c_char_p] | 126 | br.br_is_classifier.argtypes = [c_char_p] |
| 99 | br.br_is_classifier.restype = c_bool | 127 | br.br_is_classifier.restype = c_bool |
| 128 | + | ||
| 100 | br.br_make_mask.argtypes = _string_args(3) | 129 | br.br_make_mask.argtypes = _string_args(3) |
| 130 | + | ||
| 101 | br.br_make_pairwise_mask.argtypes = _string_args(3) | 131 | br.br_make_pairwise_mask.argtypes = _string_args(3) |
| 102 | - br.br_most_recent_message.argtypes = [c_char_p, c_int] | 132 | + |
| 103 | br.br_most_recent_message.restype = c_int | 133 | br.br_most_recent_message.restype = c_int |
| 104 | - func = br.br_most_recent_message.__call__ | ||
| 105 | - br.br_most_recent_message = _handle_string_func(func) | ||
| 106 | - br.br_objects.argtypes = [c_char_p, c_int] + _string_args(2) + [c_bool] | 134 | + br.br_most_recent_message = _handle_string_func(br.br_most_recent_message) |
| 135 | + | ||
| 107 | br.br_objects.restype = c_int | 136 | br.br_objects.restype = c_int |
| 108 | - func2 = br.br_objects.__call__ | ||
| 109 | - br.br_objects = _handle_string_func(func2) | ||
| 110 | - br.br_plot.argtypes = plot_args | 137 | + moreargs = _string_args(2) + [c_bool] |
| 138 | + br.br_objects = _handle_string_func(br.br_objects, *moreargs) | ||
| 139 | + | ||
| 111 | br.br_plot.restype = c_bool | 140 | br.br_plot.restype = c_bool |
| 112 | - br.br_plot_detection.argtypes = plot_args | 141 | + br.br_plot = _var_string_args_func(br.br_plot, 1, c_bool) |
| 142 | + | ||
| 113 | br.br_plot_detection.restype = c_bool | 143 | br.br_plot_detection.restype = c_bool |
| 114 | - br.br_plot_landmarking.argtypes = plot_args | 144 | + br.br_plot_detection = _var_string_args_func(br.br_plot_detection, 1, c_bool) |
| 145 | + | ||
| 115 | br.br_plot_landmarking.restype = c_bool | 146 | br.br_plot_landmarking.restype = c_bool |
| 116 | - br.br_plot_metadata.argtypes = plot_args | 147 | + br.br_plot_landmarking = _var_string_args_func(br.br_plot_landmarking, 1, c_bool) |
| 148 | + | ||
| 117 | br.br_plot_metadata.restype = c_bool | 149 | br.br_plot_metadata.restype = c_bool |
| 150 | + br.br_plot_metadata = _var_string_args_func(br.br_plot_metadata, 1, c_bool) | ||
| 151 | + | ||
| 118 | br.br_progress.restype = c_float | 152 | br.br_progress.restype = c_float |
| 153 | + | ||
| 154 | + # TODO: ??? how do *** ??? | ||
| 119 | br.br_read_pipe.argtypes = [c_char_p, POINTER(c_int), POINTER(POINTER(c_char_p))] | 155 | br.br_read_pipe.argtypes = [c_char_p, POINTER(c_int), POINTER(POINTER(c_char_p))] |
| 156 | + | ||
| 120 | br.br_scratch_path.argtypes = [c_char_p, c_int] | 157 | br.br_scratch_path.argtypes = [c_char_p, c_int] |
| 121 | br.br_scratch_path.restype = c_int | 158 | br.br_scratch_path.restype = c_int |
| 122 | - func3 = br.br_scratch_path.__call__ | ||
| 123 | - br.br_scratch_path = _handle_string_func(func3) | 159 | + br.br_scratch_path = _handle_string_func(br.br_scratch_path) |
| 160 | + | ||
| 124 | br.br_sdk_path.restype = c_char_p | 161 | br.br_sdk_path.restype = c_char_p |
| 162 | + | ||
| 163 | + def br_get_header_wrap(func): | ||
| 164 | + def call_func(matrix, target_gallery, query_gallery): | ||
| 165 | + arr_type1 = c_char_p*len(target_gallery) | ||
| 166 | + arr_type2 = c_char_p*len(query_gallery) | ||
| 167 | + func.argtypes = [c_char_p,arr_type1,arr_type2] | ||
| 168 | + arr1 = arr_type1(*map(c_char_p, target_gallery)) | ||
| 169 | + arr2 = arr_type2(*map(c_char_p, query_gallery)) | ||
| 170 | + return func(matrix, arr1, arr2) | ||
| 171 | + return call_func | ||
| 125 | br.br_get_header.argtypes = [c_char_p, POINTER(c_char_p), POINTER(c_char_p)] | 172 | br.br_get_header.argtypes = [c_char_p, POINTER(c_char_p), POINTER(c_char_p)] |
| 173 | + | ||
| 126 | br.br_set_header.argtypes = _string_args(3) | 174 | br.br_set_header.argtypes = _string_args(3) |
| 175 | + | ||
| 127 | br.br_set_property.argtypes = _string_args(2) | 176 | br.br_set_property.argtypes = _string_args(2) |
| 177 | + | ||
| 128 | br.br_time_remaining.restype = c_int | 178 | br.br_time_remaining.restype = c_int |
| 179 | + | ||
| 129 | br.br_train.argtypes = _string_args(2) | 180 | br.br_train.argtypes = _string_args(2) |
| 130 | - br.br_train_n.argtypes = _var_string_args(1) | 181 | + |
| 182 | + br.br_train_n = _var_string_args_func(br.br_train_n, 1) | ||
| 183 | + | ||
| 131 | br.br_version.restype = c_char_p | 184 | br.br_version.restype = c_char_p |
| 185 | + | ||
| 132 | br.br_slave_process.argtypes = [c_char_p] | 186 | br.br_slave_process.argtypes = [c_char_p] |
| 187 | + | ||
| 133 | br.br_load_img.argtypes = [c_char_p, c_int] | 188 | br.br_load_img.argtypes = [c_char_p, c_int] |
| 134 | br.br_load_img.restype = c_void_p | 189 | br.br_load_img.restype = c_void_p |
| 190 | + | ||
| 135 | br.br_unload_img.argtypes = [c_void_p] | 191 | br.br_unload_img.argtypes = [c_void_p] |
| 136 | br.br_unload_img.restype = POINTER(c_ubyte) | 192 | br.br_unload_img.restype = POINTER(c_ubyte) |
| 193 | + | ||
| 137 | br.br_template_list_from_buffer.argtypes = [c_char_p, c_int] | 194 | br.br_template_list_from_buffer.argtypes = [c_char_p, c_int] |
| 138 | br.br_template_list_from_buffer.restype = c_void_p | 195 | br.br_template_list_from_buffer.restype = c_void_p |
| 196 | + | ||
| 139 | br.br_free_template.argtypes = [c_void_p] | 197 | br.br_free_template.argtypes = [c_void_p] |
| 198 | + | ||
| 140 | br.br_free_template_list.argtypes = [c_void_p] | 199 | br.br_free_template_list.argtypes = [c_void_p] |
| 200 | + | ||
| 141 | br.br_free_output.argtypes = [c_void_p] | 201 | br.br_free_output.argtypes = [c_void_p] |
| 202 | + | ||
| 142 | br.br_img_rows.argtypes = [c_void_p] | 203 | br.br_img_rows.argtypes = [c_void_p] |
| 143 | br.br_img_rows.restype = c_int | 204 | br.br_img_rows.restype = c_int |
| 205 | + | ||
| 144 | br.br_img_cols.argtypes = [c_void_p] | 206 | br.br_img_cols.argtypes = [c_void_p] |
| 145 | br.br_img_cols.restype = c_int | 207 | br.br_img_cols.restype = c_int |
| 208 | + | ||
| 146 | br.br_img_channels.argtypes = [c_void_p] | 209 | br.br_img_channels.argtypes = [c_void_p] |
| 147 | br.br_img_channels.restype = c_int | 210 | br.br_img_channels.restype = c_int |
| 211 | + | ||
| 148 | br.br_img_is_empty.argtypes = [c_void_p] | 212 | br.br_img_is_empty.argtypes = [c_void_p] |
| 149 | br.br_img_is_empty.restype = c_bool | 213 | br.br_img_is_empty.restype = c_bool |
| 214 | + | ||
| 150 | br.br_get_filename.argtypes = [c_char_p, c_int, c_void_p] | 215 | br.br_get_filename.argtypes = [c_char_p, c_int, c_void_p] |
| 151 | br.br_get_filename.restype = c_int | 216 | br.br_get_filename.restype = c_int |
| 152 | - func4 = br.br_get_filename.__call__ | ||
| 153 | - br.br_get_filename = _handle_string_func(func4) | 217 | + br.br_get_filename = _handle_string_func(br.br_get_filename) |
| 218 | + | ||
| 154 | br.br_set_filename.argtypes = [c_void_p, c_char_p] | 219 | br.br_set_filename.argtypes = [c_void_p, c_char_p] |
| 220 | + | ||
| 155 | br.br_get_metadata_string.argtypes = [c_char_p, c_int, c_void_p, c_char_p] | 221 | br.br_get_metadata_string.argtypes = [c_char_p, c_int, c_void_p, c_char_p] |
| 156 | br.br_get_metadata_string.restype = c_int | 222 | br.br_get_metadata_string.restype = c_int |
| 157 | - func5 = br.br_get_metadata_string.__call__ | ||
| 158 | - br.br_get_metadata_string = _handle_string_func(func5) | 223 | + br.br_get_metadata_string = _handle_string_func(br.br_get_metadata_string) |
| 224 | + | ||
| 159 | br.br_enroll_template.argtypes = [c_void_p] | 225 | br.br_enroll_template.argtypes = [c_void_p] |
| 160 | br.br_enroll_template.restype = c_void_p | 226 | br.br_enroll_template.restype = c_void_p |
| 227 | + | ||
| 161 | br.br_enroll_template_list.argtypes = [c_void_p] | 228 | br.br_enroll_template_list.argtypes = [c_void_p] |
| 162 | br.br_enroll_template_list.restype = c_void_p | 229 | br.br_enroll_template_list.restype = c_void_p |
| 230 | + | ||
| 163 | br.br_compare_template_lists.argtypes = [c_void_p, c_void_p] | 231 | br.br_compare_template_lists.argtypes = [c_void_p, c_void_p] |
| 164 | br.br_compare_template_lists.restype = c_void_p | 232 | br.br_compare_template_lists.restype = c_void_p |
| 233 | + | ||
| 165 | br.br_get_matrix_output_at.argtypes = [c_void_p, c_int, c_int] | 234 | br.br_get_matrix_output_at.argtypes = [c_void_p, c_int, c_int] |
| 166 | br.br_get_matrix_output_at.restype = c_float | 235 | br.br_get_matrix_output_at.restype = c_float |
| 236 | + | ||
| 167 | br.br_get_template.argtypes = [c_void_p, c_int] | 237 | br.br_get_template.argtypes = [c_void_p, c_int] |
| 168 | br.br_get_template.restype = c_void_p | 238 | br.br_get_template.restype = c_void_p |
| 239 | + | ||
| 169 | br.br_num_templates.argtypes = [c_void_p] | 240 | br.br_num_templates.argtypes = [c_void_p] |
| 170 | br.br_num_templates.restype = c_int | 241 | br.br_num_templates.restype = c_int |
| 242 | + | ||
| 171 | br.br_make_gallery.argtypes = [c_char_p] | 243 | br.br_make_gallery.argtypes = [c_char_p] |
| 172 | br.br_make_gallery.restype = c_void_p | 244 | br.br_make_gallery.restype = c_void_p |
| 245 | + | ||
| 173 | br.br_load_from_gallery.argtypes = [c_void_p] | 246 | br.br_load_from_gallery.argtypes = [c_void_p] |
| 174 | br.br_load_from_gallery.restype = c_void_p | 247 | br.br_load_from_gallery.restype = c_void_p |
| 248 | + | ||
| 175 | br.br_add_template_to_gallery.argtypes = [c_void_p, c_void_p] | 249 | br.br_add_template_to_gallery.argtypes = [c_void_p, c_void_p] |
| 250 | + | ||
| 176 | br.br_add_template_list_to_gallery.argtypes = [c_void_p, c_void_p] | 251 | br.br_add_template_list_to_gallery.argtypes = [c_void_p, c_void_p] |
| 252 | + | ||
| 177 | br.br_close_gallery.argtypes = [c_void_p] | 253 | br.br_close_gallery.argtypes = [c_void_p] |
| 178 | 254 | ||
| 179 | return br | 255 | return br |