⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 svm.cpp

📁 使用支持向量机(svm)方法进行图像的单视度量(single view metrology)的vc++(需要用到wxwindows2.4.2)和matlab源代码.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "wx/wxprec.h"

#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif

#include "wx/image.h"
#include "wx/file.h"
#include "wx/statline.h"
#include "measurement.cpp"

wxFile *logFile;
// fileok betolteset jelzo flagek
bool imageLoaded = false, vpLoaded = false, addingVPs = false;
// kep meretei
int width,height;
// vanishing pointok szama
int vpCount = 0;
// vanishing pointok
long **vanishingPoints = NULL;
// kivalasztott 2 vp
long selectedVP[2][2] = { {-1,-1} , {-1,-1} };
// referencia objektum merete
float refSize = -1.0;
// referencia objektum
long refObject[2][2] = { {-1,-1} , {-1,-1} };
// egerrel kivalasztott aktualis vonal
int mouseLine[2][2] = { {-1,-1} , {-1,-1} };

// ----------------------------------------------------------------------------
// SvmApp - az alkalmazashoz tartozo osztaly
// ----------------------------------------------------------------------------

class SvmApp: public wxApp {
	// ez hivodik meg az alkalmazas indulasakor
	virtual bool OnInit();
};


// ----------------------------------------------------------------------------
// BitmapCanvas - a MainPanel tartalma, a megjelenitest vegzi
// ----------------------------------------------------------------------------

class BitmapCanvas : public wxScrolledWindow {
public:
	// konstruktorok
	BitmapCanvas(wxWindow *parent, const wxSize& size);
	// a bitmapet rendeli hozza az ablakhoz
	void SetBitmap(const wxBitmap& bitmap);
	// bitmapet adja vissza
	wxBitmap* GetBitmap();
	// a kep megjelenitese
	void OnPaint(wxPaintEvent& event);
	// eger kezeles
	void OnMouseUp(wxMouseEvent& event);
	void OnMouseDown(wxMouseEvent& event);
	void OnMouseMove(wxMouseEvent& event);
protected:
	// esemenytabla (az OnPainthez)
	DECLARE_EVENT_TABLE()
private:
	// eger lenyomasat jelzo flag
	bool mouseDown;
	// kezdeti uzenet
	wxStaticText *labelWarning;
	// a bitmap
	wxBitmap m_bitmap;
};

// ----------------------------------------------------------------------------
// RadioWindow - a MainPanel tartalma, a radio gombokat tartalmazza
// ----------------------------------------------------------------------------

class RadioWindow : public wxScrolledWindow {
public:
	// konstruktorok
	RadioWindow(wxWindow *parent, const wxSize& size);
	// radio gombok epitese
	void CreateContent(const char* vpFileName, int x, int y);
	// radio gomb megnyomasakor hivodik meg
	void OnRadio1(wxCommandEvent& event);
	void OnRadio2(wxCommandEvent& event);
protected:
	DECLARE_EVENT_TABLE()
private:
	// kezdeti szoveg
	wxStaticText *labelWarning;
	// radio boxok
	wxRadioBox *radioBox1;
	wxRadioBox *radioBox2;

	enum {
		RADIO_1 = 1,
		RADIO_2,
	};
};

// ----------------------------------------------------------------------------
// ControlWindow - a MainPanel tartalma, fo kezelo szerveket tartalmazza
// ----------------------------------------------------------------------------

class ControlWindow : public wxPanel {
public:
	// konstruktorok
	ControlWindow(wxWindow *parent, const wxSize& size);
	// esemenykezelok
	void OnTextRefsize(wxCommandEvent& event);
	void OnBtnStartAdd(wxCommandEvent& event);
	void OnBtnStopAdd(wxCommandEvent& event);
	void OnBtnDefref(wxCommandEvent& event);
	void OnBtnMeasure(wxCommandEvent& event);
	// gombokat aktivalja ha lehetseges, egyebkent deaktivalja
	void EnableBtns();
	// get fuggvenyek
	wxButton* GetBtnMeasure();
	wxButton* GetBtnDefref();
protected:
	DECLARE_EVENT_TABLE()
private:
	wxTextCtrl *textRefsize, *textResult;
	wxButton *btnDefref, *btnMeasure, *btnStartAdd, *btnStopAdd;

	enum {
		TEXT_REFSIZE = 11,
		TEXT_RESULT,
		BTN_STARTADD,
		BTN_STOPADD,
		BTN_DEFREF,
		BTN_MEASURE,
	};
};

