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()
286 ssd.run_and_connect();
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()
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();
330 case OpenCVStereoParamsInterface::PFT_XSOBEL: cmb_pre_filter_type->set_active(0);
break;
331 default: cmb_pre_filter_type->set_active(1);
break;
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()
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));
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");
Bumblebee2CalibGtkWindow(BaseObjectType *cobject, const Glib::RefPtr< Gtk::Builder > &builder)
Constructor.
~Bumblebee2CalibGtkWindow()
Destructor.
virtual Interface * open_for_reading(const char *interface_type, const char *identifier, const char *owner=NULL)=0
Open interface for reading.
virtual void unregister_listener(BlackBoardInterfaceListener *listener)
Unregister BB interface listener.
virtual void register_listener(BlackBoardInterfaceListener *listener, ListenerRegisterFlag flag=BBIL_FLAG_ALL)
Register BB event listener.
virtual void close(Interface *interface)=0
Close interface.
sigc::signal< void > signal_connected()
Get "connected" signal.
FawkesNetworkClient * get_client()
Get client.
sigc::signal< void > signal_disconnected()
Get "disconnected" signal.
Base class for exceptions in Fawkes.
iterator begin()
Get iterator for messages.
bool connected() const
Check if connection is alive.
const char * get_hostname() const
Get the client's hostname.
void disconnect()
Disconnect socket.
Interface listener with dispatcher.
sigc::signal< void, Interface * > signal_data_changed()
Get "data changed" signal.
void read()
Read from BlackBoard into local copy.
bool has_writer() const
Check if there is a writer for the interface.
unsigned int msgq_enqueue(Message *message)
Enqueue message at end of queue.
SetMinDisparityMessage Fawkes BlackBoard Interface Message.
SetNumDisparitiesMessage Fawkes BlackBoard Interface Message.
SetPreFilterCapMessage Fawkes BlackBoard Interface Message.
SetPreFilterSizeMessage Fawkes BlackBoard Interface Message.
SetPreFilterTypeMessage Fawkes BlackBoard Interface Message.
SetSADWindowSizeMessage Fawkes BlackBoard Interface Message.
SetSpeckleRangeMessage Fawkes BlackBoard Interface Message.
SetSpeckleWindowSizeMessage Fawkes BlackBoard Interface Message.
SetTextureThresholdMessage Fawkes BlackBoard Interface Message.
SetTrySmallerWindowsMessage Fawkes BlackBoard Interface Message.
SetUniquenessRatioMessage Fawkes BlackBoard Interface Message.
OpenCVStereoParamsInterface Fawkes BlackBoard Interface.
bool is_try_smaller_windows() const
Get try_smaller_windows value.
uint32_t speckle_window_size() const
Get speckle_window_size value.
uint32_t pre_filter_size() const
Get pre_filter_size value.
uint32_t texture_threshold() const
Get texture_threshold value.
PreFilterType
The type used for the pre-filter to come up with the features for the correspondence matching.
int32_t min_disparity() const
Get min_disparity value.
uint32_t pre_filter_cap() const
Get pre_filter_cap value.
const char * tostring_PreFilterType(PreFilterType value) const
Convert PreFilterType constant to string.
PreFilterType pre_filter_type() const
Get pre_filter_type value.
uint32_t num_disparities() const
Get num_disparities value.
uint32_t speckle_range() const
Get speckle_range value.
uint32_t sad_window_size() const
Get sad_window_size value.
uint32_t uniqueness_ratio() const
Get uniqueness_ratio value.
virtual void open()
Open the camera.
virtual unsigned int pixel_height()
Height of image in pixels.
virtual void stop()
Stop image transfer from the camera.
virtual colorspace_t colorspace()
Colorspace of returned image.
virtual unsigned char * buffer()
Get access to current image buffer.
virtual void start()
Start image transfer from the camera.
virtual void close()
Close camera.
virtual unsigned int pixel_width()
Width of image in pixels.
virtual void dispose_buffer()
Dispose current buffer.
virtual void capture()
Capture an image.
Fawkes library namespace.