ReconizeDlg.cpp
上传用户:chinamans
上传日期:2016-04-11
资源大小:14485k
文件大小:25k
源码类别:

图形/文字识别

开发平台:

Visual C++

  1. // ReconizeDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "Reconize.h"
  5. #include "ReconizeDlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. BYTE Buffer[1000][1000][3]; // 24位真彩色图// 0--blue 1--green 2--red
  12. BYTE Buffer1[1000][1000]; // 灰度图
  13. BYTE BufferReg[1000][1000]; //二值图
  14. BYTE pByte[3200000]; //内存镜像文件
  15. int index1,index2,index3,index4; //分别是以下四个数组的上界标识.
  16. int  PointLT[50000][3] ,PointRT[50000][3] ,PointRB[50000][3] ,PointLB[50000][3] ;
  17. int indexRect;
  18. int  Rect[50000][4]; //匹配的矩形记录,里面放的是PointLT等..中对应坐标的索引.
  19. int  avgPointLT[50000][3] ,avgPointRT[50000][3] ,avgPointRB[50000][3] ,avgPointLB[50000][3] ;//依次对应匹配的平均矩形的左顶点,右顶点,右底点,左底点底坐标
  20. int  avgindexRect; //匹配的平均矩形记录
  21. int  HaveJumpRectLT[50000][3],HaveJumpRectRT[50000][3],HaveJumpRectRB[50000][3],HaveJumpRectLB[50000][3];//含有足够跳变的矩形坐标记录
  22. int  JumpindexRect; //含有足够跳变的矩形数目
  23. ///////////////////////////////////////////////////////////////////////////
  24. // CAboutDlg dialog used for App About
  25. class CAboutDlg : public CDialog
  26. {
  27. public:
  28. CAboutDlg();
  29. // Dialog Data
  30. //{{AFX_DATA(CAboutDlg)
  31. enum { IDD = IDD_ABOUTBOX };
  32. //}}AFX_DATA
  33. // ClassWizard generated virtual function overrides
  34. //{{AFX_VIRTUAL(CAboutDlg)
  35. protected:
  36. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  37. //}}AFX_VIRTUAL
  38. // Implementation
  39. protected:
  40. //{{AFX_MSG(CAboutDlg)
  41. //}}AFX_MSG
  42. DECLARE_MESSAGE_MAP()
  43. };
  44. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  45. {
  46. //{{AFX_DATA_INIT(CAboutDlg)
  47. //}}AFX_DATA_INIT
  48. }
  49. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  50. {
  51. CDialog::DoDataExchange(pDX);
  52. //{{AFX_DATA_MAP(CAboutDlg)
  53. //}}AFX_DATA_MAP
  54. }
  55. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  56. //{{AFX_MSG_MAP(CAboutDlg)
  57. // No message handlers
  58. //}}AFX_MSG_MAP
  59. END_MESSAGE_MAP()
  60. /////////////////////////////////////////////////////////////////////////////
  61. // CReconizeDlg dialog
  62. CReconizeDlg::CReconizeDlg(CWnd* pParent /*=NULL*/)
  63. : CDialog(CReconizeDlg::IDD, pParent)
  64. {
  65. //{{AFX_DATA_INIT(CReconizeDlg)
  66. // NOTE: the ClassWizard will add member initialization here
  67. //}}AFX_DATA_INIT
  68. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  69. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  70. }
  71. void CReconizeDlg::DoDataExchange(CDataExchange* pDX)
  72. {
  73. CDialog::DoDataExchange(pDX);
  74. //{{AFX_DATA_MAP(CReconizeDlg)
  75. // NOTE: the ClassWizard will add DDX and DDV calls here
  76. //}}AFX_DATA_MAP
  77. }
  78. BEGIN_MESSAGE_MAP(CReconizeDlg, CDialog)
  79. //{{AFX_MSG_MAP(CReconizeDlg)
  80. ON_WM_SYSCOMMAND()
  81. ON_WM_PAINT()
  82. ON_WM_QUERYDRAGICON()
  83. ON_BN_CLICKED(IDC_OPEN_FILE, OnOpenFile)
  84. ON_BN_CLICKED(IDC_TO_GRAY, OnToGray)
  85. ON_BN_CLICKED(IDC_FILE_EXIT, OnFileExit)
  86. ON_BN_CLICKED(IDC_WHITE_BLACK, OnWhiteBlack)
  87. ON_BN_CLICKED(IDC_DRAW_EDGE, OnDrawEdge)
  88. ON_BN_CLICKED(IDC_DRAW_RECT, OnDrawRect)
  89. ON_BN_CLICKED(IDC_QUICK_RECONIZE, OnQuickReconize)
  90. ON_BN_CLICKED(IDC_GET_RECT, OnGetRect)
  91. ON_COMMAND(IDC_DRAW_EDGE, OnDrawEdge)
  92. //}}AFX_MSG_MAP
  93. END_MESSAGE_MAP()
  94. /////////////////////////////////////////////////////////////////////////////
  95. // CReconizeDlg message handlers
  96. BOOL CReconizeDlg::OnInitDialog()
  97. {
  98. CDialog::OnInitDialog();
  99. // Add "About..." menu item to system menu.
  100. // IDM_ABOUTBOX must be in the system command range.
  101. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  102. ASSERT(IDM_ABOUTBOX < 0xF000);
  103. CMenu* pSysMenu = GetSystemMenu(FALSE);
  104. if (pSysMenu != NULL)
  105. {
  106. CString strAboutMenu;
  107. strAboutMenu.LoadString(IDS_ABOUTBOX);
  108. if (!strAboutMenu.IsEmpty())
  109. {
  110. pSysMenu->AppendMenu(MF_SEPARATOR);
  111. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  112. }
  113. }
  114. // Set the icon for this dialog.  The framework does this automatically
  115. //  when the application's main window is not a dialog
  116. SetIcon(m_hIcon, TRUE); // Set big icon
  117. SetIcon(m_hIcon, FALSE); // Set small icon
  118. // TODO: Add extra initialization here
  119. return TRUE;  // return TRUE  unless you set the focus to a control
  120. }
  121. void CReconizeDlg::OnSysCommand(UINT nID, LPARAM lParam)
  122. {
  123. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  124. {
  125. CAboutDlg dlgAbout;
  126. dlgAbout.DoModal();
  127. }
  128. else
  129. {
  130. CDialog::OnSysCommand(nID, lParam);
  131. }
  132. }
  133. // If you add a minimize button to your dialog, you will need the code below
  134. //  to draw the icon.  For MFC applications using the document/view model,
  135. //  this is automatically done for you by the framework.
  136. void CReconizeDlg::OnPaint() 
  137. {
  138. if (IsIconic())
  139. {
  140. CPaintDC dc(this); // device context for painting
  141. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  142. // Center icon in client rectangle
  143. int cxIcon = GetSystemMetrics(SM_CXICON);
  144. int cyIcon = GetSystemMetrics(SM_CYICON);
  145. CRect rect;
  146. GetClientRect(&rect);
  147. int x = (rect.Width() - cxIcon + 1) / 2;
  148. int y = (rect.Height() - cyIcon + 1) / 2;
  149. // Draw the icon
  150. dc.DrawIcon(x, y, m_hIcon);
  151. }
  152. else
  153. {
  154. CDialog::OnPaint();
  155. }
  156. }
  157. // The system calls this to obtain the cursor to display while the user drags
  158. //  the minimized window.
  159. HCURSOR CReconizeDlg::OnQueryDragIcon()
  160. {
  161. return (HCURSOR) m_hIcon;
  162. }
  163. void CReconizeDlg::OnOpenFile() 
  164. {
  165. // TODO: Add your control notification handler code here
  166. CFileDialog OpenDlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,"位图文件(*.BMP)|*.bmp|ALL FILES(*.*)|*.*");
  167. if(OpenDlg.DoModal()==IDOK)
  168. {
  169. InvalidateRect(NULL);
  170. FillMatrix(OpenDlg.GetPathName());
  171. DrawBMP();
  172. }
  173. }
  174. void CReconizeDlg::DrawBMP()//绘制bmp
  175. {
  176. CClientDC dc(this);
  177. int i,j;
  178. for(i=0;i<m_Width;i++)  //rgb
  179. for(j=0;j<m_Height;j++)
  180. dc.SetPixel(i+1,j+1,RGB(Buffer[i][j][2],Buffer[i][j][1],Buffer[i][j][0]) ); //why 0--blue 1--green 2--red
  181. ////////////////////////////////////////////////////////
  182. }
  183. void CReconizeDlg::FillMatrix(CString filename) //将原始图形文件读入数组Buffer
  184. {
  185. ////////////////////////////////////////////////////
  186. m_Width=0;
  187. m_Height=0;
  188. CFile fbmp;
  189. if (fbmp.Open(filename,CFile::modeRead)==FALSE)
  190. {
  191. MessageBox("file access error");
  192. return;
  193. }
  194. char head1,head2;
  195. fbmp.Read(&head1,1);
  196. fbmp.Read(&head2,1);
  197. if(head1!='B' || head2!='M' )
  198. {
  199. MessageBox("none acceptable bmp file");
  200. fbmp.Close();
  201. return;
  202. }
  203. ////////////////////////////////////////////////////
  204. DWORD filesize=fbmp.GetLength();
  205. fbmp.Seek(0,CFile::begin);
  206. //fbmp.ReadHuge(pByte,filesize);
  207. fbmp.Read(pByte, filesize);
  208. fbmp.Close();
  209. BYTE *p;
  210. p=pByte+18;
  211. int tmpWidth,tmpHeight;
  212. tmpWidth= *p + (*(p+1)) *256 + (*(p+2)) *256*256 + (*(p+3)) *256*256*256 ; 
  213. p=pByte+22;
  214. tmpHeight= *p + (*(p+1)) *256 + (*(p+2)) *256*256 + (*(p+3)) *256*256*256 ; 
  215. CString tmpStr1;
  216. tmpStr1.Format("BMP file size :width %d , height %d",tmpWidth,tmpHeight);
  217. MessageBox(tmpStr1);
  218. if(tmpWidth>1000 || tmpHeight >1000)
  219. {
  220. MessageBox("too huge bmp file to deal");
  221. return;
  222. }
  223. p=pByte+10;
  224. int bmpflg;
  225. bmpflg= *p + (*(p+1)) *256 + (*(p+2)) *256*256 + (*(p+3)) *256*256*256 ; 
  226. p=pByte+bmpflg;
  227. int i,j,k;
  228. for(i=tmpHeight-1;i>=0;i--)
  229. for(j=0;j<tmpWidth;j++)
  230. for(k=0;k<3;k++)
  231. {
  232. Buffer[j][i][k]=*p;
  233. p++;
  234. }
  235. m_Width=tmpWidth;
  236. m_Height=tmpHeight;
  237. }
  238. void CReconizeDlg::GetGrayBmp()
  239. {
  240. // TODO: Add your command handler code here
  241. //二值化。
  242. int i,j;
  243. // x=0.30*red+0.59*green+0.11*blue;
  244. for(i=0;i<m_Width;i++)
  245. for(j=0;j<m_Height;j++)
  246.    Buffer1[i][j]=(BYTE)( 0.11*Buffer[i][j][0]+0.59*Buffer[i][j][1]+0.30*Buffer[i][j][2] );
  247. }
  248. void CReconizeDlg::OnToGray() 
  249. {
  250. // TODO: Add your control notification handler code here
  251. int i,j;
  252. GetGrayBmp();
  253. CClientDC dc(this);
  254. for(i=0;i<m_Width;i++)  //rgb
  255. for(j=0;j<m_Height;j++)
  256. dc.SetPixel(i+1,j+1,RGB(Buffer1[i][j],Buffer1[i][j],Buffer1[i][j]) );
  257. }
  258. void CReconizeDlg::OnFileExit() 
  259. {
  260. // TODO: Add your control notification handler code here
  261. exit(0);
  262. }
  263. void CReconizeDlg::OnWhiteBlack() 
  264. {
  265. // TODO: Add your control notification handler code here
  266. DrawGetregion();
  267. EraseDot2();
  268. DrawRegion();
  269. }
  270. void CReconizeDlg::DrawGetregion() //计算出二值图
  271. {
  272. // TODO: Add your command handler code here
  273. int i,j;
  274. int defvalue=15;//阈值点
  275. for(i=0;i<m_Width;i++)
  276. for(j=0;j<m_Height;j++)
  277. BufferReg[i][j]=0;
  278. for(i=0;i<m_Height;i++)
  279. for(j=0;j<m_Width-1;j++)
  280. {
  281. if( abs(Buffer1[j][i]-Buffer1[j+1][i])>defvalue )
  282. BufferReg[j][i]=255;
  283. }
  284. for(i=0;i<m_Width;i++)
  285. for(j=0;j<m_Height-1;j++)
  286. {
  287. if( abs(Buffer1[i][j]-Buffer1[i][j+1])>defvalue )
  288. BufferReg[i][j]=255;
  289. }
  290. }
  291. void CReconizeDlg::DrawRegion() //绘出二值图
  292. {
  293. // TODO: Add your command handler code here
  294. int i,j;
  295. CClientDC dc(this);
  296. for(i=0;i<m_Width;i++)  //rgb
  297. for(j=0;j<m_Height;j++)
  298. dc.SetPixel(i+1,j+1,RGB( BufferReg[i][j],
  299. BufferReg[i][j],
  300. BufferReg[i][j] )  );
  301. }///////////////////////////////////////////////////////////
  302. void CReconizeDlg::EraseDot()
  303. { //m_Width,m_Height
  304.   int i,j;
  305.     for(i=1;i<m_Width-1;i++)
  306. for(j=1;j<m_Height-1;j++)
  307. {
  308.    if( (BufferReg[i][j]!=BufferReg[i-1][j-1]) && (BufferReg[i][j]!=BufferReg[i][j-1])
  309.   && (BufferReg[i][j]!=BufferReg[i+1][j-1]) && (BufferReg[i][j]!=BufferReg[i-1][j])
  310.   && (BufferReg[i][j]!=BufferReg[i+1][j]) && (BufferReg[i][j]!=BufferReg[i-1][j+1])
  311.   &&(BufferReg[i][j]!=BufferReg[i][j+1]) && (BufferReg[i][j]!=BufferReg[i+1][j+1])
  312.   )
  313.   BufferReg[i][j]=255-BufferReg[i][j];  
  314. }///////////////////////////////////////
  315. }
  316. void CReconizeDlg::EraseDot2()
  317. {
  318. EraseDot();
  319. int i,j;
  320. for(i=4;i<m_Width-4;i++)
  321. for(j=4;j<m_Height-4;j++)
  322. {
  323. if( BufferReg[i-1][j-1]==BufferReg[i][j-1] 
  324. &&  BufferReg[i-1][j-1]==BufferReg[i+1][j-1] 
  325. && BufferReg[i-1][j-1]==BufferReg[i+2][j-1]
  326. && BufferReg[i-1][j-1]==BufferReg[i-1][j]
  327. && BufferReg[i-1][j-1]==BufferReg[i+2][j]
  328. && BufferReg[i-1][j-1]==BufferReg[i-1][j+1]
  329. && BufferReg[i-1][j-1]==BufferReg[i+2][j+1]
  330. && BufferReg[i-1][j-1]==BufferReg[i-1][j+2]
  331. && BufferReg[i-1][j-1]==BufferReg[i][j+2]
  332. && BufferReg[i-1][j-1]==BufferReg[i+1][j+2]
  333. && BufferReg[i-1][j-1]==BufferReg[i+2][j+2]
  334.    )
  335. {
  336. BufferReg[i][j]=BufferReg[i-1][j-1];
  337. BufferReg[i+1][j]=BufferReg[i-1][j-1];
  338. BufferReg[i][j+1]=BufferReg[i-1][j-1];
  339. BufferReg[i+1][j+1]=BufferReg[i-1][j-1];
  340. }
  341. }
  342. }
  343. void CReconizeDlg::Getpts() 
  344. {
  345. // TODO: Add your command handler code here
  346. int i,j,k,l;
  347. int flag1,flag2,flag3,flag4;
  348. int iflag;
  349. //初始化
  350. index1=0;    index2=0;    index3=0;    index4=0;    
  351. for(i=0;i<10000;i++)
  352. for(j=0;j<3;j++)
  353. {
  354. PointLT[i][j]=-1;
  355. PointRT[i][j]=-1;
  356. PointLB[i][j]=-1;
  357. PointRB[i][j]=-1;
  358. }
  359. int step=2;
  360. int longOffset=30;
  361. int shortOffset=2;
  362. int whitepercent=48;
  363. ///////////////////////////////////////////////////////////////////////
  364. //求左上角
  365. flag1=0; flag2=0; flag3=0; flag4=0;
  366. iflag=0; index1=0;
  367. for(i=longOffset;i<m_Width-longOffset;i++)
  368. {
  369. for(j=longOffset;j<m_Height-longOffset;j++)
  370. {
  371. for(k=1;k<=longOffset;k++)
  372. for(l=1;l<=shortOffset;l++)
  373. {
  374. if(BufferReg[i+k][j-l]==255)
  375. flag1+=1;
  376. }
  377. for(k=1;k<=longOffset;k++)
  378. for(l=1;l<=shortOffset;l++)
  379. {
  380. if(BufferReg[i+k][j+l]==255)
  381. flag2+=1;
  382. }
  383. for(k=1;k<=shortOffset;k++)
  384. for(l=1;l<=longOffset;l++)
  385. {
  386. if(BufferReg[i+k][j+l]==255)
  387. flag3+=1;
  388. }
  389. for(k=1;k<=shortOffset;k++)
  390. for(l=1;l<=longOffset;l++)
  391. {
  392. if(BufferReg[i-k][j+l]==255)
  393. flag4+=1;
  394. }
  395. if( (flag2>=whitepercent) && (flag3>=whitepercent) )
  396. {
  397. iflag=1;
  398. j+=step;
  399. PointLT[index1][0]=i;
  400. PointLT[index1][1]=j;
  401. PointLT[index1][2]=1;
  402. index1++;
  403. }
  404. /////////////////////////////////////////////////
  405. flag1=0; flag2=0; flag3=0; flag4=0;
  406. //////////////////////////////////////////////////
  407. }
  408. if(iflag==1)
  409. {
  410. i+=step;
  411. iflag=0;
  412. }
  413. }
  414. ////////////////////////////////////////////////////////////
  415. //求右上角
  416. flag1=0; flag2=0; flag3=0; flag4=0;
  417. iflag=0; index2=0;
  418. for(i=longOffset;i<m_Width-longOffset;i++)
  419. {
  420. for(j=longOffset;j<m_Height-longOffset;j++)
  421. {
  422. for(k=1;k<=longOffset;k++)
  423. for(l=1;l<=shortOffset;l++)
  424. {
  425. if(BufferReg[i-k][j-l]==255)
  426. flag1+=1;
  427. }
  428. for(k=1;k<=longOffset;k++)
  429. for(l=1;l<=shortOffset;l++)
  430. {
  431. if(BufferReg[i-k][j+l]==255)
  432. flag2+=1;
  433. }
  434. for(k=1;k<=shortOffset;k++)
  435. for(l=1;l<=longOffset;l++)
  436. {
  437. if(BufferReg[i-k][j+l]==255)
  438. flag3+=1;
  439. }
  440. for(k=1;k<=shortOffset;k++)
  441. for(l=1;l<=longOffset;l++)
  442. {
  443. if(BufferReg[i+k][j+l]==255)
  444. flag4+=1;
  445. }
  446. if( (flag2>=whitepercent) && (flag3>=whitepercent) )
  447. {
  448. iflag=1;
  449. j+=step;
  450. PointRT[index2][0]=i;
  451. PointRT[index2][1]=j;
  452. PointRT[index2][2]=1;
  453. index2++;
  454. }
  455. /////////////////////////////////////////////////
  456. flag1=0; flag2=0; flag3=0; flag4=0;
  457. //////////////////////////////////////////////////
  458. }
  459. if(iflag==1)
  460. {
  461. i+=step;
  462. iflag=0;
  463. }
  464. }
  465. /////////////////////////////////////////////////
  466. //求右下角
  467. flag1=0; flag2=0; flag3=0; flag4=0;
  468. iflag=0; index3=0;
  469. for(i=longOffset;i<m_Width-longOffset;i++)
  470. {
  471. for(j=longOffset;j<m_Height-longOffset;j++)
  472. {
  473. for(k=1;k<=longOffset;k++)
  474. for(l=1;l<=shortOffset;l++)
  475. {
  476. if(BufferReg[i-k][j+l]==255)
  477. flag1+=1;
  478. }
  479. for(k=1;k<=longOffset;k++)
  480. for(l=1;l<=shortOffset;l++)
  481. {
  482. if(BufferReg[i-k][j-l]==255)
  483. flag2+=1;
  484. }
  485. for(k=1;k<=shortOffset;k++)
  486. for(l=1;l<=longOffset;l++)
  487. {
  488. if(BufferReg[i-k][j-l]==255)
  489. flag3+=1;
  490. }
  491. for(k=1;k<=shortOffset;k++)
  492. for(l=1;l<=longOffset;l++)
  493. {
  494. if(BufferReg[i+k][j-l]==255)
  495. flag4+=1;
  496. }
  497. if( (flag2>=whitepercent) && (flag3>=whitepercent) )
  498. {
  499. iflag=1;
  500. j+=step;
  501. PointRB[index3][0]=i;
  502. PointRB[index3][1]=j;
  503. PointRB[index3][2]=1;
  504. index3++;
  505. }
  506. /////////////////////////////////////////////////
  507. flag1=0; flag2=0; flag3=0; flag4=0;
  508. //////////////////////////////////////////////////
  509. }
  510. if(iflag==1)
  511. {
  512. i+=step;
  513. iflag=0;
  514. }
  515. }
  516. ///////////////////////////////////////////////////////////
  517. //求左下角
  518. flag1=0; flag2=0; flag3=0; flag4=0;
  519. iflag=0; index4=0;
  520. for(i=longOffset;i<m_Width-longOffset;i++)
  521. {
  522. for(j=longOffset;j<m_Height-longOffset;j++)
  523. {
  524. for(k=1;k<=longOffset;k++)
  525. for(l=1;l<=shortOffset;l++)
  526. {
  527. if(BufferReg[i+k][j+l]==255)
  528. flag1+=1;
  529. }
  530. for(k=1;k<=longOffset;k++)
  531. for(l=1;l<=shortOffset;l++)
  532. {
  533. if(BufferReg[i+k][j-l]==255)
  534. flag2+=1;
  535. }
  536. for(k=1;k<=shortOffset;k++)
  537. for(l=1;l<=longOffset;l++) 
  538. {
  539. if(BufferReg[i+k][j-l]==255)
  540. flag3+=1;
  541. }
  542. for(k=1;k<=shortOffset;k++)
  543. for(l=1;l<=longOffset;l++)
  544. {
  545. if(BufferReg[i-k][j-l]==255)
  546. flag4+=1;
  547. }
  548. if( (flag2>=whitepercent) && (flag3>=whitepercent) )
  549. {
  550. iflag=1;
  551. j+=step;
  552. PointLB[index4][0]=i;
  553. PointLB[index4][1]=j;
  554. PointLB[index4][2]=1;
  555. index4++;
  556. }
  557. /////////////////////////////////////////////////
  558. flag1=0; flag2=0; flag3=0; flag4=0;
  559. //////////////////////////////////////////////////
  560. }
  561. if(iflag==1)
  562. {
  563. i+=step;
  564. iflag=0;
  565. }
  566. }
  567. /////////////////////////////////////////////////////////////////////
  568. }
  569. void CReconizeDlg::OnDrawEdge() //求出满足要求的四个顶点,并且绘制出来
  570. {
  571. // TODO: Add your command handler code here
  572. int i,j,k;
  573. Getpts() ;
  574. ///////  绘出左上角
  575. //CString tmpStr1;
  576. //tmpStr1.Format("左上角已求出:%d",index1);
  577. //MessageBox(tmpStr1);
  578. CClientDC dc(this);
  579. DrawRegion();
  580. for(i=0;i<index1;i++)
  581. {
  582. for(j=-1;j<=1;j++)
  583. for(k=-1;k<=1;k++)
  584. {
  585. dc.SetPixel(PointLT[i][0]+j,PointLT[i][1]+k,RGB(255,0,0) );
  586. }
  587. }
  588. ///////  绘出右上角
  589. ///tmpStr1.Format("右上角已求出: %d",index2);
  590. //MessageBox(tmpStr1);
  591. DrawRegion();
  592. for(i=0;i<index2;i++)
  593. {
  594. for(j=-1;j<=1;j++)
  595. for(k=-1;k<=1;k++)
  596. {
  597. dc.SetPixel(PointRT[i][0]+j,PointRT[i][1]+k,RGB(255,0,0) );
  598. }
  599. }
  600. ///////  绘出右下角
  601. //tmpStr1.Format("右下角已求出: %d",index3);
  602. //MessageBox(tmpStr1);
  603. DrawRegion();
  604. for(i=0;i<index3;i++)
  605. {
  606. for(j=-1;j<=1;j++)
  607. for(k=-1;k<=1;k++)
  608. {
  609. dc.SetPixel(PointRB[i][0]+j,PointRB[i][1]+k,RGB(255,0,0) );
  610. }
  611. }
  612. ///////  绘出左下角
  613. //tmpStr1.Format("左下角已求出: %d",index4);
  614. //MessageBox(tmpStr1);
  615. DrawRegion();
  616. for(i=0;i<index4;i++)
  617. {
  618. for(j=-1;j<=1;j++)
  619. for(k=-1;k<=1;k++)
  620. {
  621. dc.SetPixel(PointLB[i][0]+j,PointLB[i][1]+k,RGB(255,0,0) );
  622. }
  623. }
  624. ////////////////////////////////////////////////
  625. }
  626. void CReconizeDlg::OnDrawRect() 
  627. {
  628. // TODO: Add your control notification handler code here
  629. DrawAvgrect();
  630. }
  631. void CReconizeDlg::OnQuickReconize() 
  632. {
  633. // TODO: Add your control notification handler code here
  634. OnToGray(); //求出灰度图
  635. OnWhiteBlack();//求出二值图
  636. OnDrawEdge();//描点
  637. OnGetRect() ;//求矩形
  638. OnDrawRect(); //求出平均矩形
  639. }
  640. void CReconizeDlg::DrawRect()   //绘制矩形。
  641. {
  642. // TODO: Add your command handler code here
  643. MatchRect2();
  644. //CString tmpStr1;
  645. //tmpStr1.Format("acceptable rects: %d",indexRect);
  646. //MessageBox(tmpStr1);
  647. CClientDC dc(this);
  648. //OnDrawOrig();
  649. int i;
  650. for(i=0;i<indexRect;i++)
  651. {
  652. dc.MoveTo( PointLT[Rect[i][0]][0] , PointLT[Rect[i][0]][1] );
  653. dc.LineTo( PointRT[Rect[i][1]][0] , PointRT[Rect[i][1]][1] );
  654. dc.MoveTo( PointRT[Rect[i][1]][0] , PointRT[Rect[i][1]][1] );
  655. dc.LineTo( PointRB[Rect[i][2]][0] , PointRB[Rect[i][2]][1] );
  656. dc.MoveTo( PointRB[Rect[i][2]][0] , PointRB[Rect[i][2]][1] );
  657. dc.LineTo( PointLB[Rect[i][3]][0] , PointLB[Rect[i][3]][1] );
  658. dc.MoveTo( PointLB[Rect[i][3]][0] , PointLB[Rect[i][3]][1] );
  659. dc.LineTo( PointLT[Rect[i][0]][0] , PointLT[Rect[i][0]][1] );
  660. }
  661. }
  662. void CReconizeDlg::MatchRect2()
  663. {
  664. indexRect=0;
  665. int i,j,k,l;
  666. for(i=0;i<50000;i++)
  667. for(j=0;j<4;j++)
  668. Rect[i][j]=-1;
  669. ////////////i PointLT ;   j PointRT ;   k PointRB ;   l PointLB
  670. double x,y,rate, x1,y1,rate1;
  671. for(i=0;i<index1;i++)
  672. {
  673. Rect[indexRect][0]=i;
  674. for(j=0;j<index2;j++)
  675. {
  676. if( PointRT[j][0]>(PointLT[i][0]+80) && abs(PointRT[j][1]-PointLT[i][1])<10 )//符合要求的右上点
  677. {
  678. for(k=0;k<index3;k++)
  679. {
  680. if( abs(PointRB[k][0]-PointRT[j][0])<10 && PointRB[k][1]>(PointRT[j][1]+40) )//符合要求的右下点
  681. {
  682. for(l=0;l<index4;l++)
  683. {
  684. if(    PointLB[l][0]<PointRB[k][0]-80 && abs(PointLB[l][1]-PointRB[k][1])<10
  685. && abs(PointLB[l][0]-PointLT[i][0])<10 && PointLB[l][1]>PointLT[i][1]+40 )//符合要求的左下点
  686. {
  687. x = PointRT[j][0]-PointLT[i][0];
  688. y = PointRB[k][1]-PointRT[j][1]+0.001;
  689. x1= PointRB[k][0]-PointLB[l][0];
  690. y1= PointLB[l][1]-PointLT[i][1]+0.001;
  691. rate = x/y;
  692. rate1= x1/y1;
  693. if(rate>=2.7 && rate<=3.3 && rate1>=2.7 && rate1<=3.3)
  694. {
  695. Rect[indexRect][0]=i;
  696. Rect[indexRect][1]=j;
  697. Rect[indexRect][2]=k;
  698. Rect[indexRect][3]=l;
  699. indexRect++;
  700. }
  701. }
  702. }//for(l=0;l<index4;l++)
  703. }
  704. }//for(k=0;k<index3;k++)
  705. }
  706. }//for(j=0;j<index2;j++)
  707. }//for(i=0;i<index1;i++)
  708. }
  709. void CReconizeDlg::DrawAvgrect() //求出平均矩形。
  710. {
  711. // TODO: Add your command handler code here
  712. AvgRect();
  713. DrawBMP();
  714. CClientDC dc(this);
  715. CPen p(PS_SOLID,1,RGB(255,0,0));
  716. dc.SelectObject(p);
  717. DrawBMP();
  718. int i;
  719. for(i=0;i<avgindexRect;i++)
  720. {
  721. dc.MoveTo( avgPointLT[i][0] , avgPointLT[i][1] );
  722. dc.LineTo( avgPointRT[i][0] , avgPointRT[i][1] );
  723. dc.MoveTo( avgPointRT[i][0] , avgPointRT[i][1] );
  724. dc.LineTo( avgPointRB[i][0] , avgPointRB[i][1] );
  725. dc.MoveTo( avgPointRB[i][0] , avgPointRB[i][1] );
  726. dc.LineTo( avgPointLB[i][0] , avgPointLB[i][1] );
  727. dc.MoveTo( avgPointLB[i][0] , avgPointLB[i][1] );
  728. dc.LineTo( avgPointLT[i][0] , avgPointLT[i][1] );
  729. }
  730. }
  731. bool CReconizeDlg::MatchRectPoint(int i,int j)
  732. { int Distance,k;    //两个矩形的顶点相距参数
  733.   bool flag=true;
  734.   Distance=25;
  735.   for(k=0;flag&&k<2;k++)
  736.  if(abs(PointLT[Rect[i][0]][k]-PointLT[Rect[j][0]][k])<=Distance
  737.  &&abs(PointRT[Rect[i][1]][k]-PointRT[Rect[j][1]][k])<=Distance
  738.  &&abs(PointRB[Rect[i][2]][k]-PointRB[Rect[j][2]][k])<=Distance
  739.  &&abs(PointLB[Rect[i][3]][k]-PointLB[Rect[j][3]][k])<=Distance
  740.    )
  741.         flag=true;
  742.    else flag=false;
  743.   return(flag); 
  744. }
  745. void CReconizeDlg::AvgRect()
  746. {
  747.     bool AlreadyRect[50000];
  748.     int i,j,k,count,tempLT[2],tempRT[2],tempRB[2],tempLB[2];
  749. avgindexRect=0;
  750. for(i=0;i<2;i++)
  751. {
  752.    tempLT[i]=0;
  753.        tempLB[i]=0;
  754.    tempRT[i]=0;
  755.    tempRB[i]=0;
  756. }
  757. for( i=0;i<50000;i++)
  758. {
  759.    AlreadyRect[i]=false;
  760. }
  761.     for( i=0;i<indexRect;i++)
  762.  if(!AlreadyRect[i])
  763. {  
  764.   count=1;
  765.   for(k=0;k<2;k++)
  766.   {
  767. tempLT[k]=PointLT[Rect[i][0]][k];
  768. tempLB[k]=PointLB[Rect[i][3]][k];
  769. tempRT[k]=PointRT[Rect[i][1]][k];
  770. tempRB[k]=PointRB[Rect[i][2]][k];
  771.   }
  772.   for(j=i+1;j<indexRect;j++)
  773.   {
  774.    if(!AlreadyRect[j])
  775.  if(MatchRectPoint(i,j))
  776.  {
  777.   AlreadyRect[i]=true;
  778.   AlreadyRect[j]=true;
  779.   count++;
  780.   for(k=0;k<2;k++)
  781.    {
  782. tempLT[k]+=PointLT[Rect[j][0]][k];
  783. tempLB[k]+=PointLB[Rect[j][3]][k];
  784. tempRT[k]+=PointRT[Rect[j][1]][k];
  785. tempRB[k]+=PointRB[Rect[j][2]][k];
  786.   }
  787.  }
  788.   }
  789.   for(k=0;k<2;k++)
  790.   {
  791.   avgPointLT[avgindexRect][k]=int(tempLT[k]/(count*1.0));
  792.   avgPointRT[avgindexRect][k]=int(tempRT[k]/(count*1.0));
  793.   avgPointRB[avgindexRect][k]=int(tempRB[k]/(count*1.0));
  794.   avgPointLB[avgindexRect][k]=int(tempLB[k]/(count*1.0));
  795.   }
  796.   avgindexRect++;
  797.  }
  798.  }  
  799. }
  800. void CReconizeDlg::JumpCal(int index)
  801. {
  802. int point[6][2];
  803. point[0][0]= (avgPointLT[index][0] + avgPointLB[index][0])/2;
  804. point[2][0]= point[0][0];
  805. point[4][0]= point[0][0];
  806. point[1][0]= (avgPointRT[index][0] + avgPointRB[index][0])/2;
  807. point[3][0]= point[1][0];
  808. point[5][0]= point[1][0];
  809. point[0][1]= int(( avgPointLT[index][1]*0.75+avgPointLB[index][1]*0.25 
  810.  +avgPointRT[index][1]*0.75+avgPointRB[index][1]*0.25 )/2);
  811. point[1][1]=point[0][1];
  812. point[2][1]= int(( avgPointLT[index][1]*0.5+avgPointLB[index][1]*0.5 
  813.  +avgPointRT[index][1]*0.5+avgPointRB[index][1]*0.5 )/2);
  814. point[3][1]=point[2][1];
  815. point[4][1]= int(( avgPointLT[index][1]*0.25+avgPointLB[index][1]*0.75 
  816.  +avgPointRT[index][1]*0.25+avgPointRB[index][1]*0.75 )/2);
  817. point[5][1]=point[4][1];
  818. int jump[3],i;
  819. for(i=0;i<3;i++)
  820. jump[i]=0;
  821. int length=point[1][0]-point[0][0]-1;
  822. int BufLine[800],j;
  823. float sumHd;
  824. int avgHd;
  825. int prePt,diffhappen;
  826. for(i=0;i<3;i++)
  827. {
  828. sumHd=0;
  829. for(j=0;j<length;j++)
  830. {
  831. BufLine[j]=Buffer1[ point[i*2][0]+j+1 ][point[i*2][1]];
  832. sumHd+=BufLine[j];
  833. }
  834. avgHd=(int)(sumHd/length);
  835. for(j=0;j<length;j++)
  836. if(BufLine[j]> avgHd)
  837. BufLine[j]=1;
  838. else
  839. BufLine[j]=0;
  840. prePt=0;
  841. diffhappen=0;
  842. for(j=1;j<length;j++)
  843. {
  844. if(diffhappen==1)//是否j之前一点已经与prePt不同
  845. {
  846. if( (j-prePt)>=(length/9) && BufLine[j]==BufLine[prePt] )
  847. {
  848. jump[i]++;
  849. prePt=j;
  850. diffhappen=0;
  851. }
  852. }
  853. else
  854. if(BufLine[j]!=BufLine[prePt])
  855. diffhappen=1;
  856. }
  857. }
  858. int enoughjump=7;
  859. if(jump[0]>=enoughjump && jump[1]>=enoughjump && jump[2]>=enoughjump)
  860. {
  861. HaveJumpRectLT[JumpindexRect][0]=avgPointLT[index][0];
  862. HaveJumpRectLT[JumpindexRect][1]=avgPointLT[index][1];
  863. HaveJumpRectRT[JumpindexRect][0]=avgPointRT[index][0];
  864. HaveJumpRectRT[JumpindexRect][1]=avgPointRT[index][1];
  865. HaveJumpRectRB[JumpindexRect][0]=avgPointRB[index][0];
  866. HaveJumpRectRB[JumpindexRect][1]=avgPointRB[index][1];
  867. HaveJumpRectLB[JumpindexRect][0]=avgPointLB[index][0];
  868. HaveJumpRectLB[JumpindexRect][1]=avgPointLB[index][1];
  869. JumpindexRect++;
  870. }
  871. }
  872. int CReconizeDlg::PickColor(int index)
  873. {   
  874.    int i,j,blueNum,whiteNum,blackNum,yellowNum,allNum;
  875.    blueNum=0;
  876.    blackNum=0;
  877.    yellowNum=0;
  878.    whiteNum=0;
  879.    for(i= (HaveJumpRectLT[index][0]+HaveJumpRectLB[index][0]) /2 ;
  880.        i< (HaveJumpRectRT[index][0]+HaveJumpRectRB[index][0]) /2;
  881.    i++)
  882.  for(j=(HaveJumpRectLT[index][1]+HaveJumpRectRT[index][1])/2;
  883.  j=(HaveJumpRectLB[index][1]+HaveJumpRectRB[index][1])/2;
  884.  j++)
  885.    {
  886.      if(2*Buffer[i][j][0]-Buffer[i][j][1]-Buffer[i][j][2]>0)
  887.             blueNum++;
  888.  if((Buffer[i][j][0]>=200)
  889.   &&(Buffer[i][j][0]>=200)
  890.   &&(Buffer[i][j][0]>=200)
  891.   &&(abs(Buffer[i][j][0]-Buffer[i][j][1])<25)
  892.   &&(abs(Buffer[i][j][0]-Buffer[i][j][2])<25)
  893.   &&(abs(Buffer[i][j][1]-Buffer[i][j][2])<25)
  894.   )    
  895.  whiteNum++;
  896.  if( (Buffer[i][j][2]+Buffer[i][j][1]-2*Buffer[i][j][0])>0
  897.  && ( abs(Buffer[i][j][2]-Buffer[i][j][1])<20) )
  898.           yellowNum++;
  899.      if( (Buffer[i][j][0]<=55)
  900.   &&(Buffer[i][j][0]<=55)
  901.   &&(Buffer[i][j][0]>=55)
  902.   &&(abs(Buffer[i][j][0]-Buffer[i][j][1])<25)
  903.   &&(abs(Buffer[i][j][0]-Buffer[i][j][2])<25)
  904.   &&(abs(Buffer[i][j][1]-Buffer[i][j][2])<25)
  905.   )    
  906.  blackNum++;
  907. }
  908.    allNum=i*j;
  909.    if( (blueNum/ (1.0*allNum) >0.5) && (whiteNum/(1.0*allNum)>0.1)  )
  910.    return 1;
  911.    if((yellowNum/ (1.0*allNum) >0.5) && (blackNum/(1.0*allNum)>0.1)) 
  912.        return 2;
  913.    if((blackNum/ (1.0*allNum) >0.5) && (whiteNum/(1.0*allNum)>0.1)) 
  914.        return 3;
  915.    if((whiteNum/ (1.0*allNum) >0.5) && (blackNum/(1.0*allNum)>0.1)) 
  916.        return 4;
  917.    return 5;
  918. }
  919. void CReconizeDlg::OnGetRect() 
  920. {
  921. // TODO: Add your control notification handler code here
  922. DrawRect();
  923. }