// ----------------------------------------------------------------------------
// MainPanel - foablak tartalma
// ----------------------------------------------------------------------------

class MainPanel: public wxPanel {
public:
	// konstruktor
	MainPanel(wxFrame *parent);
	// get fuggvenyek
	BitmapCanvas* GetCanvas();
	RadioWindow* GetRadioWindow();
	ControlWindow* GetControlWindow();
private:
	BitmapCanvas *canvas;
	RadioWindow *radioWindow;
	ControlWindow *controlWindow;
};

// ----------------------------------------------------------------------------
// MainFrame - foablak
// ----------------------------------------------------------------------------

class MainFrame: public wxFrame {
public:
	// konstruktor
	MainFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
	// a Kep Megnyitasa menure kattintva hivodik meg
	void OnOpenImage(wxCommandEvent& event);
	// a VP File Megnyitasa menure kattintva hivodik meg
	void OnOpenVp(wxCommandEvent& event);
	// a Kilepes menure kattintva hivodik meg
	void OnQuit(wxCommandEvent& event);
	// a Nevjegy menure kattintva hivodik meg
	void OnAbout(wxCommandEvent& event);
	// menu epitese
	void MenuBuild(int open);
protected:
	DECLARE_EVENT_TABLE()
private:
	wxMenuBar *menuBar;
	wxMenu *fileMenu, *infoMenu;
	MainPanel *mainPanel;
	wxImage image;

	enum {
		MENU_IMAGE_OPEN = 21,
		MENU_VPFILE_OPEN,
		MENU_FILE_QUIT,
		MENU_INFO_ABOUT,
	};
};

// ----------------------------------------------------------------------------
// VPFIleReader - Vanishing Point fileok beolvasasara
// ----------------------------------------------------------------------------

class VPFileReader {
public:
	// konstruktor, destruktor
	VPFileReader(const char *vpFileName);
	~VPFileReader();
	// beolvasas
	void ReadVPFile();
private:
	char *vpFileName;
	wxFile *vpFile;
};


// az esemenytablak (esemenyekhez fuggvenyeket rendel hozza)

BEGIN_EVENT_TABLE(BitmapCanvas, wxScrolledWindow)
	EVT_PAINT(BitmapCanvas::OnPaint)
	EVT_LEFT_DOWN(BitmapCanvas::OnMouseDown)
	EVT_LEFT_UP(BitmapCanvas::OnMouseUp)
	EVT_MOTION(BitmapCanvas::OnMouseMove)
END_EVENT_TABLE()

BEGIN_EVENT_TABLE(RadioWindow, wxScrolledWindow)
	EVT_RADIOBOX(RADIO_1, RadioWindow::OnRadio1)
	EVT_RADIOBOX(RADIO_2, RadioWindow::OnRadio2)
END_EVENT_TABLE()

BEGIN_EVENT_TABLE(ControlWindow, wxPanel)
	EVT_TEXT(TEXT_REFSIZE, ControlWindow::OnTextRefsize)
	EVT_BUTTON(BTN_STARTADD, ControlWindow::OnBtnStartAdd)
	EVT_BUTTON(BTN_STOPADD, ControlWindow::OnBtnStopAdd)
	EVT_BUTTON(BTN_DEFREF, ControlWindow::OnBtnDefref)
	EVT_BUTTON(BTN_MEASURE, ControlWindow::OnBtnMeasure)
END_EVENT_TABLE()

BEGIN_EVENT_TABLE(MainFrame, wxFrame)
	EVT_MENU(MENU_IMAGE_OPEN, MainFrame::OnOpenImage)
	EVT_MENU(MENU_VPFILE_OPEN, MainFrame::OnOpenVp)
	EVT_MENU(MENU_FILE_QUIT, MainFrame::OnQuit)
	EVT_MENU(MENU_INFO_ABOUT, MainFrame::OnAbout)
END_EVENT_TABLE()


// ============================================================================
// ============================================================================




// ----------------------------------------------------------------------------
// SvmApp
// ----------------------------------------------------------------------------

IMPLEMENT_APP(SvmApp)

bool SvmApp::OnInit() {
	// foablak letrehozasa
	MainFrame *frame = new MainFrame( "Svm", wxPoint(0,0), wxSize(1024,640) );
	// es megmutatasa
	frame->Show( true );
	SetTopWindow( frame );
	return true;
}



// ----------------------------------------------------------------------------
// BitmapCanvas
// ----------------------------------------------------------------------------

