IntegralFeaturesSame.cpp
上传用户:lijia5631
上传日期:2008-11-10
资源大小:1214k
文件大小:26k
源码类别:

视频捕捉/采集

开发平台:

MultiPlatform

  1. /**
  2.   * cubicles
  3.   *
  4.   * This is an implementation of the Viola-Jones object detection 
  5.   * method and some extensions.  The code is mostly platform-
  6.   * independent and uses only standard C and C++ libraries.  It
  7.   * can make use of MPI for parallel training and a few Windows
  8.   * MFC functions for classifier display.
  9.   *
  10.   * Mathias Kolsch, matz@cs.ucsb.edu
  11.   *
  12.   * $Id: IntegralFeaturesSame.cpp,v 1.29 2004/11/11 01:58:58 matz Exp $
  13. **/
  14. // IntegralFeatures describe the rectangular areas whose pixel
  15. // sums are compared to a weak classifier's threshold.  There
  16. // are many different types of IntegralFeatures.
  17. // IntegralFeaturesSame are features just as IntegralFeatures, 
  18. // but their rectangular regions observe more stringent constraints
  19. // during feature instance generation (see SetToNextIncarnation).
  20. // Functions for reading from files are flex/bison generated from
  21. // CascadeFileScanner.lex and CascadeFileParser.yy.
  22. //
  23. ////////////////////////////////////////////////////////////////////
  24. //
  25. // By downloading, copying, installing or using the software you 
  26. // agree to this license.  If you do not agree to this license, 
  27. // do not download, install, copy or use the software.
  28. //
  29. // Copyright (C) 2004, Mathias Kolsch, all rights reserved.
  30. // Third party copyrights are property of their respective owners.
  31. //
  32. // Redistribution and use in binary form, with or without 
  33. // modification, is permitted for non-commercial purposes only.
  34. // Redistribution in source, with or without modification, is 
  35. // prohibited without prior written permission.
  36. // If granted in writing in another document, personal use and 
  37. // modification are permitted provided that the following two
  38. // conditions are met:
  39. //
  40. // 1.Any modification of source code must retain the above 
  41. //   copyright notice, this list of conditions and the following 
  42. //   disclaimer.
  43. //
  44. // 2.Redistribution's in binary form must reproduce the above 
  45. //   copyright notice, this list of conditions and the following 
  46. //   disclaimer in the documentation and/or other materials provided
  47. //   with the distribution.
  48. //
  49. // This software is provided by the copyright holders and 
  50. // contributors "as is" and any express or implied warranties, 
  51. // including, but not limited to, the implied warranties of 
  52. // merchantability and fitness for a particular purpose are 
  53. // disclaimed.  In no event shall the copyright holder or 
  54. // contributors be liable for any direct, indirect, incidental, 
  55. // special, exemplary, or consequential damages (including, but not 
  56. // limited to, procurement of substitute goods or services; loss of 
  57. // use, data, or profits; or business interruption) however caused
  58. // and on any theory of liability, whether in contract, strict 
  59. // liability, or tort (including negligence or otherwise) arising 
  60. // in any way out of the use of this software, even if advised of 
  61. // the possibility of such damage.
  62. //
  63. ////////////////////////////////////////////////////////////////////
  64. #include "cubicles.hpp"
  65. #include "IntegralFeatures.h"
  66. #include "Exceptions.h"
  67. #include <iostream>
  68. #ifdef _DEBUG
  69. #ifdef USE_MFC
  70. #define new DEBUG_NEW
  71. #undef THIS_FILE
  72. static char THIS_FILE[] = __FILE__;
  73. #endif // USE_MFC
  74. #endif // _DEBUG
  75. #ifdef WIN32
  76. #include <malloc.h>
  77. #define alloca _alloca
  78. #endif
  79. /////////////////////////////////////////////////////////////////////////////
  80. //
  81. // CLeftRightSameIF classes implementation
  82. //
  83. /////////////////////////////////////////////////////////////////////////////
  84. CLeftRightSameIF::CLeftRightSameIF(int templateWidth, int templateHeight)
  85.   : CLeftRightIF(templateWidth, templateHeight) 
  86. {
  87. }
  88. CLeftRightSameIF::CLeftRightSameIF(const CLeftRightSameIF& frm)
  89.   : CLeftRightIF(frm) 
  90. {
  91. }
  92. CLeftRightSameIF::CLeftRightSameIF(int templateWidth, int templateHeight,
  93.                            int _toprow, int _bottomrow,
  94.                            int _leftrect_leftcol, int _centercol,
  95.                            int _rightrect_rightcol)
  96.   : CLeftRightIF(templateWidth, templateHeight) 
  97. {
  98.   toprow = _toprow;
  99.   bottomrow = _bottomrow;
  100.   leftrect_leftcol = _leftrect_leftcol;
  101.   centercol = _centercol;
  102.   rightrect_rightcol = _rightrect_rightcol;
  103.   SetNonOverlap();
  104. }
  105. CLeftRightSameIF::CLeftRightSameIF(istream& is, int template_width, int template_height)
  106.   : CLeftRightIF(template_width, template_height)
  107. {
  108.   char a, b, c;
  109.   string str;
  110.   is >> toprow >> a >> bottomrow >> str
  111.      >> leftrect_leftcol >> b >> centercol >> c >> rightrect_rightcol;
  112.   if (a!=',' || b!=',' || c!=',' || str!="x") {
  113.     char* buf = (char*) alloca((256+str.length())*sizeof(char));
  114.     sprintf(buf, "error during construction of LeftRightSameIF (%c|%c|%c|%s)n",
  115.    a, b, c, str.c_str());
  116.     throw ITException(buf);
  117.   }
  118.   SetNonOverlap();
  119. }
  120. bool CLeftRightSameIF::SetToNextIncarnation()
  121. {
  122. if (m_is_partial) {
  123. if (m_remaining_incarnations) {
  124. m_remaining_incarnations--;
  125. } else {
  126. return false;
  127. }
  128. }
  129. rightrect_rightcol+=2;
  130. centercol++;
  131. if (rightrect_rightcol>=m_template_width) {
  132. leftrect_leftcol++;
  133. if (leftrect_leftcol==m_template_width-2) {
  134. bottomrow++;
  135. if (bottomrow==m_template_height) {
  136. toprow++;
  137. if (toprow==m_template_height-1) {
  138. return false;
  139. }
  140. bottomrow=toprow+1;
  141. }
  142. leftrect_leftcol=-1;
  143. }
  144. centercol=leftrect_leftcol+1;
  145. rightrect_rightcol=centercol+1;
  146. }
  147.     SetNonOverlap();
  148. return true;
  149. }
  150. CIntegralFeature* CLeftRightSameIF::Copy() const
  151. {
  152. return new CLeftRightSameIF(*this);
  153. }
  154. ostream& CLeftRightSameIF::output(ostream& os) const
  155. {
  156.   os << "LeftRightSame " << toprow << "," << bottomrow << " x ";
  157.   os << leftrect_leftcol << "," << centercol << "," << rightrect_rightcol;
  158.   return os;
  159. }
  160. /////////////////////////////////////////////////////////////////////////////
  161. //
  162. // CUpDownSameIF classes implementation
  163. //
  164. /////////////////////////////////////////////////////////////////////////////
  165. CUpDownSameIF::CUpDownSameIF(int templateWidth, int templateHeight)
  166.   : CUpDownIF(templateWidth, templateHeight) 
  167. {
  168. }
  169. CUpDownSameIF::CUpDownSameIF(const CUpDownSameIF& frm)
  170.   : CUpDownIF(frm) 
  171. {
  172. }
  173. CUpDownSameIF::CUpDownSameIF(int templateWidth, int templateHeight,
  174.                      int _toprect_toprow, int _centerrow,
  175.                      int _bottomrect_bottomrow,
  176.                      int _leftcol, int _rightcol)
  177.   : CUpDownIF(templateWidth, templateHeight) 
  178. {
  179.   toprect_toprow = _toprect_toprow;
  180.   centerrow = _centerrow;
  181.   bottomrect_bottomrow = _bottomrect_bottomrow;
  182.   leftcol = _leftcol;
  183.   rightcol = _rightcol;
  184.   SetNonOverlap();
  185. }
  186. CUpDownSameIF::CUpDownSameIF(istream& is, int templateWidth, int templateHeight)
  187.   : CUpDownIF(templateWidth, templateHeight) 
  188. {
  189.   char a, b, c;
  190.   string str;
  191.   is >> toprect_toprow >> a >> centerrow >> b
  192.      >> bottomrect_bottomrow >> str >> leftcol >> c >> rightcol;
  193.   if (a!=',' || b!=',' || c!=',' || str!="x") {
  194.     char* buf = (char*) alloca((256+str.length())*sizeof(char));
  195.     sprintf(buf, "error during construction of UpDownSameIF (%c|%c|%c|%s)n",
  196.    a, b, c, str.c_str());
  197.     throw ITException(buf);
  198.   }
  199.   SetNonOverlap();
  200. }
  201. bool CUpDownSameIF::SetToNextIncarnation()
  202. {
  203. if (m_is_partial) {
  204. if (m_remaining_incarnations) {
  205. m_remaining_incarnations--;
  206. } else {
  207. return false;
  208. }
  209. }
  210. bottomrect_bottomrow+=2;
  211. centerrow++;
  212. if (bottomrect_bottomrow>=m_template_height) {
  213. toprect_toprow++;
  214. if (toprect_toprow==m_template_height-2) {
  215. rightcol++;
  216. if (rightcol==m_template_width) {
  217. leftcol++;
  218. if (leftcol==m_template_width-1) {
  219. return false;
  220. }
  221. rightcol=leftcol+1;
  222. }
  223. toprect_toprow=-1;
  224. }
  225. centerrow=toprect_toprow+1;
  226. bottomrect_bottomrow=centerrow+1;
  227. }
  228.     SetNonOverlap();
  229. return true;
  230. }
  231. CIntegralFeature* CUpDownSameIF::Copy() const
  232. {
  233. return new CUpDownSameIF(*this);
  234. }
  235. ostream& CUpDownSameIF::output(ostream& os) const
  236. {
  237.   os << "UpDownSame " << toprect_toprow << "," << centerrow 
  238.      << "," << bottomrect_bottomrow << " x ";
  239.   os << leftcol << "," << rightcol;
  240.   return os;
  241. }
  242. /////////////////////////////////////////////////////////////////////////////
  243. //
  244. // CLeftCenterRightSameIF classes implementation
  245. //
  246. /////////////////////////////////////////////////////////////////////////////
  247. CLeftCenterRightSameIF::CLeftCenterRightSameIF(int templateWidth, int templateHeight)
  248.   : CLeftCenterRightIF(templateWidth, templateHeight) 
  249. {
  250. }
  251. CLeftCenterRightSameIF::CLeftCenterRightSameIF(int templateWidth, int templateHeight,
  252.                                        int _toprow, int _bottomrow,
  253.                                        int _leftrect_leftcol, int _leftrect_rightcol,
  254.                                        int _rightrect_leftcol,
  255.                                        int _rightrect_rightcol)
  256.   : CLeftCenterRightIF(templateWidth, templateHeight) 
  257. {
  258.   toprow = _toprow;
  259.   bottomrow = _bottomrow;
  260.   leftrect_leftcol = _leftrect_leftcol;
  261.   leftrect_rightcol = _leftrect_rightcol;
  262.   rightrect_leftcol = _rightrect_leftcol;
  263.   rightrect_rightcol = _rightrect_rightcol;
  264.   SetNonOverlap();
  265. }
  266. CLeftCenterRightSameIF::CLeftCenterRightSameIF(const CLeftCenterRightSameIF& frm)
  267.   : CLeftCenterRightIF(frm) 
  268. {
  269. }
  270. CLeftCenterRightSameIF::CLeftCenterRightSameIF(istream& is, int templateWidth, int templateHeight)
  271.   : CLeftCenterRightIF(templateWidth, templateHeight) 
  272. {
  273.   char a, b, c;
  274.   string strx, strslash;
  275.   is >> toprow >> a >> bottomrow >> strx 
  276.      >> leftrect_leftcol >> b >> leftrect_rightcol >> strslash
  277.      >> rightrect_leftcol >> c >> rightrect_rightcol;
  278.   if (a!=',' || b!=',' || c!=',' || strx!="x" || strslash!="/") {
  279.     char* buf = (char*) alloca((256+strx.length()+strslash.length())*sizeof(char));
  280.     sprintf(buf, "error during construction of LeftCenterRightSameIF (%c|%c|%c|%s|%s)n",
  281.    a, b, c, strx.c_str(), strslash.c_str());
  282.     throw ITException(buf);
  283.   }
  284.   SetNonOverlap();
  285. }
  286. bool CLeftCenterRightSameIF::SetToNextIncarnation()
  287. {
  288. if (m_is_partial) {
  289. if (m_remaining_incarnations) {
  290. m_remaining_incarnations--;
  291. } else {
  292. return false;
  293. }
  294. }
  295. rightrect_rightcol+=3;
  296. rightrect_leftcol+=2;
  297. leftrect_rightcol++;
  298. if (rightrect_rightcol>=m_template_width) {
  299. leftrect_leftcol++;
  300. if (leftrect_leftcol==m_template_width-3) {
  301. bottomrow++;
  302. if (bottomrow==m_template_height) {
  303. toprow++;
  304. if (toprow==m_template_height-1) {
  305. return false;
  306. }
  307. bottomrow=toprow+1;
  308. }
  309. leftrect_leftcol=0;
  310. }
  311. leftrect_rightcol=leftrect_leftcol+1;
  312. rightrect_leftcol=leftrect_rightcol+1;
  313. rightrect_rightcol=rightrect_leftcol+1;
  314. }
  315.     SetNonOverlap();
  316. return true;
  317. }
  318. CIntegralFeature* CLeftCenterRightSameIF::Copy() const 
  319. {
  320.   return new CLeftCenterRightSameIF(*this);
  321. }
  322. ostream& CLeftCenterRightSameIF::output(ostream& os) const
  323. {
  324.   os << "LeftCenterRightSame " << toprow << "," << bottomrow << " x ";
  325.   os << leftrect_leftcol << "," << leftrect_rightcol << " / ";
  326.   os << rightrect_leftcol << "," << rightrect_rightcol;
  327.   return os;
  328. }
  329. /////////////////////////////////////////////////////////////////////////////
  330. //
  331. // CSevenColumnsSameIF classes implementation
  332. //
  333. /////////////////////////////////////////////////////////////////////////////
  334. CSevenColumnsSameIF::CSevenColumnsSameIF(int templateWidth, int templateHeight)
  335.   : CSevenColumnsIF(templateWidth, templateHeight) 
  336. {
  337. }
  338. CSevenColumnsSameIF::CSevenColumnsSameIF(int templateWidth, int templateHeight,
  339.                                  int _toprow, int _bottomrow,
  340.                                  int _1, int _2, int _3, int _4, int _5, int _6,
  341.                                  int _7, int _8)
  342.   : CSevenColumnsIF(templateWidth, templateHeight) 
  343. {
  344.   toprow = _toprow;
  345.   bottomrow = _bottomrow;
  346.   col1_left = _1;
  347.   col2_left = _2;
  348.   col3_left = _3;
  349.   col4_left = _4;
  350.   col5_left = _5;
  351.   col6_left = _6;
  352.   col7_left = _7;
  353.   col7_right = _8;
  354.   SetNonOverlap();
  355. }
  356. CSevenColumnsSameIF::CSevenColumnsSameIF(const CSevenColumnsSameIF& frm)
  357.   : CSevenColumnsIF(frm) 
  358. {
  359. }
  360. CSevenColumnsSameIF::CSevenColumnsSameIF(istream& is, int template_width, int template_height)
  361.   : CSevenColumnsIF(is, template_width, template_height)
  362. {
  363. }
  364. bool CSevenColumnsSameIF::SetToNextIncarnation()
  365. {
  366. if (m_is_partial) {
  367. if (m_remaining_incarnations) {
  368. m_remaining_incarnations--;
  369. } else {
  370. return false;
  371. }
  372. }
  373. col1_left += 1;
  374. col2_left += 2;
  375. col3_left += 3;
  376. col4_left += 4;
  377. col5_left += 5;
  378. col6_left += 6;
  379. col7_left += 7;
  380. col7_right += 8;
  381. if (col7_right>=m_template_width) {
  382.     col1_left ++;
  383.     if (col1_left>=m_template_width-7) {
  384.   bottomrow++;
  385.   if (bottomrow==m_template_height) {
  386.   toprow++;
  387.   if (toprow==m_template_height-1) {
  388.   return false;
  389.   }
  390.   bottomrow=toprow+1;
  391.   }
  392.       col1_left = -1;
  393.     }
  394.     col2_left = col1_left+1;
  395.     col3_left = col2_left+1;
  396.     col4_left = col3_left+1;
  397.     col5_left = col4_left+1;
  398.     col6_left = col5_left+1;
  399.     col7_left = col6_left+1;
  400.     col7_right= col7_left+1;
  401. }
  402.   SetNonOverlap();
  403. return true;
  404. }
  405. CIntegralFeature* CSevenColumnsSameIF::Copy() const
  406. {
  407. return new CSevenColumnsSameIF(*this);
  408. }
  409. ostream& CSevenColumnsSameIF::output(ostream& os) const
  410. {
  411.   os << "SevenColumnsSame " << toprow << "," << bottomrow << " x ";
  412.   os << col1_left << "," << col2_left << "," << col3_left << "," << col4_left << ",";
  413.   os << col5_left << "," << col6_left << "," << col7_left << "," << col7_right;
  414.   return os;
  415. }
  416. /////////////////////////////////////////////////////////////////////////////
  417. //
  418. // CSevenColumnsSimilarIF classes implementation
  419. //
  420. /////////////////////////////////////////////////////////////////////////////
  421. CSevenColumnsSimilarIF::CSevenColumnsSimilarIF(int templateWidth, int templateHeight)
  422.   : CSevenColumnsIF(templateWidth, templateHeight) 
  423. {
  424. }
  425. CSevenColumnsSimilarIF::CSevenColumnsSimilarIF(int templateWidth, int templateHeight,
  426.                                  int _toprow, int _bottomrow,
  427.                                  int _1, int _2, int _3, int _4, int _5, int _6,
  428.                                  int _7, int _8)
  429.   : CSevenColumnsIF(templateWidth, templateHeight) 
  430. {
  431.   toprow = _toprow;
  432.   bottomrow = _bottomrow;
  433.   col1_left = _1;
  434.   col2_left = _2;
  435.   col3_left = _3;
  436.   col4_left = _4;
  437.   col5_left = _5;
  438.   col6_left = _6;
  439.   col7_left = _7;
  440.   col7_right = _8;
  441.   SetNonOverlap();
  442. }
  443. CSevenColumnsSimilarIF::CSevenColumnsSimilarIF(const CSevenColumnsSimilarIF& frm)
  444.   : CSevenColumnsIF(frm) 
  445. {
  446. }
  447. CSevenColumnsSimilarIF::CSevenColumnsSimilarIF(istream& is, int template_width, int template_height)
  448.   : CSevenColumnsIF(is, template_width, template_height)
  449. {
  450. }
  451. bool CSevenColumnsSimilarIF::SetToNextIncarnation()
  452. {
  453. if (m_is_partial) {
  454. if (m_remaining_incarnations) {
  455. m_remaining_incarnations--;
  456. } else {
  457. return false;
  458. }
  459. }
  460. col2_left += 1;
  461. col3_left += 1;
  462. col4_left += 2;
  463. col5_left += 2;
  464. col6_left += 3;
  465. col7_left += 3;
  466. col7_right+= 4;
  467. if (col7_right>=m_template_width) {
  468. int new_even_width = col3_left-col2_left+1;
  469. col2_left = col1_left+1;
  470. col3_left = col2_left+new_even_width;
  471. col4_left = col3_left+1;
  472. col5_left = col4_left+new_even_width;
  473. col6_left = col5_left+1;
  474. col7_left = col6_left+new_even_width;
  475. col7_right= col7_left+1;
  476. if (col7_right>=m_template_width) {
  477. col1_left += 1;
  478. if (col1_left>=m_template_width-7) {
  479. bottomrow++;
  480. if (bottomrow==m_template_height) {
  481. toprow++;
  482. if (toprow==m_template_height-1) {
  483. return false;
  484. }
  485. bottomrow = toprow+1;
  486. }
  487. col1_left = -1;
  488. }
  489. col2_left = col1_left+1;
  490. col3_left = col2_left+1;
  491. col4_left = col3_left+1;
  492. col5_left = col4_left+1;
  493. col6_left = col5_left+1;
  494. col7_left = col6_left+1;
  495. col7_right = col7_left+1;
  496. }
  497. }
  498. SetNonOverlap();
  499. return true;
  500. }
  501. CIntegralFeature* CSevenColumnsSimilarIF::Copy() const
  502. {
  503. return new CSevenColumnsSimilarIF(*this);
  504. }
  505. ostream& CSevenColumnsSimilarIF::output(ostream& os) const
  506. {
  507.   os << "SevenColumnsSimilar " << toprow << "," << bottomrow << " x ";
  508.   os << col1_left << "," << col2_left << "," << col3_left << "," << col4_left << ",";
  509.   os << col5_left << "," << col6_left << "," << col7_left << "," << col7_right;
  510.   return os;
  511. }
  512. /////////////////////////////////////////////////////////////////////////////
  513. //
  514. // CDiagSameIF classes implementation
  515. //
  516. /////////////////////////////////////////////////////////////////////////////
  517. CDiagSameIF::CDiagSameIF(int templateWidth, int templateHeight)
  518.   : CDiagIF(templateWidth, templateHeight) 
  519. {
  520. }
  521. CDiagSameIF::CDiagSameIF(int templateWidth, int templateHeight,
  522.         int _toprect_toprow, int _centerrow,
  523.         int _bottomrect_bottomrow,
  524.         int _leftrect_leftcol, int _centercol,
  525.         int _rightrect_rightcol)
  526.   : CDiagIF(templateWidth, templateHeight) 
  527. {
  528.   toprect_toprow = _toprect_toprow;
  529.   centerrow = _centerrow;
  530.   bottomrect_bottomrow = _bottomrect_bottomrow;
  531.   leftrect_leftcol = _leftrect_leftcol;
  532.   centercol = _centercol;
  533.   rightrect_rightcol = _rightrect_rightcol;
  534.   SetNonOverlap();
  535. }
  536. CDiagSameIF::CDiagSameIF(const CDiagSameIF& frm)
  537.   : CDiagIF(frm) 
  538. {
  539. }
  540. CDiagSameIF::CDiagSameIF(istream& is, int templateWidth, int templateHeight)
  541.   : CDiagIF(templateWidth, templateHeight) 
  542. {
  543.   char a, b, c, d;
  544.   string str;
  545.   is >> toprect_toprow >> a >> centerrow >> b
  546.      >> bottomrect_bottomrow >> str
  547.      >> leftrect_leftcol >> c >> centercol >> d
  548.      >> rightrect_rightcol;
  549.   if (a!=',' || b!=',' || str!="x" || c!=',' || d!=',') {
  550.     char* buf = (char*) alloca((256+str.length())*sizeof(char));
  551.     sprintf(buf, "error during construction of DiagSameIF (%c|%c|%s|%c|%c)n",
  552.    a, b, str.c_str(), c, d);
  553.     throw ITException(buf);
  554.   }
  555.   SetNonOverlap();
  556. }
  557. bool CDiagSameIF::SetToNextIncarnation()
  558. {
  559.   if (m_is_partial) {
  560.     if (m_remaining_incarnations) {
  561.       m_remaining_incarnations--;
  562.     } else {
  563.       return false;
  564.     }
  565.   }
  566.   bottomrect_bottomrow+=2;
  567.   centerrow++;
  568.   if (bottomrect_bottomrow>=m_template_height) {
  569.     toprect_toprow++;
  570.     if (toprect_toprow==m_template_height-2) {
  571.       rightrect_rightcol+=2;
  572.       centercol++;
  573.       if (rightrect_rightcol>=m_template_width) {
  574. leftrect_leftcol++;
  575. if (leftrect_leftcol==m_template_width-2) {
  576.   return false;
  577. }
  578. centercol=leftrect_leftcol+1;
  579. rightrect_rightcol=centercol+1;
  580.       }
  581.       toprect_toprow=-1;
  582.     }
  583.     centerrow=toprect_toprow+1;
  584.     bottomrect_bottomrow=centerrow+1;
  585.   }
  586.   SetNonOverlap();
  587.   return true;
  588. }
  589. CIntegralFeature* CDiagSameIF::Copy() const
  590. {
  591.   return new CDiagSameIF(*this);
  592. }
  593. ostream& CDiagSameIF::output(ostream& os) const
  594. {
  595.   os << "DiagSame " << toprect_toprow << "," << centerrow 
  596.      << "," << bottomrect_bottomrow << " x ";
  597.   os << leftrect_leftcol << "," << centercol
  598.      << "," << rightrect_rightcol;
  599.   return os;
  600. }
  601. /////////////////////////////////////////////////////////////////////////////
  602. //
  603. // CDiagSimilarIF classes implementation
  604. //
  605. /////////////////////////////////////////////////////////////////////////////
  606. CDiagSimilarIF::CDiagSimilarIF(int templateWidth, int templateHeight)
  607.   : CDiagIF(templateWidth, templateHeight) 
  608. {
  609. }
  610. CDiagSimilarIF::CDiagSimilarIF(int templateWidth, int templateHeight,
  611.         int _toprect_toprow, int _centerrow,
  612.         int _bottomrect_bottomrow,
  613.         int _leftrect_leftcol, int _centercol,
  614.         int _rightrect_rightcol)
  615.   : CDiagIF(templateWidth, templateHeight) 
  616. {
  617.   toprect_toprow = _toprect_toprow;
  618.   centerrow = _centerrow;
  619.   bottomrect_bottomrow = _bottomrect_bottomrow;
  620.   leftrect_leftcol = _leftrect_leftcol;
  621.   centercol = _centercol;
  622.   rightrect_rightcol = _rightrect_rightcol;
  623.   SetNonOverlap();
  624. }
  625. CDiagSimilarIF::CDiagSimilarIF(const CDiagSimilarIF& frm)
  626.   : CDiagIF(frm) 
  627. {
  628. }
  629. CDiagSimilarIF::CDiagSimilarIF(istream& is, int templateWidth, int templateHeight)
  630.   : CDiagIF(templateWidth, templateHeight) 
  631. {
  632.   char a, b, c, d;
  633.   string str;
  634.   is >> toprect_toprow >> a >> centerrow >> b
  635.      >> bottomrect_bottomrow >> str
  636.      >> leftrect_leftcol >> c >> centercol >> d
  637.      >> rightrect_rightcol;
  638.   if (a!=',' || b!=',' || str!="x" || c!=',' || d!=',') {
  639.     char* buf = (char*) alloca((256+str.length())*sizeof(char));
  640.     sprintf(buf, "error during construction of DiagSimilarIF (%c|%c|%s|%c|%c)n",
  641.    a, b, str.c_str(), c, d);
  642.     throw ITException(buf);
  643.   }
  644.   SetNonOverlap();
  645. }
  646. bool CDiagSimilarIF::SetToNextIncarnation()
  647. {
  648.   if (m_is_partial) {
  649.     if (m_remaining_incarnations) {
  650.       m_remaining_incarnations--;
  651.     } else {
  652.       return false;
  653.     }
  654.   }
  655.   bottomrect_bottomrow+=2;
  656.   centerrow++;
  657.   if (bottomrect_bottomrow>=m_template_height) {
  658.     toprect_toprow++;
  659.     if (toprect_toprow==m_template_height-2) {
  660.       rightrect_rightcol++;
  661.       if (rightrect_rightcol==m_template_width) {
  662. centercol++;
  663. if (centercol==m_template_width-1) {
  664.   leftrect_leftcol++;
  665.   if (leftrect_leftcol==m_template_width-2) {
  666.     return false;
  667.   }
  668.   centercol=leftrect_leftcol+1;
  669. }
  670. rightrect_rightcol=centercol+1;
  671.       }
  672.       toprect_toprow=-1;
  673.     }
  674.     centerrow=toprect_toprow+1;
  675.     bottomrect_bottomrow=centerrow+1;
  676.   }
  677.   SetNonOverlap();
  678.   return true;
  679. }
  680. CIntegralFeature* CDiagSimilarIF::Copy() const
  681. {
  682.   return new CDiagSimilarIF(*this);
  683. }
  684. ostream& CDiagSimilarIF::output(ostream& os) const
  685. {
  686.   os << "DiagSimilar " << toprect_toprow << "," << centerrow 
  687.      << "," << bottomrect_bottomrow << " x ";
  688.   os << leftrect_leftcol << "," << centercol
  689.      << "," << rightrect_rightcol;
  690.   return os;
  691. }
  692. /////////////////////////////////////////////////////////////////////////////
  693. //
  694. // CFourBoxesSameIF classes implementation
  695. //
  696. /////////////////////////////////////////////////////////////////////////////
  697. CFourBoxesSameIF::CFourBoxesSameIF(int templateWidth, int templateHeight)
  698.   : CFourBoxesIF(templateWidth, templateHeight) 
  699. {
  700. }
  701. CFourBoxesSameIF::CFourBoxesSameIF(int templateWidth, int templateHeight,
  702.              const CRect* pB1, const CRect* pB2,
  703.              const CRect* pB3, const CRect* pB4)
  704.   : CFourBoxesIF(templateWidth, templateHeight) 
  705. {
  706.   b1_left = pB1->left;  b1_top = pB1->top;
  707.   b1_right = pB1->right;  b1_bottom = pB1->bottom;
  708.   b2_left = pB2->left;  b2_top = pB2->top;
  709.   b2_right = pB2->right;  b2_bottom = pB2->bottom;
  710.   b3_left = pB3->left;  b3_top = pB3->top;
  711.   b3_right = pB3->right;  b3_bottom = pB3->bottom;
  712.   b4_left = pB4->left;  b4_top = pB4->top;
  713.   b4_right = pB4->right;  b4_bottom = pB4->bottom;
  714.   SetNonOverlap();
  715. }
  716. CFourBoxesSameIF::CFourBoxesSameIF(const CFourBoxesSameIF& frm)
  717.   : CFourBoxesIF(frm)
  718. {
  719. }
  720. CFourBoxesSameIF::CFourBoxesSameIF(istream& is, int template_width, int template_height)
  721.   : CFourBoxesIF(template_width, template_height)
  722. {
  723.   char a, b, c, d, e, f;
  724.   is >> e >> b1_left >> a >> b1_top >> b >> b1_right >> c >> b1_bottom >> f >> d;
  725.   if (a!=',' || b!=',' || c!=',' || d!=',' || e!='(' || f!=')') {
  726.     char* buf = (char*) alloca(256*sizeof(char));
  727.     sprintf(buf, "error during construction of FourBoxesSameIF (%c|%c|%c|%c|%c)n",
  728.    e, a, b, c, f);
  729.     throw ITException(buf);
  730.   }
  731.   is >> e >> b2_left >> a >> b2_top >> b >> b2_right >> c >> b2_bottom >> f >> d;
  732.   if (a!=',' || b!=',' || c!=',' || d!=',' || e!='(' || f!=')') {
  733.     char* buf = (char*) alloca(256*sizeof(char));
  734.     sprintf(buf, "error during construction of FourBoxesSameIF (%c|%c|%c|%c|%c)n",
  735.    e, a, b, c, f);
  736.     throw ITException(buf);
  737.   }
  738.   is >> e >> b3_left >> a >> b3_top >> b >> b3_right >> c >> b3_bottom >> f >> d;
  739.   if (a!=',' || b!=',' || c!=',' || d!=',' || e!='(' || f!=')') {
  740.     char* buf = (char*) alloca(256*sizeof(char));
  741.     sprintf(buf, "error during construction of FourBoxesSameIF (%c|%c|%c|%c|%c)n",
  742.    e, a, b, c, f);
  743.     throw ITException(buf);
  744.   }
  745.   is >> e >> b4_left >> a >> b4_top >> b >> b4_right >> c >> b4_bottom >> f;
  746.   if (a!=',' || b!=',' || c!=',' || e!='(' || f!=')') {
  747.     char* buf = (char*) alloca(256*sizeof(char));
  748.     sprintf(buf, "error during construction of FourBoxesSameIF (%c|%c|%c|%c|%c)n",
  749.    e, a, b, c, f);
  750.     throw ITException(buf);
  751.   }
  752.   SetNonOverlap();
  753. }
  754. void CFourBoxesSameIF::SetToFirstIncarnation()
  755. {
  756.   if (m_is_partial) {
  757.     b1_left = start_b1_left;  b1_top = start_b1_top;
  758.     b1_right = start_b1_right;  b1_bottom = start_b1_bottom;
  759.     b2_left = start_b2_left;  b2_top = start_b2_top;
  760.     b2_right = start_b2_right;  b2_bottom = start_b2_bottom;
  761.     b3_left = start_b3_left;  b3_top = start_b3_top;
  762.     b3_right = start_b3_right;  b3_bottom = start_b3_bottom;
  763.     b4_left = start_b4_left;  b4_top = start_b4_top;
  764.     b4_right = start_b4_right;  b4_bottom = start_b4_bottom;
  765.     m_remaining_incarnations = m_stop_after_num_incarnations;
  766.   } else {
  767.     b1_left  =-1;  b1_top    = 0;
  768.     b1_right = 1;  b1_bottom = 2;
  769.     b2_left  = 0;  b2_top    = 2;
  770.     b2_right = 2;  b2_bottom = 4;
  771.     b3_left  = 0;  b3_top    =-1;
  772.     b3_right = 2;  b3_bottom = 1;
  773.     b4_left  = 1;  b4_top    = 0;
  774.     b4_right = 3;  b4_bottom = 2;
  775.   }
  776.   SetNonOverlap();
  777. }
  778. bool CFourBoxesSameIF::SetToNextIncarnation()
  779. {
  780. if (m_is_partial) {
  781. if (m_remaining_incarnations) {
  782. m_remaining_incarnations--;
  783. } else {
  784. return false;
  785. }
  786. }
  787.         
  788.   int width = b1_right-b1_left;
  789.   b2_right++;
  790.   b2_left++;
  791.   b3_right++;
  792.   b3_left++;
  793.   if (b3_right>=m_template_width-2 || b3_left>=b1_right) {
  794.     b1_right++;
  795.     b1_left++;
  796.     b4_right++;
  797.     b4_left++;
  798.     if (b1_right>=m_template_width-3) {
  799.       int height = b1_bottom-b1_top;
  800.       b3_bottom++;
  801.       b3_top++;
  802.       b4_bottom++;
  803.       b4_top++;
  804.       if (b3_bottom>=m_template_height-3) {
  805.         b1_bottom++;
  806.         b1_top++;
  807.         b2_bottom++;
  808.         b2_top++;
  809.         if (b1_bottom>=m_template_height-2 || b1_top>=b3_bottom) {
  810.           width++;
  811.           if (width>m_template_width-3) {
  812.             height++;
  813.             if (height>m_template_height-2) {
  814.               return false;
  815.             }
  816.             width = 2;
  817.           }
  818.           b1_top = 0; b1_bottom = b1_top+height;
  819.           b2_top = 1; b2_bottom = b2_top+height;
  820.         }
  821.         b3_top =-1; b3_bottom = b3_top+height;
  822.         b4_top = 1; b4_bottom = b4_top+height;
  823.       }
  824.       b1_left =-1; b1_right = b1_left+width;
  825.       b4_left = 1; b4_right = b4_left+width;
  826.     }
  827.     b3_left = 0; b3_right = b3_left+width;
  828.     b2_left = 0; b2_right = b2_left+width;
  829.   }
  830.   SetNonOverlap();
  831. return true;
  832. }
  833. CIntegralFeature* CFourBoxesSameIF::Copy() const
  834. {
  835. return new CFourBoxesSameIF(*this);
  836. }
  837. ostream& CFourBoxesSameIF::output(ostream& os) const
  838. {
  839.   os << "FourBoxesSame " 
  840.      << "(" << b1_left << "," << b1_top << "," << b1_right << "," << b1_bottom << "),"
  841.      << "(" << b2_left << "," << b2_top << "," << b2_right << "," << b2_bottom << "),"
  842.      << "(" << b3_left << "," << b3_top << "," << b3_right << "," << b3_bottom << "),"
  843.      << "(" << b4_left << "," << b4_top << "," << b4_right << "," << b4_bottom << ")";
  844.   return os;
  845. }