Merge CV, ver=5.1; ops/methods from HV, and interface from CV where possible
[goodguy/history.git] / cinelerra-5.1 / plugins / findobject / findobjectwindow.C
diff --git a/cinelerra-5.1/plugins/findobject/findobjectwindow.C b/cinelerra-5.1/plugins/findobject/findobjectwindow.C
new file mode 100644 (file)
index 0000000..7f9e440
--- /dev/null
@@ -0,0 +1,604 @@
+
+/*
+ * CINELERRA
+ * Copyright (C) 1997-2012 Adam Williams <broadcast at earthling dot net>
+ * 
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ * 
+ */
+
+#include "bcdisplayinfo.h"
+#include "clip.h"
+#include "language.h"
+#include "findobject.h"
+#include "findobjectwindow.h"
+#include "theme.h"
+
+
+FindObjectWindow::FindObjectWindow(FindObjectMain *plugin)
+ : PluginClientWindow(plugin,
+       300, 
+       550, 
+       300,
+       550,
+       0)
+{
+       this->plugin = plugin; 
+}
+
+FindObjectWindow::~FindObjectWindow()
+{
+}
+
+void FindObjectWindow::create_objects()
+{
+       int x1 = 10, x = 10, y = 10;
+       int x2 = 310;
+       BC_Title *title;
+
+
+       add_subwindow(title = new BC_Title(x1, 
+               y, 
+               _("Algorithm:")));
+       add_subwindow(algorithm = new FindObjectAlgorithm(plugin, 
+               this,
+               x1 + title->get_w() + 10, 
+               y));
+       algorithm->create_objects();
+       y += algorithm->get_h() + plugin->get_theme()->widget_border;
+
+
+       add_subwindow(title = new BC_Title(x1, 
+               y, 
+               _("Search radius:\n(W/H Percent of image)")));
+       add_subwindow(global_range_w = new FindObjectGlobalRange(plugin, 
+               x1 + title->get_w() + 10, 
+               y,
+               &plugin->config.global_range_w));
+       add_subwindow(global_range_h = new FindObjectGlobalRange(plugin, 
+               x1 + title->get_w() + 10 + global_range_w->get_w(), 
+               y,
+               &plugin->config.global_range_h));
+
+       y += 50;
+       add_subwindow(title = new BC_Title(x1, 
+               y, 
+               _("Object size:\n(W/H Percent of image)")));
+       add_subwindow(global_block_w = new FindObjectBlockSize(plugin, 
+               x1 + title->get_w() + 10, 
+               y,
+               &plugin->config.global_block_w));
+       add_subwindow(global_block_h = new FindObjectBlockSize(plugin, 
+               x1 + title->get_w() + 10 + global_block_w->get_w(), 
+               y,
+               &plugin->config.global_block_h));
+
+       y += 40;
+       add_subwindow(title = new BC_Title(x, y + 10, _("Block X:")));
+       add_subwindow(block_x = new FindObjectBlockCenter(plugin, 
+               this, 
+               x + title->get_w() + 10, 
+               y,
+               &plugin->config.block_x));
+       add_subwindow(block_x_text = new FindObjectBlockCenterText(plugin, 
+               this, 
+               x + title->get_w() + 10 + block_x->get_w() + 10, 
+               y + 10,
+               &plugin->config.block_x));
+       block_x->center_text = block_x_text;
+       block_x_text->center = block_x;
+
+       y += 40;
+       add_subwindow(title = new BC_Title(x, y + 10, _("Block Y:")));
+       add_subwindow(block_y = new FindObjectBlockCenter(plugin, 
+               this, 
+               x + title->get_w() + 10, 
+               y,
+               &plugin->config.block_y));
+       add_subwindow(block_y_text = new FindObjectBlockCenterText(plugin, 
+               this, 
+               x + title->get_w() + 10 + block_y->get_w() + 10, 
+               y + 10,
+               &plugin->config.block_y));
+       block_y->center_text = block_y_text;
+       block_y_text->center = block_y;
+
+
+       y += 40;
+       add_subwindow(draw_keypoints = new FindObjectDrawKeypoints(plugin,
+               this,
+               x,
+               y));
+
+       y += draw_keypoints->get_h() + plugin->get_theme()->widget_border;
+       add_subwindow(draw_border = new FindObjectDrawBorder(plugin,
+               this,
+               x,
+               y));
+
+       y += draw_keypoints->get_h() + plugin->get_theme()->widget_border;
+       add_subwindow(replace_object = new FindObjectReplace(plugin,
+               this,
+               x,
+               y));
+
+       y += draw_keypoints->get_h() + plugin->get_theme()->widget_border;
+       add_subwindow(draw_object_border = new FindObjectDrawObjectBorder(plugin,
+               this,
+               x,
+               y));
+
+
+       y += draw_keypoints->get_h() + plugin->get_theme()->widget_border;
+       add_subwindow(title = new BC_Title(x, y, _("Object layer:")));
+       object_layer = new FindObjectLayer(plugin, 
+               this,
+               x + title->get_w() + 10, 
+               y,
+               &plugin->config.object_layer);
+       object_layer->create_objects();
+       y += object_layer->get_h() + plugin->get_theme()->widget_border;
+
+       add_subwindow(title = new BC_Title(x, y, _("Replacement object layer:")));
+       replace_layer = new FindObjectLayer(plugin, 
+               this,
+               x + title->get_w() + 10, 
+               y,
+               &plugin->config.replace_layer);
+       replace_layer->create_objects();
+       y += replace_layer->get_h() + plugin->get_theme()->widget_border;
+
+       add_subwindow(title = new BC_Title(x, y, _("Output/scene layer:")));
+       scene_layer = new FindObjectLayer(plugin, 
+               this,
+               x + title->get_w() + 10, 
+               y,
+               &plugin->config.scene_layer);
+       scene_layer->create_objects();
+       y += scene_layer->get_h() + plugin->get_theme()->widget_border;
+
+
+       add_subwindow(title = new BC_Title(x, y + 10, _("Object blend amount:")));
+       add_subwindow(blend = new FindObjectBlend(plugin, 
+               x + title->get_w() + plugin->get_theme()->widget_border, 
+               y,
+               &plugin->config.blend));
+       y += blend->get_h();
+
+
+       add_subwindow(title = new BC_Title(x, y + 10, _("Camshift VMIN:")));
+       add_subwindow(vmin = new FindObjectCamParam(plugin, 
+               x + title->get_w() + plugin->get_theme()->widget_border, 
+               y,
+               &plugin->config.vmin));
+       y += vmin->get_h() * 2 / 3;
+
+       add_subwindow(title = new BC_Title(x, y + 10, _("Camshift VMAX:")));
+       add_subwindow(vmax = new FindObjectCamParam(plugin, 
+               x + title->get_w() + vmin->get_w() + plugin->get_theme()->widget_border, 
+               y,
+               &plugin->config.vmax));
+       y += vmin->get_h() * 2 / 3;
+
+       add_subwindow(title = new BC_Title(x, y + 10, _("Camshift SMIN:")));
+       add_subwindow(smin = new FindObjectCamParam(plugin, 
+               x + title->get_w() + plugin->get_theme()->widget_border, 
+               y,
+               &plugin->config.smin));
+       y += vmin->get_h();
+
+
+
+       show_window(1);
+}
+
+
+
+
+
+
+
+FindObjectGlobalRange::FindObjectGlobalRange(FindObjectMain *plugin, 
+       int x, 
+       int y,
+       int *value)
+ : BC_IPot(x, 
+               y, 
+               (int64_t)*value,
+               (int64_t)MIN_RADIUS,
+               (int64_t)MAX_RADIUS)
+{
+       this->plugin = plugin;
+       this->value = value;
+}
+
+
+int FindObjectGlobalRange::handle_event()
+{
+       *value = (int)get_value();
+       plugin->send_configure_change();
+       return 1;
+}
+
+
+
+
+
+FindObjectBlockSize::FindObjectBlockSize(FindObjectMain *plugin, 
+       int x, 
+       int y,
+       float *value)
+ : BC_FPot(x, 
+               y, 
+               (float)*value,
+               (float)MIN_BLOCK,
+               (float)MAX_BLOCK)
+{
+       this->plugin = plugin;
+       this->value = value;
+       set_precision(0.1);
+}
+
+
+
+int FindObjectBlockSize::handle_event()
+{
+       *value = get_value();
+       plugin->send_configure_change();
+       return 1;
+}
+
+
+
+
+
+
+
+FindObjectBlockCenter::FindObjectBlockCenter(FindObjectMain *plugin, 
+       FindObjectWindow *gui,
+       int x, 
+       int y,
+       float *value)
+ : BC_FPot(x,
+       y,
+       *value,
+       (float)0, 
+       (float)100)
+{
+       this->plugin = plugin;
+       this->gui = gui;
+       this->value = value;
+       set_precision(0.1);
+}
+
+int FindObjectBlockCenter::handle_event()
+{
+       *value = get_value();
+       center_text->update(*value);
+       plugin->send_configure_change();
+       return 1;
+}
+
+
+
+
+
+
+FindObjectBlockCenterText::FindObjectBlockCenterText(FindObjectMain *plugin, 
+       FindObjectWindow *gui,
+       int x, 
+       int y,
+       float *value)
+ : BC_TextBox(x,
+       y,
+       75,
+       1,
+       *value)
+{
+       this->plugin = plugin;
+       this->gui = gui;
+       this->value = value;
+       set_precision(1);
+}
+
+int FindObjectBlockCenterText::handle_event()
+{
+       *value = atof(get_text());
+       center->update(*value);
+       plugin->send_configure_change();
+       return 1;
+}
+
+
+
+
+
+
+
+FindObjectDrawBorder::FindObjectDrawBorder(FindObjectMain *plugin, 
+       FindObjectWindow *gui,
+       int x, 
+       int y)
+ : BC_CheckBox(x,
+       y, 
+       plugin->config.draw_border,
+       _("Draw border"))
+{
+       this->gui = gui;
+       this->plugin = plugin;
+}
+
+int FindObjectDrawBorder::handle_event()
+{
+       plugin->config.draw_border = get_value();
+       plugin->send_configure_change();
+       return 1;
+}
+
+
+
+
+
+
+FindObjectDrawKeypoints::FindObjectDrawKeypoints(FindObjectMain *plugin, 
+       FindObjectWindow *gui,
+       int x, 
+       int y)
+ : BC_CheckBox(x,
+       y, 
+       plugin->config.draw_keypoints,
+       _("Draw keypoints"))
+{
+       this->gui = gui;
+       this->plugin = plugin;
+}
+
+int FindObjectDrawKeypoints::handle_event()
+{
+       plugin->config.draw_keypoints = get_value();
+       plugin->send_configure_change();
+       return 1;
+}
+
+
+
+
+FindObjectReplace::FindObjectReplace(FindObjectMain *plugin, 
+       FindObjectWindow *gui,
+       int x, 
+       int y)
+ : BC_CheckBox(x,
+       y, 
+       plugin->config.replace_object,
+       _("Replace object"))
+{
+       this->gui = gui;
+       this->plugin = plugin;
+}
+
+int FindObjectReplace::handle_event()
+{
+       plugin->config.replace_object = get_value();
+       plugin->send_configure_change();
+       return 1;
+}
+
+
+
+
+
+
+FindObjectDrawObjectBorder::FindObjectDrawObjectBorder(FindObjectMain *plugin, 
+       FindObjectWindow *gui,
+       int x, 
+       int y)
+ : BC_CheckBox(x,
+       y, 
+       plugin->config.draw_object_border,
+       _("Draw object border"))
+{
+       this->gui = gui;
+       this->plugin = plugin;
+}
+
+int FindObjectDrawObjectBorder::handle_event()
+{
+       plugin->config.draw_object_border = get_value();
+       plugin->send_configure_change();
+       return 1;
+}
+
+
+
+
+
+
+FindObjectLayer::FindObjectLayer(FindObjectMain *plugin, 
+       FindObjectWindow *gui, 
+       int x, 
+       int y,
+       int *value)
+ : BC_TumbleTextBox(gui,
+       *value,
+       MIN_LAYER,
+       MAX_LAYER,
+       x, 
+       y, 
+       calculate_w(gui))
+{
+       this->plugin = plugin;
+       this->gui = gui;
+       this->value = value;
+}
+
+int FindObjectLayer::handle_event()
+{
+       *value = atoi(get_text());
+       plugin->send_configure_change();
+       return 1;
+}
+
+int FindObjectLayer::calculate_w(FindObjectWindow *gui)
+{
+       int result = 0;
+       result = gui->get_text_width(MEDIUMFONT, "000");
+       return result + 50;
+}
+
+
+
+
+
+
+
+
+FindObjectAlgorithm::FindObjectAlgorithm(FindObjectMain *plugin, FindObjectWindow *gui, int x, int y)
+ : BC_PopupMenu(x, 
+       y, 
+       calculate_w(gui),
+       to_text(plugin->config.algorithm))
+{
+       this->plugin = plugin;
+       this->gui = gui;
+}
+
+int FindObjectAlgorithm::handle_event()
+{
+       plugin->config.algorithm = from_text(get_text());
+       plugin->send_configure_change();
+       return 1;
+}
+
+void FindObjectAlgorithm::create_objects()
+{
+       add_item(new BC_MenuItem(to_text(NO_ALGORITHM)));
+#if HAVE_OPENCV_SURF
+       add_item(new BC_MenuItem(to_text(ALGORITHM_SURF)));
+#endif
+       add_item(new BC_MenuItem(to_text(ALGORITHM_CAMSHIFT)));
+       add_item(new BC_MenuItem(to_text(ALGORITHM_BLOB)));
+}
+
+int FindObjectAlgorithm::from_text(char *text)
+{
+       if(!strcmp(text, _("Don't Calculate"))) return NO_ALGORITHM;
+#if HAVE_OPENCV_SURF
+       if(!strcmp(text, _("SURF"))) return ALGORITHM_SURF;
+#endif
+       if(!strcmp(text, _("CAMSHIFT"))) return ALGORITHM_CAMSHIFT;
+       if(!strcmp(text, _("Blob"))) return ALGORITHM_BLOB;
+       return ALGORITHM_CAMSHIFT;
+}
+
+char* FindObjectAlgorithm::to_text(int mode)
+{
+       switch(mode)
+       {
+               case NO_ALGORITHM:
+                       return _("Don't Calculate");
+#if HAVE_OPENCV_SURF
+               case ALGORITHM_SURF:
+                       return _("SURF");
+#endif
+               case ALGORITHM_BLOB:
+                       return _("Blob");
+               case ALGORITHM_CAMSHIFT:
+                       break;
+       }
+       return _("CAMSHIFT");
+}
+
+int FindObjectAlgorithm::calculate_w(FindObjectWindow *gui)
+{
+       int result = 0;
+       result = MAX(result, gui->get_text_width(MEDIUMFONT, to_text(NO_ALGORITHM)));
+#if HAVE_OPENCV_SURF
+       result = MAX(result, gui->get_text_width(MEDIUMFONT, to_text(ALGORITHM_SURF)));
+#endif
+       result = MAX(result, gui->get_text_width(MEDIUMFONT, to_text(ALGORITHM_CAMSHIFT)));
+       result = MAX(result, gui->get_text_width(MEDIUMFONT, to_text(ALGORITHM_BLOB)));
+       return result + 50;
+}
+
+
+
+
+
+
+
+
+FindObjectCamParam::FindObjectCamParam(FindObjectMain *plugin, 
+       int x, 
+       int y,
+       int *value)
+ : BC_IPot(x, 
+               y, 
+               (int64_t)*value,
+               (int64_t)MIN_CAMSHIFT,
+               (int64_t)MAX_CAMSHIFT)
+{
+       this->plugin = plugin;
+       this->value = value;
+}
+
+
+int FindObjectCamParam::handle_event()
+{
+       *value = (int)get_value();
+       plugin->send_configure_change();
+       return 1;
+}
+
+
+
+
+
+
+
+
+FindObjectBlend::FindObjectBlend(FindObjectMain *plugin, 
+       int x, 
+       int y,
+       int *value)
+ : BC_IPot(x, 
+               y, 
+               (int64_t)*value,
+               (int64_t)MIN_BLEND,
+               (int64_t)MAX_BLEND)
+{
+       this->plugin = plugin;
+       this->value = value;
+}
+
+
+int FindObjectBlend::handle_event()
+{
+       *value = (int)get_value();
+       plugin->send_configure_change();
+       return 1;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+