BitmapCanvas::BitmapCanvas(wxWindow *parent, const wxSize& size) : wxScrolledWindow(parent, -1, wxDefaultPosition, size) {
	mouseDown = false;

	// az ablak letrehozasa
	wxBoxSizer *mainSizer = new wxBoxSizer(wxVERTICAL);

	labelWarning = new wxStaticText(this,-1,"No image file opened!");
	mainSizer->Add(labelWarning, 0, wxTOP | wxALIGN_CENTER, 50);

	// a sizer beallitasa
	SetSizer(mainSizer);
}

void BitmapCanvas::SetBitmap(const wxBitmap& bitmap) {
	// ablak torlese
	if (!imageLoaded) labelWarning->Destroy();
	// a bitmap betoltese
	m_bitmap = bitmap;
	imageLoaded = true;
	// a scrollbar meretenek es leptekenek beallitasa
	SetScrollbars(10, 10,m_bitmap.GetWidth() / 10, m_bitmap.GetHeight() / 10);
	// frissites
	Refresh(true);
	Update();
}

wxBitmap* BitmapCanvas::GetBitmap() {
	return &m_bitmap;
}

void BitmapCanvas::OnPaint(wxPaintEvent& event) {
	// device context letrehozasa es hozzarendelese az ablakhoz
	wxPaintDC dc(this);
	PrepareDC(dc);
	// a kep megjelenitese
	if (m_bitmap.Ok()) {
		dc.DrawBitmap(m_bitmap, 0, 0);
	}

	// ha van megadva ref. obj. akkor azt is kirajzolja
	if (!((refObject[0][0] == -1) || (refObject[1][0] == -1) || (refObject[0][1] == -1) || (refObject[1][1] == -1) || (refSize == -1.0))) {
		dc.SetPen(*wxRED_PEN);
		dc.DrawLine(refObject[0][0],refObject[0][1],refObject[1][0],refObject[1][1]);
		dc.SetPen(wxPen(wxColour(255,100,100),1,wxSOLID));
		dc.DrawLine(refObject[0][0]-3,refObject[0][1]-3,refObject[0][0]+3,refObject[0][1]+3);
		dc.DrawLine(refObject[0][0]+3,refObject[0][1]-3,refObject[0][0]-3,refObject[0][1]+3);
		dc.DrawLine(refObject[1][0]-3,refObject[1][1]-3,refObject[1][0]+3,refObject[1][1]+3);
		dc.DrawLine(refObject[1][0]+3,refObject[1][1]-3,refObject[1][0]-3,refObject[1][1]+3);
	}

	// vanishing pointok kirajzolasa
	if ((selectedVP[0][0] >= 0) && (selectedVP[0][0] < width) && (selectedVP[0][1] >= 0) && (selectedVP[0][1] < height) && (imageLoaded)) {
		dc.SetPen(wxPen(wxColour(0,255,100),3,wxSOLID));
		dc.DrawLine(selectedVP[0][0]-3,selectedVP[0][1]-3,selectedVP[0][0]+3,selectedVP[0][1]+3);
		dc.DrawLine(selectedVP[0][0]+3,selectedVP[0][1]-3,selectedVP[0][0]-3,selectedVP[0][1]+3);
	}
	if ((selectedVP[1][0] >= 0) && (selectedVP[1][0] < width) && (selectedVP[1][1] >= 0) && (selectedVP[1][1] < height) && (imageLoaded)) {
		dc.SetPen(wxPen(wxColour(0,255,100),3,wxSOLID));
		dc.DrawLine(selectedVP[1][0]-3,selectedVP[1][1]-3,selectedVP[1][0]+3,selectedVP[1][1]+3);
		dc.DrawLine(selectedVP[1][0]+3,selectedVP[1][1]-3,selectedVP[1][0]-3,selectedVP[1][1]+3);
	}
	// vanishing line kirajzolasa
	if ((selectedVP[0][0] != -1) && (selectedVP[0][1] != -1) && (selectedVP[1][0] != -1) && (selectedVP[1][1] != -1)) {
		int x1 = selectedVP[0][0];
		int y1 = selectedVP[0][1];
		int x2 = selectedVP[1][0];
		int y2 = selectedVP[1][1];

		// megcsereli a ket pontot ha az elso x koordinataja nagyobb
		if (x1 > x2) { int tmp=x1; x1=x2; x2=tmp; tmp=y1; y1=y2; y2=tmp;}

		int X1=x1, Y1=y1, X2=x2, Y2=y2;
		
		// addig huzza szet a vanishing point szakaszat amig nem megy vegig a kepen
		if (!((x1==x2) && (y1==y2))) {
			while (x1>0)		{ x1-=(X2-X1); y1-=(Y2-Y1); }
			while (x2<width)	{ x2+=(X2-X1); y2+=(Y2-Y1); }
		}

//		logFile->Write(wxString::Format(_T("x1:%d y1:%d,  x2:%d y2:%d\n"),x1,y1,x2,y2));
//		logFile->Write(wxString::Format(_T("X1:%d Y1:%d,  X2:%d Y2:%d\n"),X1,Y1,X2,Y2));
//		logFile->Write(wxString::Format(_T("X2-X1:%d Y2-Y1:%d\n"),X2-X1,Y2-Y1));
		dc.SetPen(wxPen(wxColour(0,192,100),2,wxSOLID));
		dc.DrawLine(x1,y1,x2,y2);
	}
	
	// eger altal kijelolt vonal kirajzolasa
	if (!((mouseLine[0][0] == -1) || (mouseLine[1][0] == -1) || (mouseLine[0][1] == -1) || (mouseLine[1][1] == -1))) {
		dc.SetPen(wxPen(wxColour(0,128,210),1,wxSOLID));
		dc.DrawLine(mouseLine[0][0], mouseLine[0][1], mouseLine[1][0], mouseLine[1][1]);
	}
}

