GravityCenter.cpp
上传用户:smdfuse
上传日期:2015-11-06
资源大小:98k
文件大小:18k
源码类别:

图形图象

开发平台:

Visual C++

  1. /*******************************************************
  2. Motion target detection & tracking by gravity center
  3. Author: jianglong
  4. date: 2006.08
  5. Compiler: Microsoft Visual C++ 6.0 
  6. *******************************************************/
  7. #include "stdafx.h"
  8. #include <math.h>
  9. #include "GravityCenter.h"
  10. CGravityCenter::CGravityCenter(int nwidth,int nheight)
  11. {
  12. m_otype = TRUE;
  13. m_width = nwidth;
  14. m_height = nheight;
  15. m_imageSize = m_width*m_height;
  16. m_threshBH = S_THRESHOLD_BH;
  17. m_threshW = S_THRESHOLD_TR;
  18. permitflag1=FALSE;
  19. permitflag2=FALSE;
  20. permitflag3=FALSE;
  21. permitflag4=FALSE;
  22. captureflag1=FALSE;
  23. captureflag2=FALSE;
  24. captureflag3=FALSE;
  25. captureflag4=FALSE;
  26. m_threshBHD = THRESHOLD_BH;
  27. m_threshW1 = THRESHOLD_TR;
  28. m_threshW2 = THRESHOLD_TR;
  29. m_threshW3 = THRESHOLD_TR;
  30. m_threshW4 = THRESHOLD_TR;
  31. m_CurImage = new unsigned char[m_imageSize*3];
  32. m_CurGrayImage = new unsigned char[m_imageSize];
  33. m_TempGrayImage = new unsigned char[m_imageSize];
  34. m_PreGrayImage = new unsigned char[m_imageSize];
  35. memset(m_CurImage,0,m_imageSize*3);
  36. memset(m_CurGrayImage,0,m_imageSize);
  37. memset(m_PreGrayImage,0,m_imageSize);
  38. memset(m_TempGrayImage,0,m_imageSize);
  39. }
  40. CGravityCenter::~CGravityCenter()
  41. {
  42. delete []m_PreGrayImage;
  43. delete []m_CurGrayImage;
  44. delete []m_TempGrayImage;
  45. delete []m_CurImage;
  46. }
  47. void CGravityCenter::Initial()
  48. {
  49. m_colorType = 0;
  50. m_TargetWin.pt.x=150;
  51. m_TargetWin.pt.y=100;
  52. m_TargetWin.w = 40;
  53. m_TargetWin.h = 40;
  54. m_TargetWin.flag = FALSE;
  55. m_DrawWin.pt.x=m_width/2;
  56. m_DrawWin.pt.y=m_height/2;
  57. m_DrawWin.w = (m_width-4)/3;
  58. m_DrawWin.h = (m_height-4)/3;
  59. m_DrawWin.flag = FALSE;
  60. }
  61. void CGravityCenter::InitalObjectTracker(BOOL type, int threshold)
  62. {
  63. trackflag = FALSE;
  64. m_otype = type;
  65. m_threshold = threshold;
  66. }
  67. void CGravityCenter::GravityCenter(int index, unsigned char *nRGBbuffer)
  68. {
  69. m_frame = index;
  70. memcpy(m_CurImage,nRGBbuffer,m_width*m_height*3);
  71. RGBToGray(m_CurImage,m_CurGrayImage,m_width,m_height);
  72. if(false) //单目标
  73. {
  74. if(!trackflag)
  75. {
  76. Initial();
  77. switch(m_threshold)//捕获阈值选取
  78. {
  79. case 0:
  80. m_threshBH = S_THRESHOLD_BH;
  81. break;
  82. case 1:
  83. m_threshBH = GetBHThByHistogram(m_CurGrayImage,m_width,m_height);
  84. break;
  85. default:
  86. break;
  87. }
  88. m_TargetWin = gravity(m_CurGrayImage, m_width, m_height, m_threshBH);
  89. trackflag = m_TargetWin.flag;
  90. }
  91. else
  92. {
  93. switch(m_threshold)//跟踪窗内阈值选取
  94. {
  95. case 0:
  96. m_threshW = S_THRESHOLD_TR;
  97. break;
  98. case 1:
  99. m_threshW = GetWThByHistogram(m_CurGrayImage, m_TargetWin, m_width, m_height);
  100. break;
  101. default:
  102. break;
  103. }
  104. m_TargetWin = AdjustWindow(m_TargetWin, m_width, m_height);
  105. m_TargetWin = gvtrack(m_CurGrayImage, m_width, m_height, m_TargetWin, m_threshW);
  106. trackflag = m_TargetWin.flag;
  107. }
  108. if(trackflag)
  109. {
  110. m_DrawWin = AdjustWindow(m_TargetWin, m_width, m_height);
  111. m_result.frame = index;
  112. m_result.x = (short)m_DrawWin.pt.x;
  113. m_result.y = (short)m_DrawWin.pt.y;
  114. m_result.w = m_DrawWin.w;
  115. m_result.h = m_DrawWin.h;
  116. }
  117. DrawObjectBox(nRGBbuffer, m_DrawWin);
  118. }
  119. else  //多目标
  120. {
  121. Initial();
  122. switch(m_threshold)//捕获阈值选取
  123. {
  124. case 0:
  125. m_threshBHD = THRESHOLD_BH;
  126. break;
  127. case 1:
  128. m_threshBHD = GetBHThByHistogram(m_CurGrayImage,m_width,m_height);
  129. break;
  130. default:
  131. break;
  132. }
  133. if(permitflag1==1)
  134. {
  135. m_TargetWin1 = AdjustWindow(m_TargetWin1, m_width, m_height);
  136.   // m_threshW1 = GetWThByHistogram(m_CurGrayImage,m_TargetWin1,m_width, m_height);
  137.   //    m_threshW1 = threshold_area(m_CurGrayImage,m_TargetWin1,m_width, m_height);
  138. m_TargetWin1 = gvtrack(m_CurGrayImage, m_width, m_height, m_TargetWin1, m_threshW1);
  139. captureflag1 = m_TargetWin1.flag;
  140. if(captureflag1 == 1)
  141. {
  142. m_ObjectNum++;
  143. m_DrawWin1 = AdjustWindow(m_TargetWin1, m_width, m_height);
  144. erasure(m_CurGrayImage, m_DrawWin1, m_width, m_height);
  145. DrawObjectBox(nRGBbuffer, m_DrawWin1);
  146. }
  147. else
  148. {
  149. permitflag1 = 0;
  150. }
  151. }
  152. if(permitflag2==1)
  153. {
  154. m_TargetWin2 = AdjustWindow(m_TargetWin2, m_width, m_height);
  155.       //m_threshW2 = GetWThByHistogram(m_CurGrayImage, m_TargetWin2, m_width, m_height);
  156.   //m_threshW2 = threshold_area(m_CurGrayImage,m_TargetWin2,m_width, m_height);
  157. m_TargetWin2 = gvtrack(m_CurGrayImage, m_width, m_height, m_TargetWin2, m_threshW2);
  158. captureflag2 = m_TargetWin2.flag;
  159. if(captureflag2 == 1)
  160. {
  161. m_ObjectNum++;
  162. m_DrawWin2 = AdjustWindow(m_TargetWin2, m_width, m_height);
  163. erasure(m_CurGrayImage, m_DrawWin2, m_width, m_height);
  164. DrawObjectBox(nRGBbuffer, m_DrawWin2);
  165. }
  166. else
  167. {
  168. permitflag2 = 0;
  169. }
  170. }
  171. if(permitflag3==1)
  172. {
  173. m_TargetWin3 = AdjustWindow(m_TargetWin3, m_width, m_height);
  174. // m_threshW3 = GetWThByHistogram(m_CurGrayImage,m_TargetWin3,m_width, m_height);
  175. //  m_threshW3 = threshold_area(m_CurGrayImage,m_TargetWin3,m_width, m_height);
  176. m_TargetWin3 = gvtrack(m_CurGrayImage, m_width, m_height, m_TargetWin3, m_threshW3);
  177. captureflag3 = m_TargetWin3.flag;
  178. if(captureflag3 == 1)
  179. {
  180. m_ObjectNum++;
  181. m_DrawWin3 = AdjustWindow(m_TargetWin3, m_width, m_height);
  182. erasure(m_CurGrayImage, m_DrawWin3, m_width, m_height);
  183. DrawObjectBox(nRGBbuffer, m_DrawWin3);
  184. }
  185. else
  186. {
  187. permitflag3 = 0;
  188. }
  189. }
  190. if(permitflag4==1)
  191. {
  192. m_TargetWin4 = AdjustWindow(m_TargetWin4, m_width, m_height);
  193.       //    m_threshW4 = GetWThByHistogram(m_CurGrayImage,m_TargetWin4,m_width, m_height);
  194.   //    m_threshW4 = threshold_area(m_CurGrayImage,m_TargetWin4,m_width, m_height);
  195. m_TargetWin4 = gvtrack(m_CurGrayImage, m_width, m_height, m_TargetWin4, m_threshW4);
  196. captureflag4 = m_TargetWin4.flag;
  197. if(captureflag4 == 1)
  198. {
  199. m_ObjectNum++;
  200. m_DrawWin4 = AdjustWindow(m_TargetWin4, m_width, m_height);
  201. erasure(m_CurGrayImage, m_DrawWin4, m_width, m_height);
  202. DrawObjectBox(nRGBbuffer, m_DrawWin4);
  203. }
  204. else
  205. {
  206. permitflag4 = 0;
  207. }
  208. }
  209. //捕获过程
  210. if(permitflag1==0)
  211. {
  212. m_TargetWin1 = findEdge(m_CurGrayImage, m_width, m_height, m_threshBHD, BLOCK_NUMBER);
  213. permitflag1 = m_TargetWin1.flag;
  214. }
  215. else if(permitflag2==0)
  216. {
  217. m_TargetWin2 = findEdge(m_CurGrayImage, m_width, m_height, m_threshBHD, BLOCK_NUMBER);
  218. permitflag2 = m_TargetWin2.flag;
  219. }
  220. else if(permitflag3==0)
  221. {
  222. m_TargetWin3 = findEdge(m_CurGrayImage, m_width, m_height, m_threshBHD, BLOCK_NUMBER);
  223. permitflag3 = m_TargetWin3.flag;
  224. }
  225. else if(permitflag4==0)
  226. {
  227. m_TargetWin4 = findEdge(m_CurGrayImage, m_width, m_height, m_threshBHD, BLOCK_NUMBER);
  228. permitflag4 = m_TargetWin4.flag;
  229. }
  230. else 
  231. return;
  232. m_result.frame = index;
  233. m_result.x = 0;
  234. m_result.y = 0;
  235. m_result.w = 0;
  236. m_result.h = 0;
  237. }
  238. }
  239. //灰度化
  240. void CGravityCenter::RGBToGray(unsigned char *sRGB, unsigned char *sGray, int nWidth, int nHeight)
  241. {
  242. int i,j;
  243. for(j=0;j<nHeight;j++)
  244. {
  245. for(i=0;i<nWidth;i++)
  246. {
  247. int k = nWidth*j+i;
  248. sGray[k]=(11*sRGB[3*k]+59*sRGB[3*k+1]+30*sRGB[3*k+2])/100;
  249. }
  250. }
  251. }
  252. //二值化
  253. void CGravityCenter::Segment(unsigned char *sGray, int nWidth, int nHeight, int nThreshold)
  254. {
  255. int i,j;
  256. for(j=0;j<nHeight;j++)
  257. {
  258. for(i=0;i<nWidth;i++)
  259. {
  260. int k = nWidth*j+i;
  261. if(sGray[k]>nThreshold)
  262. sGray[k] = 1;
  263. else
  264. sGray[k] = 0;
  265. }
  266. }
  267. }
  268. //图像反色
  269. void CGravityCenter::Inverse(unsigned char *sGray, int nWidth, int nHeight)
  270. {
  271. int i,j;
  272. for(j=0;j<nHeight;j++)
  273. {
  274. for(i=0;i<nWidth;i++)
  275. {
  276. int k = nWidth*j+i;
  277. sGray[k] = unsigned char(255-sGray[k]);
  278. }
  279. }
  280. }
  281. //选取跟踪窗口颜色
  282. unsigned long CGravityCenter::GetBoxColor()
  283. {
  284. unsigned long pixelValues = 0;
  285. switch(m_colorType)
  286. {
  287. case 0:
  288. pixelValues = RGB(255,0,0);
  289. break;
  290. case 1:
  291. pixelValues = RGB(0,255,0);
  292. break;
  293. case 2:
  294. pixelValues = RGB(0,0,255);
  295. break;
  296. case 3:
  297. pixelValues = RGB(255,255,0);
  298. break;
  299. case 4:
  300. pixelValues = RGB(255,0,255);
  301. break;
  302. case 5:
  303. pixelValues = RGB(0,255,255);
  304. break;
  305. case 6:
  306. pixelValues = RGB(255,255,255);
  307. break;
  308. case 7:
  309. pixelValues = RGB(128,0,128);
  310. break;
  311. case 8:
  312. pixelValues = RGB(128,128,0);
  313. break;
  314. case 9:
  315. pixelValues = RGB(128,128,128);
  316. break;
  317. case 10:
  318. pixelValues = RGB(255,128,0);
  319. break;
  320. case 11:
  321. pixelValues = RGB(0,128,128);
  322. break;
  323. case 12:
  324. pixelValues = RGB(123,50,10);
  325. break;
  326. case 13:
  327. pixelValues = RGB(10,240,126);
  328. break;
  329. case 14:
  330. pixelValues = RGB(0,128,255);
  331. break;
  332. case 15:
  333. pixelValues = RGB(128,200,20);
  334. break;
  335. default:
  336. break;
  337. }
  338. return(pixelValues);
  339. }
  340. //改变窗口颜色
  341. void CGravityCenter::SetPixelValues(unsigned char *sRGB,unsigned long pixelValues, int x, int y)
  342. {
  343. *(sRGB+(y*m_width+x)*3+2) = unsigned char(pixelValues & 0xFF);
  344. *(sRGB+(y*m_width+x)*3+1) = unsigned char((pixelValues >> 8) & 0xFF);
  345. *(sRGB+(y*m_width+x)*3) = unsigned char((pixelValues >> 16) & 0xFF); 
  346. }
  347. //画跟踪窗口
  348. void CGravityCenter::DrawObjectBox(unsigned char *sRGB, WININFO sWin)
  349. {
  350. int i,j;
  351. unsigned long pv=0;
  352. pv = GetBoxColor();
  353. for(i=sWin.pt.x-sWin.w; i<sWin.pt.x+sWin.w; i++)
  354. {
  355. SetPixelValues(sRGB,pv,i,sWin.pt.y-sWin.h);
  356. SetPixelValues(sRGB,pv,i,sWin.pt.y+sWin.h);
  357. }
  358. for(j=sWin.pt.y-sWin.h; j<sWin.pt.y+sWin.h; j++)
  359. {
  360. SetPixelValues(sRGB,pv,sWin.pt.x-sWin.w,j);
  361. SetPixelValues(sRGB,pv,sWin.pt.x+sWin.w,j);
  362. }
  363. }
  364. //直方图法求捕获阈值
  365. int CGravityCenter::GetBHThByHistogram(unsigned char *sGray,int nWidth, int nHeight)
  366. {
  367. int threshold;
  368. int mean=0;
  369. int grayMax=0;
  370. int calHistNum=0;
  371. int whiteContrast=0;
  372. int i,j,tmp;
  373. int his[256];
  374. for(i= 0;i<256;i++)
  375. his[i] = 0;
  376. //calculate the histogram of image
  377. for(i=EDGE_SPACE;i<nHeight-EDGE_SPACE;i++)
  378. {
  379. for(j=EDGE_SPACE;j<nWidth-EDGE_SPACE;j++)
  380. {
  381. tmp = sGray[i*nWidth+j];
  382. his[tmp]++;
  383. if(tmp>grayMax)
  384. grayMax = tmp;
  385. }
  386. }
  387. //calculate the contrast of image
  388. calHistNum = (nWidth-2*EDGE_SPACE)*(nHeight-2*EDGE_SPACE);
  389. for(i= 0;i<256;i++)
  390. {
  391. mean+=his[i]*i;
  392. }
  393. mean = mean/calHistNum;
  394. whiteContrast = 100*(grayMax-mean)/grayMax;
  395. if(whiteContrast>30) threshold = grayMax-50;
  396. else if (whiteContrast>27) threshold = grayMax-30;
  397. else if (whiteContrast>24) threshold = grayMax-20;
  398. else if (whiteContrast>20) threshold = grayMax-15;
  399. else if (whiteContrast>9) threshold = grayMax-11;
  400. else if (whiteContrast>4) threshold = grayMax-6;
  401. else threshold = grayMax;
  402. return threshold;
  403. }
  404. //直方图法求窗口内阈值
  405. int CGravityCenter::GetWThByHistogram(unsigned char *sGray, WININFO sWin, int nWidth, int nHeight)
  406. {
  407. int threshold;
  408. int mean=0;
  409. int grayMax=0;
  410. int calHistNum=0;
  411. int whiteContrast=0;
  412. int i,j,tmp;
  413. int his[256];
  414. for(i= 0;i<256;i++)
  415. his[i] = 0;
  416. //calculate the histogram of image
  417. for(j=sWin.pt.y-sWin.h;j<sWin.pt.y+sWin.h;j++)
  418. {
  419. for(i=sWin.pt.x-sWin.w;i<sWin.pt.x+sWin.w;i++)
  420. {
  421. tmp = sGray[i*nWidth+j];
  422. his[tmp]++;
  423. if(tmp>grayMax)
  424. grayMax = tmp;
  425. calHistNum++;
  426. }
  427. }
  428. //calculate the contrast of image
  429. for(i= 0;i<256;i++)
  430. {
  431. mean+=his[i]*i;
  432. }
  433. mean = mean/calHistNum;
  434. whiteContrast = 100*(grayMax-mean)/grayMax;
  435. if(whiteContrast>30) threshold = grayMax-50;
  436. else if (whiteContrast>27) threshold = grayMax-30;
  437. else if (whiteContrast>24) threshold = grayMax-20;
  438. else if (whiteContrast>20) threshold = grayMax-15;
  439. else if (whiteContrast>9) threshold = grayMax-11;
  440. else if (whiteContrast>4) threshold = grayMax-6;
  441. else threshold = grayMax;
  442. return threshold;
  443. }
  444. //利用目标面积求阈值
  445. int CGravityCenter::GetWThByAera(unsigned char *sGray, WININFO sWin, int nWidth, int nHeight)
  446. {
  447. int threshold;
  448. int grayMax=0;
  449. int i,j,tmp;
  450. int his[256];
  451. for(i= 0;i<256;i++)
  452. his[i] = 0;
  453. //calculate the histogram of image
  454. for(j=sWin.pt.y-sWin.h;j<sWin.pt.y+sWin.h;j++)
  455. {
  456. for(i=sWin.pt.x-sWin.w;i<sWin.pt.x+sWin.w;i++)
  457. {
  458. tmp = sGray[i*nWidth+j];
  459. his[tmp]++;
  460. if(tmp>grayMax)
  461. grayMax = tmp;
  462. }
  463. }
  464. float rate=(sWin.w-EDGE_DRAW)*(sWin.h-EDGE_DRAW)+0.0f/(sWin.w*sWin.h);
  465.     threshold = int(grayMax-grayMax*rate);
  466. return threshold;
  467. }
  468. //调整边界窗口
  469. WININFO CGravityCenter::AdjustWindow(WININFO sWin, int sWidth, int sHeight)
  470. {
  471. WININFO win;
  472. CRect rt;
  473. rt.left = sWin.pt.x-sWin.w;
  474. rt.right = sWin.pt.x+sWin.w;
  475. rt.top = sWin.pt.y-sWin.h;
  476. rt.bottom = sWin.pt.y+sWin.h;
  477. if(rt.left<2)
  478. {
  479. rt.left = 2;
  480. rt.right = (sWin.pt.x+sWin.w)<42 ? 42:(sWin.pt.x+sWin.w);
  481. }
  482. if(rt.right>sWidth-2)
  483. {
  484. rt.right = sWidth-2;
  485. rt.left = (sWin.pt.x-sWin.w)>=(sWidth-42) ? (sWidth-42):(sWin.pt.x-sWin.w);
  486. }
  487. if(rt.top<2)
  488. {
  489. rt.top = 2;
  490. rt.bottom = (sWin.pt.y+sWin.h)<42 ? 42:(sWin.pt.y+sWin.h);
  491. }
  492. if(rt.bottom>sHeight-2)
  493. {
  494. rt.bottom = sHeight-2;
  495. rt.top = (sWin.pt.y-sWin.h)>=(sHeight-42) ? (sHeight-42):(sWin.pt.y-sWin.h);
  496. }
  497. win.w =  (rt.right-rt.left)/2;
  498. win.h =  (rt.bottom-rt.top)/2;
  499. win.pt.x = rt.left+win.w;
  500. win.pt.y = rt.top+win.h;
  501. win.flag = sWin.flag;
  502. return win;
  503. }
  504. //多目标跟踪中擦除目标
  505. void CGravityCenter::erasure(unsigned char* sGray, WININFO sWin, int sWidth, int sHeight)
  506. {
  507. int i,j;
  508. for(j=sWin.pt.y-sWin.h;j<sWin.pt.y+sWin.h;j++)
  509. {
  510. for(i=sWin.pt.x-sWin.w;i<sWin.pt.x+sWin.w;i++)
  511. {
  512. int k = sWidth*j+i;
  513. sGray[k] = (unsigned char)0;
  514. }
  515. }
  516. }
  517. //重心跟踪
  518. WININFO CGravityCenter::gvtrack(unsigned char* sGray,int sWidth, int sHeight, WININFO sWin, int sThreshold)
  519. {
  520. WININFO win;
  521. win.w = 0;
  522. win.h = 0;
  523. win.pt.x = 0;
  524. win.pt.y = 0;
  525. win.flag = FALSE;
  526. int M00bh = 0;
  527. int M01bh = 0;
  528. int M10bh = 0;
  529. int i,j,iLine;//iCol;
  530. for(j=sWin.pt.y-sWin.h;j<sWin.pt.y+sWin.h;j++)
  531. {
  532. iLine = 0;
  533. for(i=sWin.pt.x-sWin.w;i<sWin.pt.x+sWin.w;i++)
  534. {
  535. int k = sWidth*j+i;
  536. if(sGray[k]>sThreshold)
  537. {
  538. iLine++;
  539. M01bh+=i;
  540. M10bh+=j;
  541. }
  542. }
  543. M00bh+=iLine;
  544. if(win.w<iLine) win.w = iLine;
  545. if(iLine>3) win.h++;
  546. }
  547. if(M00bh>10)
  548. {
  549. win.pt.x = int(M01bh/M00bh+0.5);
  550. win.pt.y = int(M10bh/M00bh+0.5);
  551. win.w = win.w/2+EDGE_DRAW;
  552. win.h = win.h/2+EDGE_DRAW;
  553. win.flag = TRUE;
  554. }
  555. return win;
  556. }
  557. //投影找最大值法
  558. WININFO CGravityCenter::project(unsigned char* sGray, int sWidth, int sHeight, int sThreshold)
  559. {
  560. WININFO win;
  561. win.w = 0;
  562. win.h = 0;
  563. win.pt.x = 0;
  564. win.pt.y = 0;
  565. win.flag = FALSE;
  566. int X_MaxLocation=0, X_MaxLength=0;
  567. int Y_MaxLocation=0, Y_MaxLength=0;
  568. int *row, *column;
  569. row = new int[sWidth];
  570. column = new int[sHeight];
  571. memset(row,0,sWidth*sizeof(int));
  572. memset(column,0,sHeight*sizeof(int));
  573. int i,j,t;
  574. for(j=EDGE_SPACE; j<sWidth-EDGE_SPACE; j++)
  575. {
  576. for (i=EDGE_SPACE; i<sHeight-EDGE_SPACE; i++)
  577. {
  578. int k = i*sWidth+j;
  579. if(sGray[k]>sThreshold)
  580. row[j] = 1;
  581. }
  582. }
  583. for(i=EDGE_SPACE; i<sHeight-EDGE_SPACE; i++)
  584. {
  585. for (j=EDGE_SPACE; j<sWidth-EDGE_SPACE; j++)
  586. {
  587. int k = i*sWidth+j;
  588. if(sGray[k]>sThreshold)
  589. column[i] = 1;
  590. }
  591. }
  592. int location=0;
  593. int count=0;
  594. int length=0;
  595. for(t=0; t<sWidth; t++)
  596. {
  597. if(row[t] == 1)
  598. {
  599. count++;
  600. length = count;
  601. location = t-length+1;
  602. }
  603. else
  604. {
  605. count = 0;
  606. if(length>X_MaxLength)
  607. {
  608. X_MaxLocation = location;
  609. X_MaxLength = length;
  610. }
  611. }
  612. }
  613. location=0;
  614. count=0;
  615. length=0;
  616. for(t=0; t<sHeight; t++)
  617. {
  618. if(column[t] == 1)
  619. {
  620. count++;
  621. length = count;
  622. location = t-length+1;
  623. }
  624. else
  625. {
  626. count = 0;
  627. if(length>Y_MaxLength)
  628. {
  629. Y_MaxLocation = location;
  630. Y_MaxLength = length;
  631. }
  632. }
  633. }
  634. delete []row;
  635. delete []column;
  636. win.pt.x = int(X_MaxLocation+X_MaxLength/2+0.5);
  637. win.pt.y = int(Y_MaxLocation+Y_MaxLength/2+0.5);
  638. win.w = X_MaxLength/2+EDGE_DRAW;
  639. win.h = Y_MaxLength/2+EDGE_DRAW;
  640. if((X_MaxLength+Y_MaxLength)>5)
  641. win.flag = TRUE;
  642. return win;
  643. }
  644. //重心法
  645. WININFO CGravityCenter::gravity(unsigned char* sGray, int sWidth, int sHeight, int sThreshold)
  646. {
  647. WININFO win;
  648. win.w = 0;
  649. win.h = 0;
  650. win.pt.x = 0;
  651. win.pt.y = 0;
  652. win.flag = FALSE;
  653. int M00bh = 0;
  654. int M01bh = 0;
  655. int M10bh = 0;
  656. int iLine,i,j;
  657. for(j=EDGE_SPACE;j<sHeight-EDGE_SPACE;j++)
  658. {
  659. iLine = 0;
  660. for(i=EDGE_SPACE;i<sWidth-EDGE_SPACE;i++)
  661. {
  662. int k = sWidth*j+i;
  663. if(sGray[k]>sThreshold)
  664. {
  665. iLine++;
  666. M01bh+=i;
  667. M10bh+=j;
  668. }
  669. }
  670. M00bh+=iLine;
  671. if(win.w<iLine) win.w = iLine;
  672. if(iLine>0) win.h++;
  673. }
  674. if(M00bh>10)
  675. {
  676. win.pt.x = int(M01bh/M00bh+0.5);
  677. win.pt.y = int(M10bh/M00bh+0.5);
  678. win.w = win.w/2+EDGE_DRAW;
  679. win.h = win.h/2+EDGE_DRAW;
  680. win.flag = TRUE;
  681. }
  682. return win;
  683. }
  684. //找边法
  685. WININFO CGravityCenter::findEdge(unsigned char* sGray, int sWidth, int sHeight, int sThreshold, int sBlockNum)
  686. {
  687. WININFO win;
  688. win.w = 0;
  689. win.h = 0;
  690. win.pt.x = 0;
  691. win.pt.y = 0;
  692. win.flag = FALSE;
  693. int blockH = sHeight/sBlockNum;
  694. int x=0,w=0,n=0;
  695. int i,j,t=0;
  696. int tStart, tEnd;
  697. int *row = new int[sWidth];
  698. while(n<sBlockNum)
  699. {
  700. memset(row,0,sWidth*sizeof(int));
  701. for(j=EDGE_SPACE; j<sWidth-EDGE_SPACE; j++)
  702. {
  703. for (i=n*blockH; i<(n+1)*blockH; i++)
  704. {
  705. int k = i*sWidth+j;
  706. if(sGray[k]>sThreshold)
  707. row[j] = 1;
  708. }
  709. }
  710. for(t=0;t<sWidth;t++)
  711. {
  712. if(row[t]==1)
  713. {
  714. tStart=t;
  715. while(row[t]!=0) t++;
  716. tEnd = t;
  717. w = (tEnd-tStart)/2;
  718. if(w>1)
  719. {
  720. x = tStart+(tEnd-tStart)/2;
  721. break;
  722. }
  723. }
  724. }
  725. if(x>2) 
  726. {
  727. win.pt.x = x;
  728. win.pt.y = n*blockH+blockH/2;
  729. win.w = w+10;
  730. win.h = blockH/2;
  731. win.flag = TRUE;
  732. break;
  733. }
  734. else n++;
  735. }
  736. delete []row;
  737. row = NULL;
  738. return win;
  739. }