26 #include <Base/Common/BIASpragmaStart.hh>
29 #include <Gui/ImageCanvasCheckerboardExtract.hh>
30 #include <Base/Image/Image.hh>
31 #include <Base/Image/ImageIO.hh>
32 #include <Base/Image/ImageConvert.hh>
33 #include <FeatureDetector/CheckerboardDetector.hh>
37 #include <Utils/Param.hh>
42 #include "Base/Common/getopt_W32.h"
48 #define PARAM_FILE_NAME "checkerboard.param"
71 class CheckerBoardExtractApp:
public wxApp
73 virtual bool OnInit();
81 CheckerBoardExtractFrame(
const wxString& title,
const wxPoint& pos,
const wxSize& size);
82 virtual ~CheckerBoardExtractFrame();
85 int Init(
int argc,
char* argv[]);
87 void CheckerboardSelected(std::vector<BIAS::HomgPoint2D> & corners,
bool bOnlyFourPointsGiven);
90 void OnNext(wxCommandEvent& event);
91 void OnPrev(wxCommandEvent& event);
92 void OnSave(wxCommandEvent& event);
93 void OnHelp(wxCommandEvent& event);
94 void ShowText(
const string text,
int slot);
98 string MatlabFilename_;
102 std::vector<std::string> fileNames_;
103 vector<vector<BIAS::HomgPoint2D> > allCoords_;
105 unsigned int imageNumber_;
106 wxFlexGridSizer *Sizer_;
108 DECLARE_EVENT_TABLE()
113 DECLARE_APP(CheckerBoardExtractApp)
116 IMPLEMENT_APP(CheckerBoardExtractApp )
118 bool CheckerBoardExtractApp::OnInit()
120 CheckerBoardExtractFrame *frame_;
121 frame_ =
new CheckerBoardExtractFrame(wxT(
"CheckerBoardExtract"), wxPoint(50,50),
132 frame_->HandleImage();
133 SetTopWindow(frame_);
138 CheckerBoardExtractFrame::
139 CheckerBoardExtractFrame(
const wxString& title,
const wxPoint& pos,
const wxSize& size):
140 wxFrame((wxFrame *)NULL, -1, title, pos, size)
143 Sizer_ =
new wxFlexGridSizer(1,2,0,0);
144 Sizer_->AddGrowableCol(0);
145 Sizer_->AddGrowableRow(0);
148 wxDefaultPosition, wxSize(640,480));
150 wxSize buttonSize(65,30);
152 wxToolBar* toolBar = CreateToolBar();
153 wxButton *pBNext=
new wxButton(toolBar,
ID_Next, wxT(
"Next"),wxDefaultPosition,buttonSize);
154 wxButton *pBPrev=
new wxButton(toolBar,
ID_Prev, wxT(
"Previous"),wxDefaultPosition,buttonSize);
155 wxButton *pBSave=
new wxButton(toolBar,
ID_Save, wxT(
"Save"),wxDefaultPosition,buttonSize);
156 wxButton *pBHelp=
new wxButton(toolBar,
ID_Help, wxT(
"Help"),wxDefaultPosition,buttonSize);
158 toolBar->AddControl(pBPrev);
159 toolBar->AddControl(pBNext);
160 toolBar->AddControl(pBSave);
161 toolBar->AddControl(pBHelp);
165 Sizer_->Add(ic_,0,wxALL|wxEXPAND, 5);
168 SetMinSize(wxSize(700,550));
173 CheckerBoardExtractFrame::
174 ~CheckerBoardExtractFrame(){
182 void CheckerBoardExtractFrame::
183 OnNext(wxCommandEvent& event){
184 if(imageNumber_ < fileNames_.size()-1 && bImageDone_){
188 else if(imageNumber_ == fileNames_.size()-1){
189 string message =
"Done! Now save the corners.";
191 wxT(
"Detector"), wxOK ,
this);
195 ShowText(
"Select Corners!",0);
198 void CheckerBoardExtractFrame::
199 OnPrev(wxCommandEvent& event){
200 if(imageNumber_ >=1 && bImageDone_){
205 ShowText(
"Select Corners!",0);
208 void CheckerBoardExtractFrame::
209 OnSave(wxCommandEvent& event){
213 void CheckerBoardExtractFrame::
214 OnHelp(wxCommandEvent& event){
216 message =
"This is the MIP checkerboard detector utility.\n It can be used in combination with Scaramuzza's OcamCalib.\n\nCorner Selection:\nIf the corners are not selected automatically\nselect them ROWISE, starting in the top left corner.\nAfter selecting all corners in one image press \"Next\".\n\nFinally save the corners, pressing \"Save\".";
219 wxT(
"Detector"), wxOK ,
this);
223 void CheckerBoardExtractFrame::
226 cout <<
"Usage: biasextractcheckerboardWX -f Filename.m -x xnum -y ynum -d image1 image2 ..."<<endl
228 cout <<
" The tool tries to find checkerboards in the input images" << endl
229 <<
" finds corners also in fisheye distorted images and " << endl
230 <<
" writes these to the Matlab file 'Filename.m'." << endl
231 <<
" xnum and ynum are the number of the checkerboards inner corners."
233 <<
" -d writes debug images." << endl
234 <<
" Do not use .mip images since Matlab is unable to read them." << endl
239 int CheckerBoardExtractFrame::
240 Init(
int argc,
char* argv[])
242 MatlabFilename_ =
"ExtractedCorners.m";
245 bWriteDebug_ =
false;
248 int *xc = AddParamInt(
"xCorners",
249 "Number of Corners in x direction", 7);
250 int *yc = AddParamInt(
"yCorners",
251 "Number of Corners in y direction", 4);
252 string *imageList = AddParamString(
"ImageList",
"List with images",
"");
255 UpdateParameter(argc, argv, PARAM_FILE_NAME);
259 Param::ParseListFile(*imageList,fileNames_);
260 allCoords_.resize(fileNames_.size());
263 ic_->SetPatternParameters( xCorners_, yCorners_);
268 void CheckerBoardExtractFrame::
276 ImageConvert::ConvertST(image, imageUC, ImageBase::ST_unsignedchar);
287 ic_->Show(imageUC,
"Select");
289 ic_->SetPatternParameters (xCorners_,yCorners_);
290 ic_->SelectCheckerboardCorners(*
this,
true,
false);
294 void CheckerBoardExtractFrame::
295 CheckerboardSelected(std::vector<BIAS::HomgPoint2D> & corners,
bool bOnlyFourPointsGiven){
296 if(bOnlyFourPointsGiven){
297 ShowText(
"Only four points, this is invalid!",0);
301 allCoords_[imageNumber_].clear();
303 for(
unsigned int k=0;k< corners.size();k++){
304 allCoords_[imageNumber_].push_back(corners[k]);
306 ShowText(
"Checkerboard selected!",0);
311 void CheckerBoardExtractFrame::
315 wxFileDialog dialog(
this,wxT(
"Save Corners"),wxT(
""),wxT(
""),
316 wxT(
"Matlab (*.m)|*.m"),
317 wxFD_SAVE|wxFD_OVERWRITE_PROMPT);
318 int ret = dialog.ShowModal();
320 fileName = dialog.GetPath();
322 ofstream ofs(WxToAscii(fileName));
324 ofs <<
"numpoints = [" << xCorners_ <<
" " << yCorners_ <<
"];" << endl;
326 ofs <<
"imagenames = {";
327 for (
unsigned int i=0; i<fileNames_.size(); i++) {
328 ofs <<
"'" << fileNames_[i] <<
"' ";
333 for (
unsigned int i=0; i<allCoords_.size(); i++) {
334 for (
unsigned int j=0; j<allCoords_[i].size(); j++) {
335 ofs << (allCoords_[i][j])[0] <<
" ";
342 for (
unsigned int i=0; i<allCoords_.size(); i++) {
343 for (
unsigned int j=0; j<allCoords_[i].size(); j++) {
344 ofs << (allCoords_[i][j])[1] <<
" ";
355 void CheckerBoardExtractFrame::
356 ShowText(
const string text,
int slot){
357 if(GetStatusBar() != NULL)
358 GetStatusBar()->SetStatusText(
AsciiToWx(text),slot);
361 BEGIN_EVENT_TABLE(CheckerBoardExtractFrame, wxFrame)
362 EVT_BUTTON (ID_Next, CheckerBoardExtractFrame::OnNext)
363 EVT_BUTTON (ID_Prev, CheckerBoardExtractFrame::OnPrev)
364 EVT_BUTTON (ID_Save, CheckerBoardExtractFrame::OnSave)
365 EVT_BUTTON (ID_Help, CheckerBoardExtractFrame::OnHelp)
369 #include <Base/Common/BIASpragmaEnd.hh>
wxString AsciiToWx(const char *thestring)
Converts a C string to a wxString.
enum EColorModel GetColorModel() const
This class Param provides generic support for parameters.
callback interface for ImageCanvasCheckerBoardExtract
static int Load(const std::string &FileName, ImageBase &img)
first tries a call to Read MIP image and if that fails, tries to Import Image with all other availabl...
Class for converting an array of wxStrings to an array of non-const ASCII strings.
enum EStorageType GetStorageType() const
This is the base class for images in BIAS.
static int ToRGB(const Image< StorageType > &source, Image< StorageType > &dest)
Create a RGB converted copy of source image in this.
static int ToGrey(const ImageBase &source, ImageBase &dest)
wrapper for the templated function ToGrey