void BitmapCanvas::OnMouseDown(wxMouseEvent& event) {
	if (!addingVPs) {
		mouseDown = true;
		
		int x,y;
		CalcUnscrolledPosition(event.GetX(),event.GetY(),&x,&y);
		mouseLine[0][0] = x;
		mouseLine[0][1] = y;
//	logFile->Write(wxString::Format(_T("+ Down: %d %d\n"),mouseLine[0][0],mouseLine[0][1]));
	}
}

void BitmapCanvas::OnMouseUp(wxMouseEvent& event) {
	int x,y;
	CalcUnscrolledPosition(event.GetX(),event.GetY(),&x,&y);

	if (!addingVPs) {
		mouseDown = false;
		
		mouseLine[1][0] = x;
		mouseLine[1][1] = y;
	//	logFile->Write(wxString::Format(_T("- Up: %d %d\n"),mouseLine[1][0],mouseLine[1][1]));
		// ablak tartalmanak frissitese
		Refresh();
		// defref gomb aktivalasa ha lehetseges
		((MainPanel*)GetParent())->GetControlWindow()->EnableBtns();
	} else {
		((MainPanel*)GetParent())->GetRadioWindow()->CreateContent(NULL,x,y);
	}
}

void BitmapCanvas::OnMouseMove(wxMouseEvent& event) {
	int x,y;
	CalcUnscrolledPosition(event.GetX(),event.GetY(),&x,&y);
	((MainFrame*)(GetParent()->GetParent()))->SetStatusText(wxString::Format(_T("%d,%d"),x,y), 4);

	if (mouseDown) {
		mouseLine[1][0] = x;
		mouseLine[1][1] = y;
		// ablak tartalmanak frissitese
		Refresh();
//		logFile->Write(wxString::Format(_T("\tMove: %d %d\n"),mouseLine[1][0],mouseLine[1][1]));
	}
}

// ----------------------------------------------------------------------------
// RadioWindow
// ----------------------------------------------------------------------------

RadioWindow::RadioWindow(wxWindow *parent, const wxSize& size) : wxScrolledWindow(parent, -1, wxDefaultPosition, size, wxSTATIC_BORDER) {
	// az ablak letrehozasa
	wxBoxSizer *mainSizer = new wxBoxSizer(wxVERTICAL);

	labelWarning = new wxStaticText(this,-1,"No Vanishing Points file opened!");
	mainSizer->Add(labelWarning, 0, wxTOP | wxALIGN_CENTER, 50);

	// a sizer beallitasa
	SetSizer(mainSizer);
}

void RadioWindow::CreateContent(const char* vpFileName, int x, int y) {
	// ablak torlese
	if (!vpLoaded) labelWarning->Destroy();
	else {
		radioBox1->Destroy();
		radioBox2->Destroy();
	}

	if ((x==0) && (y==0)) { // ha file-t toltunk be
		// VP file beolvasasa
		VPFileReader *vpReader = new VPFileReader(vpFileName);
		vpReader->ReadVPFile();
		delete vpReader;
	} else { // ha kezzel adunk meg vp-t
		vpCount++;

		// uj lista keszitese

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -