00001 00021 #include "descriptor_surface_based_trainer/Desc_Models_Dialog.h" 00022 #include "descriptor_surface_based_trainer/View_Creator_Dialog.h" 00023 #include "descriptor_surface_based_trainer/Create_Output_Files_Dialog.h" 00024 #include "descriptor_surface_based_trainer/Utils.h" 00025 #include "descriptor_surface_based_trainer/Main_Dialog.h" 00026 00027 00028 00029 void DescModelsDialog::resetGuiValues() 00030 { 00031 label_orientation_x_value->SetLabel(wxT("")); 00032 label_orientation_y_value->SetLabel(wxT("")); 00033 label_orientation_z_value->SetLabel(wxT("")); 00034 00035 label_axis_1_x_value->SetLabel(wxT("")); 00036 label_axis_1_y_value->SetLabel(wxT("")); 00037 label_axis_1_z_value->SetLabel(wxT("")); 00038 label_axis_1_angle_value->SetLabel(wxT("")); 00039 label_axis_2_x_value->SetLabel(wxT("")); 00040 label_axis_2_y_value->SetLabel(wxT("")); 00041 label_axis_2_z_value->SetLabel(wxT("")); 00042 label_axis_2_angle_value->SetLabel(wxT("")); 00043 00044 label_score_2D_value->SetLabel(wxT("")); 00045 label_use_color_value->SetLabel(wxT("")); 00046 label_invertible_value->SetLabel(wxT("")); 00047 00048 label_vertical_offset_value->SetLabel(wxT("")); 00049 label_horizontal_offset_value->SetLabel(wxT("")); 00050 label_depth_value->SetLabel(wxT("")); 00051 label_number_ferns_value->SetLabel(wxT("")); 00052 label_patch_size_value->SetLabel(wxT("")); 00053 label_min_scale_value->SetLabel(wxT("")); 00054 label_max_scale_value->SetLabel(wxT("")); 00055 00056 button_edit_model->Enable(false); 00057 00058 image->setImage(new wxBitmap(wxImage(300, 225))); 00059 image->paintNow(); 00060 } 00061 00062 std::vector<std::string> DescModelsDialog::getObjectParameters() 00063 { 00064 std::vector<std::string> params; 00065 params.push_back(name); 00066 params.push_back(object_model); 00067 params.push_back(mesh); 00068 params.push_back(rotation_type); 00069 params.push_back(orientation_x); 00070 params.push_back(orientation_y); 00071 params.push_back(orientation_z); 00072 params.push_back(diameter); 00073 params.push_back(score_3D); 00074 return params; 00075 } 00076 00077 std::vector<ViewParamsWrapper> DescModelsDialog::getViews() 00078 { 00079 return views; 00080 } 00081 00082 00083 00084 DescModelsDialog::DescModelsDialog(wxWindow* parent, std::string name, std::string object_model, std::string mesh, std::string rotation_type, std::string orientation_x, std::string orientation_y, std::string orientation_z, std::string diameter, std::string score_3D) 00085 : DescModelsDialogBase(parent), 00086 name(name), 00087 object_model(object_model), 00088 mesh(mesh), 00089 rotation_type(rotation_type), 00090 orientation_x(orientation_x), 00091 orientation_y(orientation_y), 00092 orientation_z(orientation_z), 00093 diameter(diameter), 00094 score_3D(score_3D) 00095 { 00096 button_edit_model->Enable(false); 00097 image->setImage(new wxBitmap(wxImage(300, 225))); 00098 image->paintNow(); 00099 } 00100 00101 void DescModelsDialog::OnDialogClose( wxCloseEvent& event ) 00102 { 00103 wxMessageDialog *dial = new wxMessageDialog(this, 00104 wxT("Are you sure to quit?"), wxT("Quit"), 00105 wxYES_NO | wxNO_DEFAULT | wxICON_QUESTION); 00106 if (dial->ShowModal() == wxID_YES) { 00107 Destroy(); 00108 } 00109 } 00110 00111 void DescModelsDialog::onAddModelClicked( wxCommandEvent& event ) 00112 { 00113 ViewParamsWrapper params(rotation_type); 00114 ViewCreatorDialog *descModelsDialog = new ViewCreatorDialog( (wxWindow*)NULL, ¶ms); 00115 if (descModelsDialog ->ShowModal() == wxID_SAVE) { 00116 if (params.getIsValid()) { 00117 list_box_views->Clear(); 00118 views.push_back(params); 00119 for (unsigned int i = 0; i < views.size(); i++) { 00120 std::string name = this->name + "_view_" + boost::lexical_cast<std::string>(i + 1); 00121 list_box_views->Insert(wxString(name.c_str(), wxConvUTF8), i); 00122 } 00123 resetGuiValues(); 00124 list_box_views->SetSelection(views.size() - 1, true); 00125 wxCommandEvent evt; 00126 onListBoxSelected(evt); 00127 00128 } 00129 } 00130 00131 00132 00133 } 00134 00135 void DescModelsDialog::onDeleteModelClicked( wxCommandEvent& event ) 00136 { 00137 if (list_box_views->GetSelection() >= 0) { 00138 views.erase(views.begin() + list_box_views->GetSelection()); 00139 list_box_views->Clear(); 00140 for (unsigned int i = 0; i < views.size(); i++) { 00141 std::string name = this->name + "_view_" + boost::lexical_cast<std::string>(i + 1); 00142 list_box_views->Insert(wxString(name.c_str(), wxConvUTF8), i); 00143 } 00144 resetGuiValues(); 00145 } 00146 } 00147 00148 void DescModelsDialog::onEditModelClicked(wxCommandEvent &event) 00149 { 00150 if (list_box_views->GetCount() > 0) { 00151 views.at(list_box_views->GetSelection()).clearBoundingBox(); 00152 ViewCreatorDialog *descModelsDialog = new ViewCreatorDialog( (wxWindow*)NULL, &(views.at(list_box_views->GetSelection()))); 00153 descModelsDialog ->ShowModal(); 00154 wxCommandEvent evt; 00155 onListBoxSelected(evt); 00156 } 00157 } 00158 00159 void DescModelsDialog::onCancelClicked( wxCommandEvent& event ) 00160 { 00161 wxMessageDialog *dial = new wxMessageDialog(this, 00162 wxT("Are you sure to quit?"), wxT("Quit"), 00163 wxYES_NO | wxNO_DEFAULT | wxICON_QUESTION); 00164 if (dial->ShowModal() == wxID_YES) { 00165 Destroy(); 00166 } 00167 } 00168 00169 00170 00171 void DescModelsDialog::onFinishClicked( wxCommandEvent& event ) 00172 { 00173 if (list_box_views->GetCount() > 0) { 00174 bool boxes_available = true; 00175 for (unsigned int i = 0; i < views.size(); i++) { 00176 if (!(views.at(i).getHasBoundingBox())) { 00177 boxes_available = false; 00178 break; 00179 } 00180 } 00181 if (boxes_available) { 00182 wxMessageDialog *dial = new wxMessageDialog(this, 00183 wxT("Do you want to create the object with the selected values? This can take several minutes depending on your parameters!"), wxT("Finish"), 00184 wxYES_NO | wxNO_DEFAULT | wxICON_QUESTION); 00185 if (dial->ShowModal() == wxID_YES) { 00186 CreateOutputFilesDialog *createOutputFilesDialog = new CreateOutputFilesDialog(this); 00187 if (createOutputFilesDialog->ShowModal() == wxID_OK) { 00188 wxMessageDialog *dial = new wxMessageDialog(this, 00189 wxT("All files successfully created!"), wxT("Success"), wxOK); 00190 dial->ShowModal(); 00191 Destroy(); 00192 } else { 00193 wxMessageDialog *dial = new wxMessageDialog(this, 00194 wxT("Not all files could be created, please check the logfile in the output folder for more information. End the program anyway?"), wxT("Warning"), 00195 wxYES_NO | wxNO_DEFAULT | wxICON_ERROR); 00196 if (dial->ShowModal() == wxID_YES) { 00197 Destroy(); 00198 } 00199 } 00200 } 00201 } else { 00202 wxMessageDialog *dial = new wxMessageDialog(this, 00203 wxT("Please create a bounding box for all views (Select them by clicking on the image panel; clockwise, starting with the top left corner)"), wxT("Warning"), wxOK | wxICON_WARNING); 00204 dial->ShowModal(); 00205 } 00206 } else { 00207 wxMessageDialog *dial = new wxMessageDialog(this, 00208 wxT("Please create at least one view!"), wxT("Warning"), wxOK | wxICON_WARNING); 00209 dial->ShowModal(); 00210 } 00211 00212 } 00213 00214 void DescModelsDialog::onBackClicked( wxCommandEvent& event ) 00215 { 00216 if (list_box_views->GetCount() > 0) { 00217 wxMessageDialog *dial = new wxMessageDialog(this, 00218 wxT("Your created views will be lost if you go back, continue anyway?"), wxT("Warning"), 00219 wxYES_NO | wxNO_DEFAULT | wxICON_WARNING); 00220 if (dial->ShowModal() != wxID_YES) { 00221 return; 00222 } 00223 } 00224 Main_Dialog *mainDialog = new Main_Dialog( (wxWindow*)NULL, name, object_model, mesh, rotation_type, orientation_x, orientation_y, orientation_z, diameter, score_3D); 00225 mainDialog ->Show(); 00226 Destroy(); 00227 00228 00229 } 00230 00231 00232 00233 void DescModelsDialog::onListBoxSelected(wxCommandEvent &event) 00234 { 00235 if (list_box_views->GetSelection() >= 0) { 00236 double orientation_x = views.at(list_box_views->GetSelection()).getOrientation()[0]; 00237 double orientation_y = views.at(list_box_views->GetSelection()).getOrientation()[1]; 00238 double orientation_z = views.at(list_box_views->GetSelection()).getOrientation()[2]; 00239 if (views.at(list_box_views->GetSelection()).getRotationType() == ROTATIONTYPE_SPHERE) { 00240 double axis_2_x = views.at(list_box_views->GetSelection()).getAxis2()[0]; 00241 double axis_2_y = views.at(list_box_views->GetSelection()).getAxis2()[1]; 00242 double axis_2_z = views.at(list_box_views->GetSelection()).getAxis2()[2]; 00243 double axis_2_angle = views.at(list_box_views->GetSelection()).getAxis2Angle(); 00244 label_axis_2_x_value->SetLabel(trimDoubleString(wxString::Format(wxT("%f"), axis_2_x))); 00245 label_axis_2_y_value->SetLabel(trimDoubleString(wxString::Format(wxT("%f"), axis_2_y))); 00246 label_axis_2_z_value->SetLabel(trimDoubleString(wxString::Format(wxT("%f"), axis_2_z))); 00247 label_axis_2_angle_value->SetLabel(trimDoubleString(wxString::Format(wxT("%f"), axis_2_angle))); 00248 } else { 00249 label_axis_2_x_value->SetLabel(wxT("-")); 00250 label_axis_2_y_value->SetLabel(wxT("-")); 00251 label_axis_2_z_value->SetLabel(wxT("-")); 00252 label_axis_2_angle_value->SetLabel(wxT("-")); 00253 } 00254 if (views.at(list_box_views->GetSelection()).getRotationType() != ROTATIONTYPE_NO_ROTATION) { 00255 double axis_1_x = views.at(list_box_views->GetSelection()).getAxis1()[0]; 00256 double axis_1_y = views.at(list_box_views->GetSelection()).getAxis1()[1]; 00257 double axis_1_z = views.at(list_box_views->GetSelection()).getAxis1()[2]; 00258 double axis_1_angle = views.at(list_box_views->GetSelection()).getAxis1Angle(); 00259 label_axis_1_x_value->SetLabel(trimDoubleString(wxString::Format(wxT("%f"), axis_1_x))); 00260 label_axis_1_y_value->SetLabel(trimDoubleString(wxString::Format(wxT("%f"), axis_1_y))); 00261 label_axis_1_z_value->SetLabel(trimDoubleString(wxString::Format(wxT("%f"), axis_1_z))); 00262 label_axis_1_angle_value->SetLabel(trimDoubleString(wxString::Format(wxT("%f"), axis_1_angle))); 00263 } else { 00264 label_axis_1_x_value->SetLabel(wxT("-")); 00265 label_axis_1_y_value->SetLabel(wxT("-")); 00266 label_axis_1_z_value->SetLabel(wxT("-")); 00267 label_axis_1_angle_value->SetLabel(wxT("-")); 00268 } 00269 double score_2D = views.at(list_box_views->GetSelection()).getScore2D(); 00270 bool use_color = views.at(list_box_views->GetSelection()).getUseColor(); 00271 bool is_invertible = views.at(list_box_views->GetSelection()).getIsInvertible(); 00272 int vertical_offset = views.at(list_box_views->GetSelection()).getVerticalOffset(); 00273 int horizontal_offset = views.at(list_box_views->GetSelection()).getHorizontalOffset(); 00274 int depth = views.at(list_box_views->GetSelection()).getDepth(); 00275 int number_ferns = views.at(list_box_views->GetSelection()).getNumberFerns(); 00276 int patch_size = views.at(list_box_views->GetSelection()).getPatchSize(); 00277 double min_scale = views.at(list_box_views->GetSelection()).getMinScale(); 00278 double max_scale = views.at(list_box_views->GetSelection()).getMaxScale(); 00279 00280 label_orientation_x_value->SetLabel(trimDoubleString(wxString::Format(wxT("%f"), orientation_x))); 00281 label_orientation_y_value->SetLabel(trimDoubleString(wxString::Format(wxT("%f"), orientation_y))); 00282 label_orientation_z_value->SetLabel(trimDoubleString(wxString::Format(wxT("%f"), orientation_z))); 00283 label_score_2D_value->SetLabel(trimDoubleString(wxString::Format(wxT("%f"), score_2D))); 00284 if (use_color) { 00285 label_use_color_value->SetLabel(wxT("Yes")); 00286 } else { 00287 label_use_color_value->SetLabel(wxT("No")); 00288 } 00289 if (is_invertible) { 00290 label_invertible_value->SetLabel(wxT("Yes")); 00291 } else { 00292 label_invertible_value->SetLabel(wxT("No")); 00293 } 00294 00295 label_vertical_offset_value->SetLabel(wxString::Format(wxT("%i"), vertical_offset)); 00296 label_horizontal_offset_value->SetLabel(wxString::Format(wxT("%i"), horizontal_offset)); 00297 label_depth_value->SetLabel(wxString::Format(wxT("%i"), depth)); 00298 label_number_ferns_value->SetLabel(wxString::Format(wxT("%i"), number_ferns)); 00299 label_patch_size_value->SetLabel(wxString::Format(wxT("%i"), patch_size)); 00300 label_min_scale_value->SetLabel(trimDoubleString(wxString::Format(wxT("%f"), min_scale))); 00301 label_max_scale_value->SetLabel(trimDoubleString(wxString::Format(wxT("%f"), max_scale))); 00302 00303 button_edit_model->Enable(true); 00304 image->setImage(createBitmap(drawBoundingBox(views.at(list_box_views->GetSelection()).getImage(), views.at(list_box_views->GetSelection()).getBoxCorners()), 300, 225)); 00305 image->paintNow(); 00306 00307 } 00308 00309 } 00310 00311 void DescModelsDialog::onImageClicked(wxMouseEvent &event) 00312 { 00313 int pos_x = event.GetX(); 00314 int pos_y = event.GetY(); 00315 00316 if ((pos_x > 0 && pos_x < 300) && (pos_y > 0 && pos_y < 225) && (list_box_views->GetSelection() >= 0)) { 00317 if (views.at(list_box_views->GetSelection()).getBoxCorners().size() == 4) { 00318 views.at(list_box_views->GetSelection()).clearBoundingBox(); 00319 } else { 00320 double pos_x_factor = pos_x / 300.0f; 00321 double pos_y_factor = pos_y / 225.0f; 00322 pos_x = (double)views.at(list_box_views->GetSelection()).getImage().Width() * pos_x_factor; 00323 pos_y = (double)views.at(list_box_views->GetSelection()).getImage().Height() * pos_y_factor; 00324 views.at(list_box_views->GetSelection()).addBoxCorner(Eigen::Vector2i(pos_x, pos_y)); 00325 if (views.at(list_box_views->GetSelection()).getBoxCorners().size() == 4) { 00326 views.at(list_box_views->GetSelection()).setHasBoundingBox(); 00327 } else { 00328 views.at(list_box_views->GetSelection()).setHasBoundingBox(false); 00329 } 00330 } 00331 00332 image->setImage(createBitmap(drawBoundingBox(views.at(list_box_views->GetSelection()).getImage(), views.at(list_box_views->GetSelection()).getBoxCorners()), 300, 225)); 00333 image->paintNow(); 00334 } 00335 } 00336 00337 void DescModelsDialog::onImageClickedRight(wxMouseEvent &event) 00338 { 00339 int pos_x = event.GetX(); 00340 int pos_y = event.GetY(); 00341 00342 if ((pos_x > 0 && pos_x < 300) && (pos_y > 0 && pos_y < 225) && (list_box_views->GetSelection() >= 0)) { 00343 views.at(list_box_views->GetSelection()).clearBoundingBox(); 00344 image->setImage(createBitmap(drawBoundingBox(views.at(list_box_views->GetSelection()).getImage(), views.at(list_box_views->GetSelection()).getBoxCorners()), 300, 225)); 00345 image->paintNow(); 00346 } 00347 }