25 #include <blackboard/remote.h>
26 #include <fvcams/net.h>
27 #include <fvutils/color/conversions.h>
28 #include <gui_utils/interface_dispatcher.h>
29 #include <gui_utils/service_chooser_dialog.h>
30 #include <interfaces/OpenCVStereoParamsInterface.h>
31 #include <netcomm/fawkes/client.h>
38 using namespace firevision;
41 #define FIREVISION_PORT 2208
42 #define BB2_IMG_RECT_LEFT "bumblebee2-rgb-rectified-left"
43 #define BB2_IMG_DISPARITY "bumblebee2-disparity"
44 #define IMG_UPDATE_INTERVAL 200
56 const Glib::RefPtr<Gtk::Builder> &builder)
57 : Gtk::Window(cobject)
61 cam_left_rectified_ = cam_disparity_ = NULL;
62 buffer_rgb_disparity_ = buffer_rgb_rect_left_ = NULL;
64 builder->get_widget(
"cmb_pre_filter_type", cmb_pre_filter_type);
65 builder->get_widget(
"lab_pre_filter_type", lab_pre_filter_type);
66 builder->get_widget(
"lab_pre_filter_size", lab_pre_filter_size);
67 builder->get_widget(
"lab_pre_filter_cap", lab_pre_filter_cap);
68 builder->get_widget(
"lab_sad_window_size", lab_sad_window_size);
69 builder->get_widget(
"lab_min_disparity", lab_min_disparity);
70 builder->get_widget(
"lab_num_disparities", lab_num_disparities);
71 builder->get_widget(
"lab_texture_threshold", lab_texture_threshold);
72 builder->get_widget(
"lab_uniqueness_ratio", lab_uniqueness_ratio);
73 builder->get_widget(
"lab_speckle_window_size", lab_speckle_window_size);
74 builder->get_widget(
"lab_speckle_range", lab_speckle_range);
75 builder->get_widget(
"lab_try_smaller_windows", lab_try_smaller_windows);
76 builder->get_widget(
"hsc_pre_filter_size", hsc_pre_filter_size);
77 builder->get_widget(
"hsc_pre_filter_cap", hsc_pre_filter_cap);
78 builder->get_widget(
"hsc_sad_window_size", hsc_sad_window_size);
79 builder->get_widget(
"hsc_min_disparity", hsc_min_disparity);
80 builder->get_widget(
"hsc_num_disparities", hsc_num_disparities);
81 builder->get_widget(
"hsc_texture_threshold", hsc_texture_threshold);
82 builder->get_widget(
"hsc_uniqueness_ratio", hsc_uniqueness_ratio);
83 builder->get_widget(
"hsc_speckle_window_size", hsc_speckle_window_size);
84 builder->get_widget(
"cb_try_smaller_windows", cb_try_smaller_windows);
85 builder->get_widget(
"hsc_speckle_range", hsc_speckle_range);
86 builder->get_widget(
"tb_connection", tb_connection);
87 builder->get_widget(
"tb_exit", tb_exit);
88 builder->get_widget(
"img_left_rectified", img_left_rectified);
89 builder->get_widget(
"img_disparity", img_disparity);
90 builder->get_widget(
"img_writer", img_writer);
92 cmb_pre_filter_type->signal_changed().connect(
93 sigc::mem_fun(*
this, &Bumblebee2CalibGtkWindow::on_pre_filter_type_changed));
94 hsc_pre_filter_size->signal_value_changed().connect(
95 sigc::mem_fun(*
this, &Bumblebee2CalibGtkWindow::on_pre_filter_size_changed));
96 hsc_pre_filter_cap->signal_value_changed().connect(
97 sigc::mem_fun(*
this, &Bumblebee2CalibGtkWindow::on_pre_filter_cap_changed));
98 hsc_sad_window_size->signal_value_changed().connect(
99 sigc::mem_fun(*
this, &Bumblebee2CalibGtkWindow::on_sad_window_size_changed));
100 hsc_min_disparity->signal_value_changed().connect(
101 sigc::mem_fun(*
this, &Bumblebee2CalibGtkWindow::on_min_disparity_changed));
102 hsc_num_disparities->signal_value_changed().connect(
103 sigc::mem_fun(*
this, &Bumblebee2CalibGtkWindow::on_num_disparities_changed));
104 hsc_texture_threshold->signal_value_changed().connect(
105 sigc::mem_fun(*
this, &Bumblebee2CalibGtkWindow::on_texture_threshold_changed));
106 hsc_uniqueness_ratio->signal_value_changed().connect(
107 sigc::mem_fun(*
this, &Bumblebee2CalibGtkWindow::on_uniqueness_ratio_changed));
108 hsc_speckle_window_size->signal_value_changed().connect(
109 sigc::mem_fun(*
this, &Bumblebee2CalibGtkWindow::on_speckle_window_size_changed));
110 hsc_speckle_range->signal_value_changed().connect(
111 sigc::mem_fun(*
this, &Bumblebee2CalibGtkWindow::on_speckle_range_changed));
112 cb_try_smaller_windows->signal_toggled().connect(
113 sigc::mem_fun(*
this, &Bumblebee2CalibGtkWindow::on_try_smaller_windows_toggled));
115 tb_connection->signal_clicked().connect(
116 sigc::mem_fun(*
this, &Bumblebee2CalibGtkWindow::on_connection_clicked));
117 tb_exit->signal_clicked().connect(
118 sigc::mem_fun(*
this, &Bumblebee2CalibGtkWindow::on_exit_clicked));
121 sigc::mem_fun(*
this, &Bumblebee2CalibGtkWindow::on_connect));
123 sigc::mem_fun(*
this, &Bumblebee2CalibGtkWindow::on_disconnect));
138 Bumblebee2CalibGtkWindow::init()
144 Bumblebee2CalibGtkWindow::on_pre_filter_type_changed()
147 if (cmb_pre_filter_type->get_active_row_number() == 1) {
148 new_type = OpenCVStereoParamsInterface::PFT_NORMALIZED_RESPONSE;
150 new_type = OpenCVStereoParamsInterface::PFT_XSOBEL;
163 Bumblebee2CalibGtkWindow::on_pre_filter_size_changed()
165 unsigned new_value = (
unsigned int)hsc_pre_filter_size->get_value() * 2 + 1;
168 printf(
"Setting pre filter size %u\n", new_value);
177 Bumblebee2CalibGtkWindow::on_pre_filter_cap_changed()
179 unsigned int new_value = (
unsigned int)hsc_pre_filter_cap->get_value();
181 printf(
"Setting pre filter cap %u\n", new_value);
190 Bumblebee2CalibGtkWindow::on_sad_window_size_changed()
192 unsigned int new_value = (
unsigned int)hsc_sad_window_size->get_value() * 2 + 1;
195 printf(
"Setting SAD window size %u\n", new_value);
204 Bumblebee2CalibGtkWindow::on_min_disparity_changed()
206 int new_value = (int)hsc_min_disparity->get_value();
208 printf(
"Setting min disparity %i\n", new_value);
217 Bumblebee2CalibGtkWindow::on_num_disparities_changed()
219 unsigned int new_value = (
unsigned int)hsc_num_disparities->get_value() * 16;
221 printf(
"Setting num disparities %u\n", new_value);
230 Bumblebee2CalibGtkWindow::on_texture_threshold_changed()
232 unsigned int new_value = (
unsigned int)hsc_texture_threshold->get_value();
234 printf(
"Setting texture threshold %u\n", new_value);
243 Bumblebee2CalibGtkWindow::on_uniqueness_ratio_changed()
245 unsigned int new_value = (
unsigned int)hsc_uniqueness_ratio->get_value();
247 printf(
"Setting uniqueness ratio %u\n", new_value);
256 Bumblebee2CalibGtkWindow::on_speckle_window_size_changed()
258 unsigned int new_value = (
unsigned int)hsc_speckle_window_size->get_value();
260 printf(
"Setting speckle window size %u\n", new_value);
269 Bumblebee2CalibGtkWindow::on_speckle_range_changed()
271 unsigned int new_value = (
unsigned int)hsc_speckle_range->get_value();
273 printf(
"Setting speckle range %u\n", new_value);
282 Bumblebee2CalibGtkWindow::on_connection_clicked()
294 Bumblebee2CalibGtkWindow::on_try_smaller_windows_toggled()
296 bool new_value = cb_try_smaller_windows->get_active();
300 printf(
"%sabling smaller windows\n", new_value ?
"En" :
"Dis");
309 Bumblebee2CalibGtkWindow::on_connect()
315 if (!params_if_->has_writer()) {
316 throw Exception(
"No writer for parameter blackboard interface");
321 sigc::hide(sigc::mem_fun(*
this, &Bumblebee2CalibGtkWindow::update_param_values)));
325 tb_connection->set_stock_id(Gtk::Stock::DISCONNECT);
327 update_param_values();
329 switch (params_if_->pre_filter_type()) {
330 case OpenCVStereoParamsInterface::PFT_XSOBEL: cmb_pre_filter_type->set_active(0);
break;
331 default: cmb_pre_filter_type->set_active(1);
break;
333 hsc_pre_filter_size->set_value(params_if_->pre_filter_size() / 2);
334 hsc_pre_filter_cap->set_value(params_if_->pre_filter_cap());
335 hsc_sad_window_size->set_value(params_if_->sad_window_size() / 2);
336 hsc_min_disparity->set_value(params_if_->min_disparity());
337 hsc_num_disparities->set_value(params_if_->num_disparities() / 16);
338 hsc_texture_threshold->set_value(params_if_->texture_threshold());
339 hsc_uniqueness_ratio->set_value(params_if_->uniqueness_ratio());
340 hsc_speckle_window_size->set_value(params_if_->speckle_window_size());
341 hsc_speckle_range->set_value(params_if_->speckle_range());
342 cb_try_smaller_windows->set_active(params_if_->is_try_smaller_windows());
344 cmb_pre_filter_type->set_sensitive(
true);
345 hsc_pre_filter_size->set_sensitive(
true);
346 hsc_pre_filter_cap->set_sensitive(
true);
347 hsc_sad_window_size->set_sensitive(
true);
348 hsc_min_disparity->set_sensitive(
true);
349 hsc_num_disparities->set_sensitive(
true);
350 hsc_texture_threshold->set_sensitive(
true);
351 hsc_uniqueness_ratio->set_sensitive(
true);
352 hsc_speckle_window_size->set_sensitive(
true);
353 hsc_speckle_range->set_sensitive(
true);
354 cb_try_smaller_windows->set_sensitive(
true);
360 cam_left_rectified_->
open();
361 cam_left_rectified_->
start();
362 printf(
"Colorspace: %s\n", colorspace_to_string(cam_left_rectified_->
colorspace()));
368 cam_disparity_->
open();
369 cam_disparity_->
start();
370 buffer_rgb_disparity_ =
372 buffer_rgb_rect_left_ =
375 sconn_update_images_ =
376 Glib::signal_timeout().connect(sigc::mem_fun(*
this, &Bumblebee2CalibGtkWindow::update_images),
377 IMG_UPDATE_INTERVAL);
379 this->set_title(std::string(
"Bumblebee2 Calibration @ ")
383 Glib::ustring message = *(e.
begin());
384 Gtk::MessageDialog md(*
this,
390 md.set_title(
"Connection failed");
394 bb_->
close(params_if_);
401 delete cam_left_rectified_;
402 delete cam_disparity_;
403 if (buffer_rgb_disparity_)
404 free(buffer_rgb_disparity_);
405 if (buffer_rgb_rect_left_)
406 free(buffer_rgb_rect_left_);
407 cam_left_rectified_ = cam_disparity_ = NULL;
408 buffer_rgb_disparity_ = buffer_rgb_rect_left_ = NULL;
416 Bumblebee2CalibGtkWindow::on_disconnect()
418 sconn_update_images_.disconnect();
420 img_writer->set_from_icon_name(Gtk::Stock::NO.
id, Gtk::IconSize(Gtk::ICON_SIZE_SMALL_TOOLBAR));
421 img_writer->set_tooltip_text(
"Not connected and thus no writer");
423 img_disparity->clear();
424 img_disparity->set(
"gtk-missing-image");
426 img_left_rectified->clear();
427 img_left_rectified->set(
"gtk-missing-image");
429 lab_pre_filter_size->set_text(
"");
430 lab_pre_filter_cap->set_text(
"");
431 lab_sad_window_size->set_text(
"");
432 lab_min_disparity->set_text(
"");
433 lab_num_disparities->set_text(
"");
434 lab_texture_threshold->set_text(
"");
435 lab_uniqueness_ratio->set_text(
"");
436 lab_speckle_window_size->set_text(
"");
437 lab_speckle_range->set_text(
"");
438 lab_try_smaller_windows->set_text(
"");
440 cmb_pre_filter_type->set_sensitive(
false);
441 hsc_pre_filter_size->set_sensitive(
false);
442 hsc_pre_filter_cap->set_sensitive(
false);
443 hsc_sad_window_size->set_sensitive(
false);
444 hsc_min_disparity->set_sensitive(
false);
445 hsc_num_disparities->set_sensitive(
false);
446 hsc_texture_threshold->set_sensitive(
false);
447 hsc_uniqueness_ratio->set_sensitive(
false);
448 hsc_speckle_window_size->set_sensitive(
false);
449 hsc_speckle_range->set_sensitive(
false);
450 cb_try_smaller_windows->set_sensitive(
false);
454 bb_->
close(params_if_);
462 if (cam_disparity_) {
463 cam_disparity_->
stop();
464 cam_disparity_->
close();
465 delete cam_disparity_;
466 cam_disparity_ = NULL;
468 if (buffer_rgb_disparity_)
469 free(buffer_rgb_disparity_);
470 buffer_rgb_disparity_ = NULL;
472 if (buffer_rgb_rect_left_)
473 free(buffer_rgb_rect_left_);
474 buffer_rgb_rect_left_ = NULL;
476 if (cam_left_rectified_) {
477 cam_left_rectified_->
stop();
478 cam_left_rectified_->
close();
479 delete cam_left_rectified_;
480 cam_left_rectified_ = NULL;
483 tb_connection->set_stock_id(Gtk::Stock::CONNECT);
486 this->set_title(
"Bumblebee2 Calibration");
490 Bumblebee2CalibGtkWindow::update_param_values()
494 switch (params_if_->pre_filter_type()) {
495 case OpenCVStereoParamsInterface::PFT_XSOBEL: lab_pre_filter_type->set_text(
"XSOBEL");
break;
496 default: lab_pre_filter_type->set_text(
"NORM RESP");
break;
498 lab_pre_filter_size->set_text(convert_float2str(params_if_->pre_filter_size(), 0));
499 lab_pre_filter_cap->set_text(convert_float2str(params_if_->pre_filter_cap(), 0));
500 lab_sad_window_size->set_text(convert_float2str(params_if_->sad_window_size(), 0));
501 lab_min_disparity->set_text(convert_float2str(params_if_->min_disparity(), 0));
502 lab_num_disparities->set_text(convert_float2str(params_if_->num_disparities(), 0));
503 lab_texture_threshold->set_text(convert_float2str(params_if_->texture_threshold(), 0));
504 lab_uniqueness_ratio->set_text(convert_float2str(params_if_->uniqueness_ratio(), 0));
505 lab_speckle_window_size->set_text(convert_float2str(params_if_->speckle_window_size(), 0));
506 lab_speckle_range->set_text(convert_float2str(params_if_->speckle_range(), 0));
507 lab_try_smaller_windows->set_text(params_if_->is_try_smaller_windows() ?
"true" :
"false");
511 Bumblebee2CalibGtkWindow::dont_destroy(
const guint8 *data)
516 Bumblebee2CalibGtkWindow::update_images()
518 if (bb_ && params_if_ && params_if_->has_writer()) {
519 if (img_writer->get_icon_name() != Gtk::Stock::YES.id) {
520 img_writer->set_from_icon_name(Gtk::Stock::YES.
id,
521 Gtk::IconSize(Gtk::ICON_SIZE_SMALL_TOOLBAR));
522 img_writer->set_tooltip_text(
"Writer for blackboard interface exists");
525 cam_left_rectified_->
capture();
526 unsigned int rlwidth = cam_left_rectified_->
pixel_width();
527 unsigned int rlheight = cam_left_rectified_->
pixel_height();
530 cam_left_rectified_->
buffer(),
531 buffer_rgb_rect_left_,
536 Glib::RefPtr<Gdk::Pixbuf> image =
537 Gdk::Pixbuf::create_from_data(buffer_rgb_rect_left_,
544 sigc::mem_fun(*
this, &Bumblebee2CalibGtkWindow::dont_destroy));
546 image = image->scale_simple(320, 240, Gdk::INTERP_BILINEAR);
548 img_left_rectified->set(image);
555 buffer_rgb_disparity_,
560 Glib::RefPtr<Gdk::Pixbuf> dimage =
561 Gdk::Pixbuf::create_from_data(buffer_rgb_disparity_,
568 sigc::mem_fun(*
this, &Bumblebee2CalibGtkWindow::dont_destroy));
569 img_disparity->set(dimage);
571 if (img_writer->get_icon_name() != Gtk::Stock::NO.id) {
572 img_writer->set_from_icon_name(Gtk::Stock::NO.
id,
573 Gtk::IconSize(Gtk::ICON_SIZE_SMALL_TOOLBAR));
574 img_writer->set_tooltip_text(
"There is no blackboard writer for the interface");
582 Bumblebee2CalibGtkWindow::on_exit_clicked()
594 Bumblebee2CalibGtkWindow::convert_float2str(
float f,
unsigned int width)
596 #if GLIBMM_MAJOR_VERSION > 2 || (GLIBMM_MAJOR_VERSION == 2 && GLIBMM_MINOR_VERSION >= 16)
597 return Glib::ustring::format(std::fixed, std::setprecision(width), f);
599 std::ostringstream ss;
600 ss << std::fixed << std::setprecision(width);
603 return Glib::locale_to_utf8(ss.str());
608 Bumblebee2CalibGtkWindow::convert_str2float(Glib::ustring sn,
float *f)
611 *f = strtof(sn.c_str(), &endptr);
612 if (endptr[0] != 0) {
613 Glib::ustring s(
"Could not convert string to valid number: ");
614 s.append(sn, 0, sn.length() - strlen(endptr));
615 s +=
" >>><b>";
617 s +=
"</b><<< ";
618 s.append(endptr + 1, strlen(endptr) - 1);
620 Gtk::MessageDialog md(*
this,
624 md.set_title(
"Invalid value");