-
Notifications
You must be signed in to change notification settings - Fork 16
/
Copy pathimgMatchView.cpp
1854 lines (1778 loc) · 54.4 KB
/
imgMatchView.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
// imgMatchView.cpp : implementation of the CImgMatchView class
#include "stdafx.h"
#include "imgMatch.h"
#include "MainFrm.h"
#include "imgMatchDoc.h"
#include "imgMatchView.h"
#include "AdvancedSet.h"
#include "imgPro.h"
#include "targetMatch.h"
#include "adaMachineLearning.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#ifdef _DEBUG
void CImgMatchView::AssertValid() const
{
CFormView::AssertValid();
}
void CImgMatchView::Dump(CDumpContext& dc) const
{
CFormView::Dump(dc);
}
CImgMatchDoc* CImgMatchView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CImgMatchDoc)));
return (CImgMatchDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CHelpDlg dialog used for App Help
class CHelpDlg : public CDialog
{
public:
CHelpDlg() : CDialog(CHelpDlg::IDD){};
enum { IDD = IDD_useHelp };
protected:
virtual void DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);};
};
/////////////////////////////////////////////////////////////////////////////
// CUpdateLogDlg dialog used for App UpdateLog
class CUpdateLogDlg : public CDialog
{
public:
CUpdateLogDlg();
enum { IDD = IDD_UpdateLog };
protected:
virtual void DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_Update_log, m_updateLog);
}
public:
CString m_updateLog;
};
CUpdateLogDlg::CUpdateLogDlg() : CDialog(CUpdateLogDlg::IDD)
{
m_updateLog = _T(
"-->v2.0 正式版:\r\n"
"1.修复数据库验证删除过程不彻底的bug\r\n"
"2.拖入文件后自动将软件最前端显示\r\n"
"3.小幅调整界面的布局\r\n"
"\r————————————————————————————————\r\n"
"\r\n"
"-->v1.5 正式版:\r\n"
"1.支持拖入文件到窗口完成载入,支持的格式有.jpg/.bmp/.png/.path/.epath\r\n"
"2.加入数据库存储,对预处理后的图片进行保存,可加速载入同一图片\r\n"
"3.修改首次打开检测方式\r\n"
"\r————————————————————————————————\r\n"
"\r\n"
"-->v1.4.1 测试版:\r\n"
"1.增加调整正负训练集所占权重的参数(正负平衡系数)\r\n"
"\r————————————————————————————————\r\n"
"\r\n"
"-->v1.4 正式版:\r\n"
"1.增加新特征 bias\r\n"
"2.根据正负训练集的数目自动调整所占权重\r\n"
"\r————————————————————————————————\r\n"
"\r\n"
"-->v1.3.3 测试版:\r\n"
"1.修改部分bug,提高稳定性\r\n"
"\r————————————————————————————————\r\n"
"\r\n"
"-->v1.3.2 测试版:\r\n"
"1.增加新特征,提高识别正确率\r\n"
"2.增加多线程并发处理,加快读取训练集和测试集的速度\r\n"
"\r————————————————————————————————\r\n"
"\r\n"
"-->v1.3.1 测试版:\r\n"
"1.增加进度显示功能\r\n"
"\r————————————————————————————————\r\n"
"\r\n"
"-->v1.3 正式版:\r\n"
"1.增加线程功能,询问是否停止时后台仍然继续演化\r\n"
"2.优化数据量较大时界面出现的假死状态\r\n"
"3.优化内存和CPU占用量\r\n"
"4.修复首次读取时偶尔会出错的bug\r\n"
"5.对用户操作做详细记录,方便意外崩溃情况下的问题分析\r\n"
"6.过滤运算过程中用户对窗口移动的操作,防止窗口绘制异常\r\n"
"————————————————————————————————\r\n"
"\r\n"
"-->v1.2.2 测试版:\r\n"
"1.增加对匹配结果的偏向性的调整功能(高级设置)\r\n"
"2.增加对选择模板演化时的系数调整功能(高级设置)\r\n"
"3.优化训练集和测试集与模板的匹配方式\r\n"
"————————————————————————————————\r\n"
"\r\n"
"-->v1.2.1 内测版:\r\n"
"1.增加保存和读取演化路径功能,可在下次继续进行相似匹配时跳过演化过程\r\n"
"2.增加对演化模板的列数修改(高级设置)\r\n"
"3.增加更新日志查看功能\r\n"
"4.优化测试结果显示方式:不同次载入的测试集分开显示,匹配过的不显示\r\n"
"————————————————————————————————\r\n"
"\r\n"
"-->v1.2 正式版:\r\n"
"1.增加载入多模板功能,降低了由于模板的特征局限性造成的系统误差\r\n"
"2.增加保存匹配结果的功能\r\n"
"3.增加高级设置选项,可以修改一些运行时内部参数,更加符合个性设置\r\n"
"4.增加对演化询问等待间隔时间和演化允许误差的修改(高级设置)\r\n"
"5.增加对历史操作中时间的记录,每一步操作都会记录操作时间\r\n"
"6.增加首次运行检测,首次打开该软件时会自动弹出使用说明\r\n"
"7.更改了界面背景图片,并把空间背景设置为透明,看起来更加自然\r\n"
"————————————————————————————————\r\n"
"\r\n"
"-->v1.1 正式版:\r\n"
"1.对界面布局进行大幅调整,将原本的菜单栏相应功能按先后顺序布局当窗口\r\n"
"2.操作和显示界面设计更加人性化,更符合普通用户的操作习惯\r\n"
"3.加入背景图片,界面做了美化\r\n"
"4.操作历史记录改成了向上刷新的显示方式\r\n"
"5.取消使用帮助中调用控制台的过程\r\n"
"6.增加对训练集和测试集解释说明的模块\r\n"
"————————————————————————————————\r\n"
"\r\n"
"-->v1.0 测试版:\r\n"
"1.此原始版本实现了简单的框架和主要功能,界面未做任何美化\r\n"
"2.功能全部整合到菜单栏\r\n"
"————————————————————————————————");
}
//////////////////////////////////////////////////////////////////////////
// chooseType dialog used for App ChooseType when drag files to the dialog
class CChooseType : public CDialog
{
public:
CChooseType() : CDialog(CChooseType::IDD), m_choosed(0){};
enum { IDD = IDD_ChooseType };
protected:
virtual void DoDataExchange(CDataExchange* pDX){
CDialog::DoDataExchange(pDX);
DDX_Radio(pDX, IDC_RADIO1, m_choosed);
};
public:
int m_choosed;
};
#pragma region Declare_MessageMap
IMPLEMENT_DYNCREATE(CImgMatchView, CFormView)
BEGIN_MESSAGE_MAP(CImgMatchView, CFormView)
ON_COMMAND(ID_FILE_open1, &CImgMatchView::OnFileopen1)
ON_COMMAND(ID_FILE_open2, &CImgMatchView::OnFileopen2)
ON_COMMAND(ID_match_all, &CImgMatchView::OnMatchAll)
ON_COMMAND(ID_Save_Match, &CImgMatchView::OnSaveMatch)
ON_BN_CLICKED(IDC_Clear_log, &CImgMatchView::OnClearLog)
ON_COMMAND(ID_match_surf, &CImgMatchView::OnMatchSurf)
ON_COMMAND(ID_Clear, &CImgMatchView::OnClearLog)
ON_COMMAND(ID_Clear_all, &CImgMatchView::OnClearAll)
ON_COMMAND(ID_train_p, &CImgMatchView::OnTrainP)
ON_COMMAND(ID_train_n, &CImgMatchView::OnTrainN)
ON_COMMAND(ID_Show_Train_P, &CImgMatchView::OnShowTrainP)
ON_COMMAND(ID_Show_Train_N, &CImgMatchView::OnShowTrainN)
ON_COMMAND(ID_Clear_p, &CImgMatchView::OnClearP)
ON_COMMAND(ID_Clear_N, &CImgMatchView::OnClearN)
ON_COMMAND(ID_Show_Model, &CImgMatchView::OnShowModel)
ON_COMMAND(ID_show_obj1, &CImgMatchView::OnShowObj1)
ON_COMMAND(ID_show_obj2, &CImgMatchView::OnShowObj2)
ON_COMMAND(ID_Show_Test, &CImgMatchView::OnShowTest)
ON_COMMAND(ID_Start_Evolution, &CImgMatchView::OnStartEvolution)
ON_COMMAND(ID_Add_Test, &CImgMatchView::OnAddTest)
ON_COMMAND(ID_Clear_Test, &CImgMatchView::OnClearTest)
ON_COMMAND(ID_Start_Match, &CImgMatchView::OnStartMatch)
ON_COMMAND(ID_Clear_Train, &CImgMatchView::OnClearTrain)
ON_COMMAND(ID_UseHelp, &CImgMatchView::OnUseHelp)
ON_COMMAND(ID_Open_Model_many, &CImgMatchView::OnOpenModelMany)
ON_BN_CLICKED(IDC_train_help, &CImgMatchView::OnTrainHelp)
ON_BN_CLICKED(IDC_test_help, &CImgMatchView::OnTestHelp)
ON_COMMAND(ID_AdvancedSet, &CImgMatchView::OnAdvancedSet)
ON_BN_CLICKED(IDC_SaveMatch, &CImgMatchView::OnSavematch)
ON_COMMAND(ID_saveEvoPath, &CImgMatchView::OnSaveEvoPath)
ON_COMMAND(ID_readEvoPath, &CImgMatchView::OnReadEvoPath)
ON_COMMAND(ID_updateLog, &CImgMatchView::OnUpdateLog)
ON_EN_VSCROLL(IDC_log, &CImgMatchView::OnEnVscrollLog)
ON_WM_ERASEBKGND()
ON_WM_CTLCOLOR()
ON_WM_NCLBUTTONDOWN()
ON_WM_CLOSE()
ON_COMMAND(ID_readModelTrain, &CImgMatchView::OnReadModelTrain)
ON_COMMAND(ID_saveModelTrain, &CImgMatchView::OnSaveModelTrain)
ON_COMMAND(ID_Quit, &CImgMatchView::OnQuit)
ON_COMMAND(IDD_ResizeWindow, &CImgMatchView::OnResizeWindow)
ON_WM_DROPFILES()
END_MESSAGE_MAP()
#pragma endregion
//标记是否使用多线程加速(在imgPro.h中定义): #define b_multiThread 0/1
//支持图片最大大小(在imgPro.h中已定义) const int MAXSIZE = 1000;
CImgMatchView::CImgMatchView(): CFormView(CImgMatchView::IDD)
{
m_bmpBackground.LoadResource(IDB_BITMAP1);
ml.setML(Ch_Num,1,.75,Dlg.EvoCol);
filePath1 = filePath2 = _T("");
img1 = img2 = 0;
log = "欢迎使用笔迹智能匹配系统,如有疑问请查看使用帮助(快捷键F2)\r\n\r\n快速读取模板和训练集路径请按Ctrl+R\r\n\r\n快速读取演化路径请按R\r\n";
for(int i=0;i<log_num;i++)
logg[i].Empty();
train.p_num = train.n_num = 0;
for(int j=0;j<10;j++)
model.path[j].Empty();
model.n = 0;
test.num = 0;
memset(test.times,0,sizeof(test.times));
Evolution = 0;
resetP_N = 1;
matchlog.Empty();
EvoPath.Empty();
pStatues = 0;
for(int i=0;i<100;++i)
DragImgPath[i].Empty();
DragEvoPath.Empty();
DragModelTrainPath.Empty();
#ifdef _DEBUG
//hLogFile = CreateFile("memleak.log", GENERIC_WRITE, FILE_SHARE_WRITE|FILE_SHARE_READ,\
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);//创建日志文件
_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);//将warn级别的内容都输出到文件(注意dump的报告级别即为warning)
_CrtSetReportFile(_CRT_WARN, hLogFile);//将日志文件设置为告警的输出文件
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );//无论程序在什么地方退出都会自动调用 _CrtDumpMemoryLeaks
#define new new(_CLIENT_BLOCK, __FILE__, __LINE__)
#endif
//ofstream out("log",ios::out);
//out.close();
CreateDirectory("Log", NULL); //创建保存日志文件的文件夹
DeleteFile("Log\\detail-log.txt");
DeleteFile("Log\\time-log.txt");
DeleteFile("Log\\dbError-log.txt");
DeleteFile("Log\\match-log.txt");
}
CImgMatchView::~CImgMatchView()
{
DeleteFile("best.pth");
DeleteFile("present.pth");
DeleteFile("tmp.txt");
DeleteFile("log");
}
void CImgMatchView::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
DDX_Text(pDX, IDC_log, log);
DDV_MaxChars(pDX, log, 1000000000);
}
BOOL CImgMatchView::PreCreateWindow(CREATESTRUCT& cs)
{
pstyle = &cs;
return CFormView::PreCreateWindow(cs);
}
UINT first_help(void*pp){
((CImgMatchView*)pp)->OnUseHelp();
return 0;
}
void CImgMatchView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
CMainFrame *pFrame = (CMainFrame*)GetParent();
pStatues = &pFrame->m_wndStatusBar;
pStatues->SetPaneInfo(0,0,pStatues->GetPaneStyle(0),355);
pStatues->SetPaneInfo(1,1,pStatues->GetPaneStyle(1),298);
pStatues->SetPaneInfo(2,2,pStatues->GetPaneStyle(2),40);
pMF = ((CMainFrame *)AfxGetMainWnd());
pMF->m_wndStatusBar.GetItemRect(1,&myr);
if(!pMF->m_bCreated)
{
pMF->m_progress.Create(WS_VISIBLE | WS_CHILD | WS_CLIPCHILDREN, myr, &pMF->m_wndStatusBar,1);
pMF->m_progress.SetStep(1);
pMF->m_bCreated = 1;
}
DB_table myDB;
if (!PathFileExists(myDB.m_dbName))
{
AfxBeginThread(first_help,this);
}
initDB();
GetDlgItem(IDC_many_model)->SetFocus();
}
inline CString printDateTime(CString s="最近一次操作时间:") {
char tmpbuf[128];
char tmpbuf2[128];
CString now = "",tmp,tmpName;
time_t now_time=time(NULL);
struct tm *newtime=localtime(&now_time);
if(s=="time") //可以保存当前全屏状态到文件
{
strftime(tmpbuf,128,"%Y%m%d",newtime);
strftime(tmpbuf2,128,"%H%M%S",newtime);
Screen(strcat(tmpbuf,tmpbuf2));
return "";
}
strftime(tmpbuf,128,"%Y/%m/%d ",newtime);
strftime(tmpbuf2,128,"%H:%M:%S",newtime);
now.Format(_T("%s%s%s"),s,tmpbuf,tmpbuf2);
return now;
}
void CImgMatchView::updatelog(){
InvalidateRect(&r,1);
SetDlgItemText(IDC_log,log+printDateTime());
CEdit* pEdit = ((CEdit*)GetDlgItem(IDC_log));
pEdit->LineScroll(pEdit->GetLineCount());
}
#pragma region SimpleMatch
void CImgMatchView::OnShowObj1()
{
showImg(img1,"对比图1","显示对比图1出错");
}
void CImgMatchView::OnShowObj2()
{
showImg(img2,"对比图2","显示对比图2出错");
}
//清空操作历史记录
void CImgMatchView::OnClearLog()
{
log.Empty();
for(int i=0;i<log_num;i++)
logg[i].Empty();
UpdateData(false);
updatelog();
}
void CImgMatchView::OnClearAll()
{
LOG(">>重置所有\n\n")
filePath1.Empty();
filePath2.Empty();
EvoPath.Empty();
train.p_num = train.n_num = 0;
releaseImg(&img1);
releaseImg(&img2);
model.n = 0;
OnClearLog();
train.p_num = 0;
train.p_num = 0;
test.num = 0;
memset(test.times,0,sizeof(test.times));
DeleteFile("p_n.txt");
DeleteFile("test.txt");
DeleteFile("best.pth");
for(int i=log_num-1;i>0;i--)
logg[i] = logg[i-1];
logg[0].Format(_T("已重置所有配置\r\n-------------操作分割线-------------\r\n\r\n"));
log = logg[log_num-1];
for(int i=log_num-2;i>=0;i--)
log += logg[i];
UpdateData(false);
updatelog();
}
void CImgMatchView::OnFileopen1()
{
strcpy(info,"");
char fileFormat[] = _T("JPEG (*.jpg)|*.jpg;*.jpeg|PNG (*.png)|*.png|BMP (*.bmp)|*.bmp|All Files (*.*)|*.*||");
CFileDialog dlg(TRUE,0,0,OFN_FILEMUSTEXIST,fileFormat);
if(dlg.DoModal()==IDOK)
{
CString _filePath1 = dlg.GetPathName();
char* _file1 = (LPSTR)(LPCTSTR)_filePath1 ;
IplImage* _img1 = loadImg(_file1);
if(_img1){
for(int i=log_num-1;i>0;i--)
logg[i] = logg[i-1];
logg[0].Format(_T("对比图1:\r\n%s-------------操作分割线-------------\r\n\r\n"),info);
log = logg[log_num-1];
for(int i=log_num-2;i>=0;i--)
log += logg[i];
UpdateData(false);
updatelog();
filePath1 = _filePath1;
releaseImg(&img1);
img1 = _img1;
}
}
}
void CImgMatchView::OnFileopen2()
{
strcpy(info,"");
char fileFormat[] = _T("JPEG (*.jpg)|*.jpg;*.jpeg|PNG (*.png)|*.png|BMP (*.bmp)|*.bmp|All Files (*.*)|*.*||");
CFileDialog dlg(TRUE,0,0,OFN_FILEMUSTEXIST,fileFormat);
if(dlg.DoModal()==IDOK)
{
CString _filePath2 = dlg.GetPathName();
char* _file2 = (LPSTR)(LPCTSTR)_filePath2 ;
IplImage* _img2 = loadImg(_file2);
if(_img2){
for(int i=log_num-1;i>0;i--)
logg[i] = logg[i-1];
logg[0].Format(_T("对比图2:\r\n%s-------------操作分割线-------------\r\n\r\n"),info);
log = logg[log_num-1];
for(int i=log_num-2;i>=0;i--)
log += logg[i];
UpdateData(false);
updatelog();
filePath2 = _filePath2;
releaseImg(&img2);
img2 = _img2;
}
}
}
void CImgMatchView::OnMatchAll()
{
strcpy(info,"");
if(filePath1 && filePath2 && filePath1[0] && filePath2[0]){
t.getTargetInfo(filePath1,-2,0);
t2.getTargetInfo(filePath2,-2,0);
t.compare(t2,0,0,0,Dlg.ratio);
for(int i=log_num-1;i>0;i--)
logg[i] = logg[i-1];
logg[0].Format(_T("%s-------------操作分割线-------------\r\n\r\n"),info);
log = logg[log_num-1];
for(int i=log_num-2;i>=0;i--)
log += logg[i];
UpdateData(false);
updatelog();
}else
MessageBox("图像指针无效,请先载入有效图像后再使用该功能","匹配图像出错",MB_ICONERROR);
}
void CImgMatchView::OnSaveMatch()
{
if(find_obj_match){
char fileFormat[] = _T("JPEG (*.jpg)|*.jpg;*.jpeg|PNG (*.png)|*.png|BMP (*.bmp)|*.bmp|All Files (*.*)|*.*||");
CFileDialog dlg(false,"jpg",0,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,fileFormat);
if(dlg.DoModal()==IDOK)
{
CString path = dlg.GetPathName();
char *path_c = (LPSTR)(LPCTSTR)path ;
saveImg(path_c,find_obj_match);
}
}else
MessageBox("图像指针无效,请先载入有效图像并综合匹配后再使用该功能","保存图像出错",MB_ICONERROR);
}
void CImgMatchView::OnMatchSurf()
{
strcpy(info,"");
if(filePath1 && filePath2 && filePath1[0] && filePath2[0]){
find_obj(filePath1,filePath2,0,1);
for(int i=log_num-1;i>0;i--)
logg[i] = logg[i-1];
logg[0].Format(_T("%s-------------操作分割线-------------\r\n\r\n"),info);
log = logg[log_num-1];
for(int i=log_num-2;i>=0;i--)
log += logg[i];
UpdateData(false);
updatelog();
}else
MessageBox("图像指针无效,请先载入有效图像后再使用该功能","surf角点检测出错",MB_ICONERROR);
}
#pragma endregion
void CImgMatchView::OnTrainP()
{
LOG(">>载入正训练集\n")
char fileFormat[] = _T("JPEG (*.jpg)|*.jpg;*.jpeg|PNG (*.png)|*.png|BMP (*.bmp)|*.bmp|All Files (*.*)|*.*||");
CFileDialog dlg(TRUE,0,0,OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT,fileFormat);
int check=0;
if(DragImgPath[0]=="")
check = (dlg.DoModal()==IDOK);
if(DragImgPath[0][0] || check) //传入了文件路径列表 或者 读取了文件
{
int num = train.p_num;
POSITION pos = dlg.GetStartPosition();
int jj=0;
bool loop = DragImgPath[0]=="" ? pos!=0 : DragImgPath[jj][0]!=0;
while(loop){
if(DragImgPath[0]!=""){
train.p[train.p_num]=DragImgPath[jj++];
loop = DragImgPath[jj][0]!=0;
}else{
train.p[train.p_num]=dlg.GetNextPathName(pos);
loop = pos!=0;
}
LOG(train.p[train.p_num]);
if(!(tmpimg = loadImg(train.p[train.p_num],0,0,1,0))){
train.p_num--;
LOG("\t载入失败,已跳过")
}else if(tmpimg->width>MAXSIZE || tmpimg->height>MAXSIZE)
{
char exit_info[1000];
sprintf(exit_info,("图像%s尺寸过大,请先处理为%d*%d以内再载入!\r\n\r\n已自动跳过该图像!"),train.p[train.p_num],MAXSIZE,MAXSIZE);
MessageBox(exit_info,"获取图像信息失败",0);
train.p_num--;
LOG("\t尺寸过大,已跳过");
}
releaseImg(&tmpimg);
train.p_num++;
LOG("\n");
}
LOG("———正训练集读取完毕———\n");
for(int i=log_num-1;i>0;i--)
logg[i] = logg[i-1];
if(train.p_num-num>0){
tmp.Format(_T("已载入下列%d个正训练集:\r\n"),train.p_num-num);
for(int i=num;i<train.p_num;i++){
logg[0].Format(_T("%s%s\r\n"),tmp,train.p[i]);
tmp = logg[0];
}
logg[0].Format(_T("%s-------------操作分割线-------------\r\n\r\n"),tmp);
Evolution = 0;
}else
logg[0].Format(_T("未成功载入正训练集,请重试!\r\n-------------操作分割线-------------\r\n\r\n"));
log = logg[log_num-1];
for(int i=log_num-2;i>=0;i--)
log += logg[i];
UpdateData(false);
updatelog();
}
LOG("<<结束载入正训练集———\n\n")
}
void CImgMatchView::OnTrainN()
{
LOG(">>载入负训练集\n")
char fileFormat[] = _T("JPEG (*.jpg)|*.jpg;*.jpeg|PNG (*.png)|*.png|BMP (*.bmp)|*.bmp|All Files (*.*)|*.*||");
CFileDialog dlg(TRUE,0,0,OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT,fileFormat);
int check=0;
if(DragImgPath[0]=="")
check = (dlg.DoModal()==IDOK);
if(DragImgPath[0][0] || check) //传入了文件路径列表 或者 读取了文件
{
int num = train.n_num;
POSITION pos = dlg.GetStartPosition();
int jj=0;
bool loop = DragImgPath[0]=="" ? pos!=0 : DragImgPath[jj][0]!=0;
while(loop){
if(DragImgPath[0]!=""){
train.n[train.n_num]=DragImgPath[jj++];
loop = DragImgPath[jj][0]!=0;
}else{
train.n[train.n_num]=dlg.GetNextPathName(pos);
loop = pos!=0;
}
LOG(train.n[train.n_num]);
if(!(tmpimg = loadImg(train.n[train.n_num],0,0,1,0))){
train.n_num--;
LOG("\t载入失败,已跳过")
}else if(tmpimg->width>MAXSIZE || tmpimg->height>MAXSIZE)
{
char exit_info[1000];
sprintf(exit_info,("图像%s尺寸过大,请先处理为%d*%d以内再载入!\r\n\r\n已自动跳过该图像!"),train.n[train.n_num],MAXSIZE,MAXSIZE);
MessageBox(exit_info,"获取图像信息失败",0);
train.n_num--;
LOG("\t尺寸过大,已跳过")
}
releaseImg(&tmpimg);
train.n_num++;
LOG("\n")
}
LOG("———负训练集读取完毕———\n")
for(int i=log_num-1;i>0;i--)
logg[i] = logg[i-1];
if(train.n_num-num>0){
tmp.Format(_T("已载入下列%d个负训练集:\r\n"),train.n_num-num);
for(int i=num;i<train.n_num;i++){
logg[0].Format(_T("%s%s\r\n"),tmp,train.n[i]);
tmp = logg[0];
}
logg[0].Format(_T("%s-------------操作分割线-------------\r\n\r\n"),tmp);
Evolution = 0;
}else
logg[0].Format(_T("未成功载入正训练集,请重试!\r\n-------------操作分割线-------------\r\n\r\n"));
log = logg[log_num-1];
for(int i=log_num-2;i>=0;i--)
log += logg[i];
UpdateData(false);
updatelog();
}
LOG("<<结束载入负训练集———\n\n")
}
void CImgMatchView::OnShowTrainP()
{
for(int i=log_num-1;i>0;i--)
logg[i] = logg[i-1];
if(train.p_num>0){
tmp.Format(_T("当前已载入下列正训练集:\r\n"));
for(int i=0;i<train.p_num;i++){
logg[0].Format(_T("%s%s\r\n"),tmp,train.p[i]);
tmp = logg[0];
}
logg[0].Format(_T("%s-------------操作分割线-------------\r\n\r\n"),tmp);
}else
logg[0].Format(_T("当前还未载入正训练集!\r\n-------------操作分割线-------------\r\n\r\n"));
log = logg[log_num-1];
for(int i=log_num-2;i>=0;i--)
log += logg[i];
UpdateData(false);
updatelog();
}
void CImgMatchView::OnShowTrainN()
{
for(int i=log_num-1;i>0;i--)
logg[i] = logg[i-1];
if(train.n_num>0){
tmp.Format(_T("当前已载入下列负训练集:\r\n"));
for(int i=0;i<train.n_num;i++){
logg[0].Format(_T("%s%s\r\n"),tmp,train.n[i]);
tmp = logg[0];
}
logg[0].Format(_T("%s-------------操作分割线-------------\r\n\r\n"),tmp);
}else
logg[0].Format(_T("当前还未载入负训练集!\r\n-------------操作分割线-------------\r\n\r\n"));
log = logg[log_num-1];
for(int i=log_num-2;i>=0;i--)
log += logg[i];
UpdateData(false);
updatelog();
}
void CImgMatchView::OnClearP()
{
LOG(">>重置正测试集\n\n")
if(train.p_num!=0){
train.p_num = 0;
for(int i=log_num-1;i>0;i--)
logg[i] = logg[i-1];
logg[0].Format(_T("已清空当前已载入的正训练集\r\n-------------操作分割线-------------\r\n\r\n"));
log = logg[log_num-1];
for(int i=log_num-2;i>=0;i--)
log += logg[i];
UpdateData(false);
updatelog();
}else
OnShowTrainP();
resetP_N = 1;
}
void CImgMatchView::OnClearN()
{
LOG(">>重置负测试集\n\n")
if(train.n_num!=0){
train.n_num = 0;
for(int i=log_num-1;i>0;i--)
logg[i] = logg[i-1];
logg[0].Format(_T("已清空当前已载入的负训练集\r\n-------------操作分割线-------------\r\n\r\n"));
log = logg[log_num-1];
for(int i=log_num-2;i>=0;i--)
log += logg[i];
UpdateData(false);
updatelog();
}else
OnShowTrainN();
resetP_N = 1;
}
void CImgMatchView::OnClearTrain()
{
LOG(">>重置训练集\n\n")
if(train.p_num!=0){
train.p_num = 0;
for(int i=log_num-1;i>0;i--)
logg[i] = logg[i-1];
logg[0].Format(_T("已清空当前已载入的正训练集\r\n-------------操作分割线-------------\r\n\r\n"));
log = logg[log_num-1];
for(int i=log_num-2;i>=0;i--)
log += logg[i];
UpdateData(false);
updatelog();
}else
OnShowTrainP();
if(train.n_num!=0){
train.n_num = 0;
for(int i=log_num-1;i>0;i--)
logg[i] = logg[i-1];
logg[0].Format(_T("已清空当前已载入的负训练集\r\n-------------操作分割线-------------\r\n\r\n"));
log = logg[log_num-1];
for(int i=log_num-2;i>=0;i--)
log += logg[i];
UpdateData(false);
updatelog();
}else
OnShowTrainN();
resetP_N = 1;
}
void CImgMatchView::OnOpenModelMany()
{
LOG(">>载入模板图\n");
runing = 1;
char fileFormat[] = _T("JPEG (*.jpg)|*.jpg;*.jpeg|PNG (*.png)|*.png|BMP (*.bmp)|*.bmp|All Files (*.*)|*.*||");
CFileDialog dlg(TRUE,0,0,OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT,fileFormat);
int check=0;
if(DragImgPath[0]=="")
check = (dlg.DoModal()==IDOK);
if(DragImgPath[0][0] || check) //传入了文件路径列表 或者 读取了文件
{
try{
model.n = 0;
POSITION pos = dlg.GetStartPosition();
int jj=0;
bool loop = DragImgPath[0]=="" ? pos!=0 : DragImgPath[jj][0]!=0;
while(loop){
if(model.n==10){ //最多只允许10个模板
MessageBox("最多只允许载入10个模板,已将前10个作为模板","温馨提示");
break;
}
if(DragImgPath[0]!=""){
model.path[model.n]=DragImgPath[jj++];
loop = DragImgPath[jj][0]!=0;
}else{
model.path[model.n]=dlg.GetNextPathName(pos);
loop = pos!=0;
}
LOG(model.path[model.n]);
if(!(tmpimg = loadImg(model.path[model.n],0,0,1,0))){
model.n--;
LOG("\t载入失败,已跳过");
}else if(tmpimg->width>MAXSIZE || tmpimg->height>MAXSIZE)
{
char exit_info[1000];
sprintf(exit_info,("图像%s尺寸过大,请先处理为%d*%d以内再载入!\r\n\r\n\r\n已自动跳过该图像!"),model.path[model.n],MAXSIZE,MAXSIZE);
MessageBox(exit_info,"获取图像信息失败",0);
model.n--;
LOG("\t尺寸过大,已跳过");
}
releaseImg(&tmpimg);
model.n++;
LOG("\n");
}
LOG("———模板图读取完毕———\n");
}
catch(...)
{
LOG("\nERROR: 读取模板图时出现异常\n\n");
runing = 0;
MessageBox("非常抱歉,在读取模板图时出现异常,请关闭后重试","运行出错",0);
return;
}
for(int i=log_num-1;i>0;i--)
logg[i] = logg[i-1];
if(model.n>0){
tmp.Format(_T("已载入下列%d个模板:\r\n"),model.n);
for(int i=0;i<model.n;i++){
logg[0].Format(_T("%s%s\r\n"),tmp,model.path[i]);
tmp = logg[0];
}
logg[0].Format(_T("%s-------------操作分割线-------------\r\n\r\n"),tmp);
}else
logg[0].Format(_T("未成功载入模板图,请重试!\r\n-------------操作分割线-------------\r\n\r\n"));
log = logg[log_num-1];
for(int i=log_num-2;i>=0;i--)
log += logg[i];
UpdateData(false);
updatelog();
Evolution = 0;
//清理以前载入的训练集和测试集
train.p_num = 0;
train.n_num = 0;
test.num = 0;
resetP_N = 1;
}
runing = 0;
LOG("<<结束载入模板图———\n\n");
}
void CImgMatchView::OnShowModel()
{
if(model.n>0){
for(int i=log_num-1;i>0;i--)
logg[i] = logg[i-1];
tmp.Format(_T("当前已载入模板图:\r\n"));
for(int i=0;i<model.n;i++){
logg[0].Format("%s%s\r\n",tmp,model.path[i]);
tmp = logg[0];
}
logg[0].Format("%s-------------操作分割线-------------\r\n\r\n",tmp);
log = logg[log_num-1];
for(int i=log_num-2;i>=0;i--)
log += logg[i];
UpdateData(false);
updatelog();
}else{
for(int i=log_num-1;i>0;i--)
logg[i] = logg[i-1];
logg[0].Format(_T("当前还未载入模板图!\r\n-------------操作分割线-------------\r\n\r\n"));
log = logg[log_num-1];
for(int i=log_num-2;i>=0;i--)
log += logg[i];
UpdateData(false);
updatelog();
}
}
void CImgMatchView::OnAddTest()
{
LOG(">>增加测试集\n\n");
runing = 1;
strcpy(info,"");
char fileFormat[] = _T("JPEG (*.jpg)|*.jpg;*.jpeg|PNG (*.png)|*.png|BMP (*.bmp)|*.bmp|All Files (*.*)|*.*||");
CFileDialog dlg(TRUE,0,0,OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT,fileFormat);
int check=0;
if(DragImgPath[0]=="") //如果没有拖入文件作为测试集则使用文件对话框
check = (dlg.DoModal()==IDOK);
if(DragImgPath[0][0] || check) //传入了文件路径列表 或者 读取了文件
{
int num = test.num;
POSITION pos = dlg.GetStartPosition();
int jj=0;
bool loop = DragImgPath[0]=="" ? pos!=0 : DragImgPath[jj][0]!=0;
while(loop){
if(DragImgPath[0]!=""){
test.p[test.num]=DragImgPath[jj++];
loop = DragImgPath[jj][0]!=0;
}else{
test.p[test.num]=dlg.GetNextPathName(pos);
loop = pos!=0;
}
LOG(test.p[test.num]);
if(!(tmpimg = loadImg(test.p[test.num],0,0,1,0))){
test.num--;
LOG("\t载入失败,已跳过");
}else if(tmpimg->width>MAXSIZE || tmpimg->height>MAXSIZE)
{
char exit_info[1000];
sprintf(exit_info,("图像%s尺寸过大,请先处理为%d*%d以内再载入!\r\n\r\n\r\n已自动跳过该图像!"),test.p[test.num],MAXSIZE,MAXSIZE);
MessageBox(exit_info,"获取图像信息失败",0);
test.num--;
LOG("\t尺寸过大,已跳过")
}
releaseImg(&tmpimg);
test.num++;
LOG("\n")
}
LOG("———测试集读取完毕———\n");
for(int i=log_num-1;i>0;i--)
logg[i] = logg[i-1];
if(test.num-num>0){
tmp.Format(_T("已载入下列%d个测试集:\r\n"),test.num-num);
for(int i=num;i<test.num;i++){
logg[0].Format(_T("%s%s\r\n"),tmp,test.p[i]);
tmp = logg[0];
}
logg[0].Format(_T("%s-------------操作分割线-------------\r\n\r\n"),tmp);
test.times[test.times[9]] = test.num-1;
test.times[9]++;
}else
logg[0].Format(_T("未成功载入测试集,请重试!\r\n-------------操作分割线-------------\r\n\r\n"));
log = logg[log_num-1];
for(int i=log_num-2;i>=0;i--)
log += logg[i];
UpdateData(false);
updatelog();
}
runing = 0;
LOG("<<结束增加测试集———\n\n");
if(Evolution==1 && test.num>0)
if(MessageBox("你已载入了测试集,是否立即匹配?","开始匹配提醒",MB_YESNO)==IDYES)
OnStartMatch();
}
void CImgMatchView::OnShowTest()
{
for(int i=log_num-1;i>0;i--)
logg[i] = logg[i-1];
if(test.num>0){
tmp.Format(_T("当前已载入下列测试集:\r\n"));
for(int i=0;i<test.num;i++){
logg[0].Format(_T("%s%s\r\n"),tmp,test.p[i]);
tmp = logg[0];
}
logg[0].Format(_T("%s-------------操作分割线-------------\r\n\r\n"),tmp);
log = logg[log_num-1];
for(int i=log_num-2;i>=0;i--)
log += logg[i];
}else{
logg[0].Format(_T("当前还未载入测试集!\r\n-------------操作分割线-------------\r\n\r\n"));
log = logg[log_num-1];
for(int i=log_num-2;i>=0;i--)
log += logg[i];
}
UpdateData(false);
updatelog();
}
void CImgMatchView::OnClearTest()
{
LOG(">>重置测试集\n\n")
if(test.num>0){
test.num = 0;
memset(test.times,0,sizeof(test.times));
for(int i=log_num-1;i>0;i--)
logg[i] = logg[i-1];
logg[0].Format(_T("已清空当前已载入的测试集\r\n-------------操作分割线-------------\r\n\r\n"));
log = logg[log_num-1];
for(int i=log_num-2;i>=0;i--)
log += logg[i];
UpdateData(false);
updatelog();
}else
OnShowTest();
}
UINT evoTrain(void* pp){
long time1 = clock(),time2;
CImgMatchView* pView = (CImgMatchView*)pp;
MSG &msg = pView->msg;
Target &t3 = pView->t3, &t4 = pView->t4;
for(int i=0;i<pView->train.p_num;i++){ //正训练集
if(pView->train.done_p[i])
continue;
pView->train.done_p[i]=1;
double best = 0;
int index = 0;
for(int j=0;j<pView->model.n && pView->model.n>1;j++)
{
t3.getTargetInfo(pView->model.path[j]);
t4.getTargetInfo(pView->train.p[i]);
double re = t3.compare(t4,0,1,1,pView->ratio);
if(best<re)
{
index = j;
best = re;
}
time2 = clock();
if (time2 - time1 > 50 && PeekMessage(&msg, (HWND)NULL, 0, 0, PM_REMOVE)){
SendMessage(0,msg.message, msg.wParam, msg.lParam);
time1 = time2;
Sleep(5);
}
LOG("i="<<i<<" j="<<j<<">\n");
pView->pMF->m_progress.StepIt();
}
t3.getTargetInfo(pView->model.path[index]);
t4.getTargetInfo(pView->train.p[i]);
t3.compare(t4,"p_n.txt",1,0,pView->ratio);
pView->pMF->m_progress.StepIt();
if(pView->model.n==1)
pView->pMF->m_progress.StepIt();
}
for(int i=0;i<pView->train.n_num;i++){ //负训练集
if(pView->train.done_n[i])
continue;
pView->train.done_n[i]=1;
for(int j=0;j<pView->model.n;j++)
{
t3.getTargetInfo(pView->model.path[j]);
t4.getTargetInfo(pView->train.n[i]);
t3.compare(t4, "p_n.txt", 0, 0, pView->ratio);
time2 = clock();
if (time2 - time1 > 50 && PeekMessage(&msg, (HWND)NULL, 0, 0, PM_REMOVE)){
SendMessage(0,msg.message, msg.wParam, msg.lParam);
time1 = time2;
Sleep(5);
}
LOG("i="<<i<<" j="<<j<<">\n");
pView->pMF->m_progress.StepIt();
}
}
pView->runing = 0;
return 0;
}