ImageObject.cpp
上传用户:jjiangjuan
上传日期:2013-03-27
资源大小:59k
文件大小:24k
源码类别:

波变换

开发平台:

Visual C++

  1. // ImageObject.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "LPR.h"
  5. #include "ImageObject.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CImageObject
  13. BYTE BMPRec[COL*ROW*3];
  14. BYTE GraftBuf[COL][ROW];
  15. int FINISHED[COL][ROW],Closed[COL][ROW],VetorRec[COL][ROW];
  16. CImageObject::CImageObject()
  17. {
  18. lpBuf=NULL;
  19. LPLocated = false;
  20. StrongStrech = false;
  21. }
  22. CImageObject::~CImageObject()
  23. {
  24. }
  25. BEGIN_MESSAGE_MAP(CImageObject, CStatic)
  26. //{{AFX_MSG_MAP(CImageObject)
  27. ON_WM_PAINT()
  28. //}}AFX_MSG_MAP
  29. END_MESSAGE_MAP()
  30. /////////////////////////////////////////////////////////////////////////////
  31. // CImageObject message handlers
  32. void CImageObject::OnPaint() 
  33. {
  34. CPaintDC dc(this); // device context for painting
  35. // TODO: Add your message handler code here
  36. // Do not call CStatic::OnPaint() for painting messages
  37. HDC hDC;
  38. hDC = dc.GetSafeHdc();
  39. if(lpBuf!=NULL&&LPLocated!=true)
  40. {
  41.     StretchDIBits(hDC,
  42.            0,
  43.    0,
  44.    bitmapinfoheader.biWidth,
  45.    bitmapinfoheader.biHeight,
  46.    0,
  47.    0,
  48.    bitmapinfoheader.biWidth,
  49.    bitmapinfoheader.biHeight,
  50.    lpBuf,
  51.    pbi,
  52.    DIB_RGB_COLORS,
  53.    SRCCOPY);
  54.   }
  55. else
  56. if(LPLocated==true)
  57. {
  58. StretchDIBits(hDC,
  59.            0,
  60.    0,
  61.    bitmapinfoheader.biWidth,
  62.    bitmapinfoheader.biHeight,
  63.    0,
  64.    0,
  65.    bitmapinfoheader.biWidth,
  66.    bitmapinfoheader.biHeight,
  67.    BMPRec,
  68.    pbi,
  69.    DIB_RGB_COLORS,
  70.    SRCCOPY);
  71. }
  72. }
  73. void CImageObject::LoadBmp()
  74. {
  75.    LPLocated=false;
  76.    CString strPath;
  77.    CFile file;
  78.    CFileDialog *openFile = new CFileDialog(TRUE,"bmp","*.bmp",NULL,"Bitmap Files(*.bmp)",NULL);
  79.    if(openFile->DoModal() == IDOK)
  80.    {
  81.     strPath = openFile->GetPathName();
  82.     if(file.Open(strPath,CFile::modeRead|CFile::shareDenyNone,NULL)==0)
  83.   {
  84.   AfxMessageBox("无法开文件!",MB_OK,0);
  85. return;
  86. }
  87.   file.Read(&bitmapfileheader,sizeof(bitmapfileheader));
  88.  
  89. file.Read(&bitmapinfoheader,sizeof(bitmapinfoheader));
  90.   numQuad=0;
  91.   if(bitmapinfoheader.biBitCount<24)
  92.   {
  93.   numQuad=1<<bitmapinfoheader.biBitCount;
  94.   }
  95.   pbi=(BITMAPINFO*) HeapAlloc(GetProcessHeap(),0,sizeof(BITMAPINFOHEADER)+numQuad*sizeof(RGBQUAD));
  96.   memcpy(pbi,&bitmapinfoheader,sizeof(bitmapinfoheader));
  97.   quad=(RGBQUAD*)((BYTE*)pbi+sizeof(BITMAPINFOHEADER));
  98.  
  99.   if(numQuad!=0)
  100.   {
  101.   file.Read(quad,sizeof(RGBQUAD)*numQuad);
  102.   }
  103.   bitmapinfoheader.biSizeImage=bitmapfileheader.bfSize-bitmapfileheader.bfOffBits;
  104.   lpBuf=(BYTE*)HeapAlloc(GetProcessHeap(),0,bitmapinfoheader.biSizeImage);
  105.  
  106.   file.Read(lpBuf,bitmapinfoheader.biSizeImage);
  107.         
  108.   file.Close();
  109.    }
  110.         Invalidate (FALSE);
  111. }
  112. void CImageObject::gray(BYTE lpData[COL][ROW])
  113. {
  114.     
  115. BYTE GrayLevel;
  116. int i,j,k;
  117. int w = bitmapinfoheader.biWidth;
  118. int h = bitmapinfoheader.biHeight;
  119.     for(i = 0; i < h ;i++)
  120. {
  121. for(j = 0; j < w;j++)
  122. {
  123. k = i*w+j;
  124. GrayLevel = BYTE(0.299*lpBuf[k*3] + 0.587*lpBuf[k*3+1] + 0.114 * lpBuf[k*3+2]);
  125.             BMPRec[k*3]=lpBuf[k*3];
  126.             BMPRec[k*3+1]=lpBuf[k*3+1];
  127. BMPRec[k*3+2]=lpBuf[k*3+2];
  128. lpBuf[k*3] = GrayLevel;
  129. lpBuf[k*3+1] = GrayLevel;
  130. lpBuf[k*3+2] = GrayLevel;
  131. lpData[i][j]=GrayLevel;
  132. GraftBuf[i][j] = GrayLevel;
  133.     
  134. }
  135. }
  136.    
  137. Invalidate(FALSE);
  138. }
  139. void CImageObject::InteEqualize(BYTE lpData[COL][ROW],int lCount[])
  140. {
  141. int lTemp, i, j;
  142. // 灰度映射表
  143. BYTE bMap[256];
  144. for(i = 0; i < 256; i++)
  145. {
  146. bMap[i] = 0;
  147. }
  148.     // 计算灰度映射表
  149. for (i = 0; i < 256; i++)
  150. {
  151. // 初始为0
  152. lTemp = 0;
  153. for (j = 0; j <= i ; j++)
  154. {
  155. lTemp += lCount[j];
  156. }
  157. // 计算对应的新灰度值
  158. bMap[i] = (BYTE) ((lTemp * 254+i) / COL / ROW);
  159. int w = bitmapinfoheader.biWidth;
  160. int h = bitmapinfoheader.biHeight;
  161. for(i = 0; i < h; i++)
  162. {
  163. for(j = 0; j < w; j++)
  164. {
  165.   GraftBuf[i][j] = bMap[GraftBuf[i][j]];
  166.   lpData[i][j] = GraftBuf[i][j];
  167. }
  168. }
  169. this->Graft2BmpData();
  170. Invalidate(FALSE);
  171. }
  172. void CImageObject::GetEdge()
  173. {
  174. int i,j;
  175. BYTE TempBuf[COL][ROW];
  176. for(j=1;j<ROW;j++)//changed
  177. {
  178. for(i=0;i<COL;i++)//changed
  179. {
  180.             TempBuf[i][j-1]=abs(GraftBuf[i][j]-GraftBuf[i][j-1]);//)<100)?2*abs(GraftBuf[i][j]-GraftBuf[i][j-1]):abs(GraftBuf[i][j]-GraftBuf[i][j-1]);
  181. if(TempBuf[i][j-1]<=20)
  182.                TempBuf[i][j-1]=0;
  183.           
  184.     if(j==ROW-1)
  185. TempBuf[i][j]=0;
  186. }
  187. }
  188. for(i=1;i<COL;i++)
  189.         for(j=0;j<ROW;j++)
  190. {
  191.             if(abs(GraftBuf[i][j]-GraftBuf[i-1][j])>=TempBuf[i-1][j])
  192.                   TempBuf[i-1][j]=abs(GraftBuf[i][j]-GraftBuf[i-1][j]);//(abs(GraftBuf[i][j]-GraftBuf[i-1][j])<100)?2*abs(GraftBuf[i][j]-GraftBuf[i-1][j]):abs(GraftBuf[i][j]-GraftBuf[i-1][j]);//+TempBuf[i-1][j]+50;
  193. if(i==COL-1)
  194. TempBuf[i][j]=0;
  195. GraftBuf[i-1][j]=TempBuf[i-1][j];
  196. }
  197. for(i=0;i<COL;i++)
  198. for(j=0;j<ROW;j++)
  199. Closed[i][j]=NOTSEARCH;
  200. this->Graft2BmpData();
  201. }
  202. void CImageObject::Graft2BmpData()
  203. {
  204.    int i,j,k;
  205.    int h = bitmapinfoheader.biHeight;
  206.    int w = bitmapinfoheader.biWidth;
  207.    for(i=0;i< h;i++)
  208.    {
  209.    
  210.    for(j=0;j< w;j++)
  211.    {
  212.    k = i*w+j;
  213.    lpBuf[k*3]=GraftBuf[i][j];
  214.            lpBuf[k*3+1]=GraftBuf[i][j];
  215.    lpBuf[k*3+2]=GraftBuf[i][j];
  216.    }
  217.    }
  218. }
  219. void CImageObject::DelNoise()
  220. {
  221.     int i,j;
  222.     int sum=0,num1=0;
  223. EdgeTest();
  224. for(j=0;j<ROW;j++)
  225. {
  226. for(i=0;i<COL;i++)
  227. {
  228. if(FINISHED[i][j]!=SEARCHED)
  229. {
  230. sum=0;
  231. FilterDirectionPix(Closed[i][j],i,j,sum);      
  232. }
  233. }
  234. }
  235. for(j=0;j<ROW;j++)
  236. for(i=0;i<COL;i++)
  237.   FINISHED[i][j]=NOTSEARCH;
  238. for(i=0;i<COL;i++)
  239. {
  240. for(j=0;j<ROW;j++)
  241. {
  242. if((Closed[i][j]==9||Closed[i][j]==10)&&GraftBuf[i][j]!=0)
  243. GraftBuf[i][j]=0;
  244. if(FINISHED[i][j]==NOTSEARCH)
  245. {
  246. sum=0;
  247. ResetNoise(Closed[i][j],i,j,sum);
  248. }  
  249. }
  250. }
  251. this->Graft2BmpData();
  252. Invalidate(FALSE);
  253. }
  254. void CImageObject::EdgeTest()
  255. {
  256. nDir=NODIRECT;
  257. int i,j;
  258. for(i=0;i<COL;i++)
  259. for(j=0;j<ROW;j++)
  260. {
  261. Closed[i][j]=NOTSEARCH;
  262. FINISHED[i][j]=NOTSEARCH;
  263. }
  264. for(i=1;i<COL-1;i++)
  265. for(j=1;j<ROW-1;j++)
  266. {
  267. if(GraftBuf[i][j]==0)
  268.                 Closed[i][j]=NODIRECT;
  269. if(GraftBuf[i][j]!=0 && Closed[i][j]==NOTSEARCH)
  270. {
  271. int zigzag=6;
  272.                 sort(i,j,NODIRECT,zigzag);   
  273.               if(Closed[i][j]==NODIRECT)
  274. GraftBuf[i][j]=0;
  275. }
  276.             VetorRec[i][j]=Closed[i][j];
  277. }
  278. }
  279. int CImageObject::sort(int i, int j, int direct, int &zigzag)
  280. {
  281. int x,y;
  282. x=j;
  283. y=i;
  284. Closed[i][j]=GetSimiUnSearchPix(x,y);
  285. ZigzagFilter(zigzag,direct,Closed[i][j],y,x);
  286. if(Closed[i][j]==NODIRECT||zigzag<=0)
  287. {
  288. ///////////GetSimiUnSearchPix
  289. if(zigzag<=0)
  290. {
  291. Closed[y][x]=NODIRECT;//degrade gradually
  292. GraftBuf[y][x]=0;
  293. }
  294.         return Closed[i][j];//graftbuf[i][j]可能不为0
  295. }
  296. if(GraftBuf[y][x]==0&&Closed[y][x]==NODIRECT)
  297. {
  298.         Closed[i][j]=NODIRECT;
  299. return Closed[i][j];
  300. }
  301. if(x==ROW-1||y==COL-1||x==0||y==0)
  302. return Closed[i][j];
  303. else{
  304. //{
  305. int TAG=sort(y,x,Closed[i][j],zigzag);
  306. if(TAG!=NODIRECT)
  307. {
  308. if(zigzag<=0)
  309. {//degrade gradually,compare 2 directions
  310. if(Closed[i][j]!=TAG)
  311. {
  312. GraftBuf[y][x]=0;
  313. Closed[y][x]=NODIRECT;
  314. return Closed[i][j];
  315. }
  316. else{
  317. return Closed[i][j];//a sequence of same directions but zigzag=0
  318. }
  319. }
  320. else{//degrade suddently,zigzag!=0
  321. return Closed[i][j];
  322. }
  323. }
  324. else
  325. {
  326.                 return Closed[i][j];
  327. }
  328. }
  329. }
  330. int CImageObject::GetSimiUnSearchPix(int &xPos, int &yPos)
  331. {
  332. int Simi=255,x,y;
  333. x=xPos;
  334. y=yPos;
  335.     for(int i=y-1;i<=y+1;i++)
  336. for(int j=x-1;j<=x+1;j++)
  337. {
  338. if(GraftBuf[i][j]==0)
  339. Closed[i][j]=NODIRECT;
  340. if((i!=y||j!=x)&&Closed[i][j]==NOTSEARCH)
  341. {
  342. if(Simi>abs(GraftBuf[y][x]-GraftBuf[i][j]))
  343. {
  344.                     Simi=abs(GraftBuf[y][x]-GraftBuf[i][j]);
  345. yPos=i;
  346. xPos=j;
  347. }                
  348. }
  349. }
  350.     return GetDirection(x,y,xPos,yPos);
  351. }
  352. void CImageObject::ZigzagFilter(int &zigzag, int direct0, int direct1, int i, int j)
  353. {
  354. switch(direct0)
  355. {
  356. case UP:switch (direct1)
  357. {
  358. case UP:zigzag++; return;
  359. case LEFT:
  360. case RIGHT:zigzag-=1;return;//zig-=2
  361. case UPRIGHT:
  362. case UPLEFT:return;
  363. default:GraftBuf[i][j]=0;Closed[i][j]=NODIRECT;return;
  364. }
  365.     case UPRIGHT:switch (direct1)
  366.  {
  367.                case UP: 
  368.                case RIGHT: return;
  369.                case UPRIGHT:zigzag-=1;return;
  370.                default:GraftBuf[i][j]=0;Closed[i][j]=NODIRECT;return;
  371.  }
  372. case UPLEFT:switch (direct1)
  373. {
  374.               case UP: 
  375.               case LEFT: return;
  376.               case UPLEFT:zigzag-=1;return;
  377.               default:GraftBuf[i][j]=0;Closed[i][j]=NODIRECT;return;
  378. }
  379. case LEFT:switch (direct1)
  380.   {
  381. case LEFT: zigzag++; return;
  382. case UP:
  383. case DOWN:zigzag-=1;return;
  384. case DOWNLEFT:
  385. case UPLEFT:return;
  386. default:GraftBuf[i][j]=0;Closed[i][j]=NODIRECT;return;
  387.   }
  388. case RIGHT:switch (direct1)
  389.    {
  390. case RIGHT:zigzag++; return;
  391. case UP:
  392. case DOWN:zigzag-=1;return;
  393. case DOWNRIGHT:
  394. case UPRIGHT:return;
  395. default:GraftBuf[i][j]=0;Closed[i][j]=NODIRECT;return;
  396.    }
  397. case DOWN:switch (direct1)
  398.   {
  399. case DOWN:zigzag++; return;
  400. case LEFT:
  401. case RIGHT:zigzag-=1;return;
  402. case DOWNRIGHT:
  403. case DOWNLEFT:return;
  404. default:GraftBuf[i][j]=0;Closed[i][j]=NODIRECT;return;
  405.   }
  406. case DOWNRIGHT:switch (direct1)
  407.    {
  408.                   case DOWN: 
  409.                   case RIGHT: return;
  410.                   case DOWNRIGHT:zigzag-=1;return;
  411.                   default:GraftBuf[i][j]=0;Closed[i][j]=NODIRECT;return;
  412.    }
  413. case DOWNLEFT:switch (direct1)
  414.   {
  415.                 case DOWN: 
  416.                     case LEFT: return;
  417.     case DOWNLEFT:zigzag-=1;return;
  418.     default:GraftBuf[i][j]=0;Closed[i][j]=NODIRECT;return;
  419.   }
  420. default:return;
  421. }
  422. }
  423. void CImageObject::FilterDirectionPix(int direct, int i, int j, int &tol)
  424. {
  425.  int  nDir;
  426.      switch(direct)
  427.  {
  428.      case UP:nDir=GetVetor(i+1,j);   
  429.   if(nDir==direct)
  430.   {
  431.   tol++;
  432.   FilterDirectionPix(nDir,i+1,j,tol);
  433.   }
  434.      break;
  435.      case DOWN:nDir=GetVetor(i-1,j);
  436.  if(nDir==direct)
  437.  {
  438.  tol++;
  439.  FilterDirectionPix(nDir,i-1,j,tol);
  440.  }
  441.  break;
  442.  case LEFT:nDir=GetVetor(i,j-1);
  443.        if(nDir==direct)
  444.    {
  445.    tol++;
  446.    FilterDirectionPix(nDir,i,j-1,tol);
  447.    }
  448.  break;
  449.  case RIGHT:nDir=GetVetor(i,j+1);
  450.  if(nDir==direct)
  451.  {
  452.  tol++;
  453.  FilterDirectionPix(nDir,i,j+1,tol);
  454.  }
  455.  break;
  456.  case UPRIGHT:nDir=GetVetor(i+1,j+1);
  457.  if(nDir==direct)
  458.  {
  459.  tol++;
  460.  FilterDirectionPix(nDir,i+1,j+1,tol);
  461.  }
  462.  break;
  463.  case UPLEFT:nDir=GetVetor(i+1,j-1);
  464.  if(nDir==direct)
  465.  {
  466.  tol++;
  467.  FilterDirectionPix(nDir,i+1,j-1,tol);
  468.  }
  469.  break;
  470.  case DOWNRIGHT:nDir=GetVetor(i-1,j+1);
  471.  if(nDir==direct)
  472.  {
  473.  tol++;
  474.  FilterDirectionPix(nDir,i-1,j+1,tol);
  475.  }
  476.  break;
  477.  case DOWNLEFT:nDir=GetVetor(i-1,j-1);
  478.  if(nDir==direct)
  479.  {
  480.  tol++;
  481.  FilterDirectionPix(nDir,i-1,j-1,tol);
  482.  }
  483.  
  484.  break;
  485.  default:break;
  486.  }
  487.      FINISHED[i][j]=SEARCHED;
  488.  if(tol<5||tol>80)
  489.  {
  490.  GraftBuf[i][j]=0;
  491.  Closed[i][j]=NODIRECT;
  492.  }
  493.  return;
  494. }
  495. int CImageObject::GetVetor(int i, int j)
  496. {
  497.  return Closed[i][j];
  498. }
  499. void CImageObject::ResetNoise(int direct, int i, int j, int &tol)
  500. {
  501. switch(direct) {
  502.    case LEFT:   
  503.    if(GetVetor(i,j-1)==direct)
  504.    {
  505.    tol++;
  506.    if(j-1>0)
  507.    ResetNoise(Closed[i][j-1],i,j-1,tol);
  508.    }
  509.        break;
  510.    case RIGHT:
  511.    if(GetVetor(i,j+1)==direct)
  512.    {
  513.    tol++;
  514.    if(j+1<ROW)
  515.    ResetNoise(Closed[i][j+1],i,j+1,tol);
  516.    }
  517.        break;
  518.    default:break;
  519.    }
  520.    FINISHED[i][j]=SEARCHED;
  521.    if(tol>80)
  522.    {
  523.    GraftBuf[i][j]=0;
  524.    Closed[i][j]=NODIRECT;
  525.    }
  526.    return;
  527. }
  528. int CImageObject::GetDirection(unsigned int x0, unsigned int y0, unsigned int x1, unsigned int y1)
  529. {
  530. bool forward=(x1-x0)>0;
  531.     switch (forward)
  532. {
  533. case true:{
  534.           if((y1-y0)==0)
  535.   return RIGHT;
  536.   if((y1-y0)>0)
  537.   return UPRIGHT;
  538.   else
  539.   return DOWNRIGHT;
  540.   }
  541. case false:{
  542.           if((x1-x0)==0)
  543.   {
  544.   if((y1-y0)>0)
  545.   return UP;
  546.   if(y1-y0==0)
  547.   {
  548.  // GraftBuf[x0][y0]=0;
  549.   return NODIRECT;
  550.   }
  551.   else
  552.   return DOWN;   
  553.   }
  554.   if(y1-y0>0)
  555.   return UPLEFT;
  556.   if(y1-y0==0)
  557.   return LEFT;
  558.   if(y1-y0<0)
  559.   return DOWNLEFT;
  560.    }
  561. }
  562. }
  563. LPCandidate * CImageObject::GetLPPos()
  564. {
  565. int i,j,tolerance;
  566. plumb *cur,*p;
  567.    
  568. cur=&LPYBorder;
  569. for(j=0;j<ROW;j++)
  570. for(i=0;i<COL;i++)
  571. FINISHED[i][j]=NOTSEARCH;
  572. for(j=1;j<ROW;j++)
  573. for(i=1;i<COL;i++)
  574. {
  575. if((Closed[i][j]==UP||Closed[i][j]==DOWN)&&FINISHED[i][j]==NOTSEARCH)
  576. {
  577. int x=j,y=i;
  578. p=new plumb;
  579. p->direct=Closed[i][j];
  580. p->i0=i;
  581. p->j0=j;
  582. Cruiser(Closed[i][j],y,x);
  583. p->i1=y;
  584. p->j1=x;
  585. p->next=NULL;
  586. cur->next=p;
  587. cur=cur->next;
  588. }
  589. }
  590. cur=&LPXBorder;
  591. for(j=0;j<ROW;j++)
  592. for(i=0;i<COL;i++)
  593. FINISHED[i][j]=NOTSEARCH;
  594. for(i=1;i<COL;i++)
  595. for(j=1;j<ROW;j++)
  596. {
  597. if((Closed[i][j]==LEFT||Closed[i][j]==RIGHT)&&FINISHED[i][j]==NOTSEARCH)
  598. {
  599. int x=j,y=i;
  600. p=new plumb;
  601. p->direct=Closed[i][j];
  602. p->i0=i;
  603. p->j0=j;
  604. Cruiser(Closed[i][j],y,x);
  605. p->i1=y;
  606. p->j1=x;
  607. p->next=NULL;
  608. cur->next=p;
  609. cur=cur->next;
  610. }
  611. }
  612.    LPCandidate *pLP=&LPC;
  613.    p=LPYBorder.next;
  614.    while(p!=NULL)
  615.    {
  616.    plumb *cur=p->next;    
  617.    while(cur!=NULL)
  618.    {
  619.    if(abs(cur->j0-p->j0)>70&&abs(cur->j0-p->j0)<=150&&((p->i0>=cur->i0&&p->i0<=cur->i1)||(p->i1>=cur->i0&&p->i1<=cur->i1)))
  620.    {
  621.        LPCandidate * LPP=new LPCandidate;
  622.        plumb *ptr0=SelectEdge(p->j0,p->i0,cur->j0,cur->i0,DOWN);
  623.        LPP->x1=cur->j0;LPP->y1=ptr0->i0;
  624.        plumb *ptr1=SelectEdge(p->j0,p->i1,cur->j0,cur->i1,UP);
  625.        LPP->x0=p->j0;LPP->y0=ptr1->i0;
  626.                if(LPP->y0-LPP->y1<30&&LPP->y0-LPP->y1>15)
  627.    {
  628.    LPP->next=NULL;
  629.            pLP->next=LPP;
  630.        pLP=pLP->next;
  631.    }
  632.    else
  633.    {
  634.    delete LPP;
  635.    }
  636.    }
  637.    cur=cur->next;    
  638.    }
  639.    p=p->next;
  640.    }
  641.    /////纹理分析,叠加直方图均衡化图
  642.    double C=0,max=0;
  643.    P=NULL;
  644.    pLP=LPC.next;
  645.    if(pLP!=NULL)
  646.    while (pLP!=NULL) {
  647.    C=double(RAStat(pLP->x0,pLP->y0,pLP->x1,pLP->y1))/double(pLP->x1-pLP->x0);//double(pLP->x1-pLP->x0);
  648.    if((C>max||double(C/max)>0.9)&&double(pLP->x1-pLP->x0)/double(pLP->y0-pLP->y1)>3.2)//&&double(pLP->x1-pLP->x0)/double(pLP->y0-pLP->y1)<4)
  649.    {   
  650.    if(P!=NULL&&max>C)
  651.    {
  652.    if(abs(160-(pLP->x1+pLP->x0)/2)<abs(160-(P->x1+P->x0)/2))
  653.    {
  654.        max=C;
  655.            P=pLP;
  656.    }
  657.    }
  658.    else
  659.    {
  660.    max=C;
  661.    P=pLP;
  662.    }
  663.    }
  664.    pLP=pLP->next;
  665.    }
  666.   
  667.    if(P!=NULL)
  668.    {
  669.    LPLocated=true;
  670.    if(double(P->x1-P->x0)/double(P->y0-P->y1)>3.8)//扩充边界到上一边缘,修改LPLOCATE 结构
  671.    {
  672.    P->x0-=12;
  673.            P->x1+=6;
  674.    P->y0+=10;
  675.    P->y1-=10;
  676.    }
  677.    else
  678.    {
  679.    P->x0-=16;
  680.            P->x1+=10;
  681.    P->y0+=6;
  682.    P->y1-=6;
  683.    }
  684.        int k=0;
  685.    for(i=P->y1;i<=P->y0;i++)
  686.    {
  687.    BMPRec[i*ROW*3+P->x0*3]=0;
  688.    BMPRec[i*ROW*3+P->x0*3+1]=255;
  689.    BMPRec[i*ROW*3+P->x0*3+2]=0;
  690.    BMPRec[i*ROW*3+P->x1*3]=0;
  691.    BMPRec[i*ROW*3+P->x1*3+1]=255;
  692.    BMPRec[i*ROW*3+P->x1*3+2]=0;
  693.    
  694.    BMPRec[i*ROW*3+(P->x0-1)*3]=0;
  695.    BMPRec[i*ROW*3+(P->x0-1)*3+1]=255;
  696.    BMPRec[i*ROW*3+(P->x0-1)*3+2]=0;
  697.    BMPRec[i*ROW*3+(P->x1-1)*3]=0;
  698.    BMPRec[i*ROW*3+(P->x1-1)*3+1]=255;
  699.    BMPRec[i*ROW*3+(P->x1-1)*3+2]=0;
  700.    BMPRec[i*ROW*3+(P->x0+11)*3]=0;
  701.    BMPRec[i*ROW*3+(P->x0+1)*3+1]=255;
  702.    BMPRec[i*ROW*3+(P->x0+1)*3+2]=0;
  703.    BMPRec[i*ROW*3+(P->x1+1)*3]=0;
  704.    BMPRec[i*ROW*3+(P->x1+1)*3+1]=255;
  705.    BMPRec[i*ROW*3+(P->x1+1)*3+2]=0;
  706.    }
  707.    
  708.    for(j=P->x0;j<=P->x1;j++)
  709.    {
  710.    BMPRec[P->y0*ROW*3+j*3]=0;
  711.    BMPRec[P->y0*ROW*3+j*3+1]=255;
  712.    BMPRec[P->y0*ROW*3+j*3+2]=0;
  713.    BMPRec[P->y1*ROW*3+j*3]=0;
  714.    BMPRec[P->y1*ROW*3+j*3+1]=255;
  715.    BMPRec[P->y1*ROW*3+j*3+2]=0; 
  716.    BMPRec[(P->y1-1)*ROW*3+j*3]=0;
  717.    BMPRec[(P->y1-1)*ROW*3+j*3+1]=255;
  718.    BMPRec[(P->y1-1)*ROW*3+j*3+2]=0;
  719.    BMPRec[(P->y1-1)*ROW*3+j*3]=0;
  720.    BMPRec[(P->y1-1)*ROW*3+j*3+1]=255;
  721.    BMPRec[(P->y1-1)*ROW*3+j*3+2]=0; 
  722.    BMPRec[(P->y0+1)*ROW*3+j*3]=0;
  723.    BMPRec[(P->y0+1)*ROW*3+j*3+1]=255;
  724.    BMPRec[(P->y0+1)*ROW*3+j*3+2]=0;
  725.    BMPRec[(P->y0+1)*ROW*3+j*3]=0;
  726.    BMPRec[(P->y0+1)*ROW*3+j*3+1]=255;
  727.    BMPRec[(P->y0+1)*ROW*3+j*3+2]=0; 
  728.    }
  729.    }
  730.   if(!LPLocated)
  731.       Graft2BmpData();
  732.    else
  733.   Graft2BmpData(BMPRec);
  734.    Invalidate(FALSE);
  735.    return P;
  736. }
  737. void CImageObject::Cruiser(int direct, int &i, int &j)
  738. {
  739. int x=j,y=i;
  740. if(direct==DOWN||direct==UP)
  741. switch(direct) {
  742. case DOWN:
  743. if(GetVetor(i-1,j)==direct&&i-1>0)
  744. {
  745. i--;
  746.             Cruiser(DOWN,i,j);
  747. }
  748. break;
  749. case UP:
  750. if(GetVetor(i+1,j)==direct&&i+1<COL)
  751. {
  752. i++;
  753.             Cruiser(UP,i,j);
  754. }
  755. break;
  756. default:break;
  757. }
  758. else
  759. switch(direct) {
  760.     case LEFT:
  761. if(GetVetor(i,j-1)==direct&&j-1>0)
  762. {
  763. j--;
  764.             Cruiser(LEFT,i,j);
  765. }
  766. break;
  767.     case RIGHT:
  768. if(GetVetor(i,j+1)==direct&&j+1<ROW)
  769. {
  770. j++;
  771.             Cruiser(RIGHT,i,j);
  772. }
  773. break;
  774.     default:break;
  775. }
  776. FINISHED[y][x]=SEARCHED;
  777. return;
  778. }
  779. plumb * CImageObject::SelectEdge(int SX, int SY, int EX, int EY, int tag)
  780. {
  781. plumb *p=LPXBorder.next;
  782. struct plumb tmp;
  783. CDL.i0=0;
  784. CDL.i1=0;
  785. CDL.j0=0;
  786. CDL.j1=0;
  787. CDL.next=NULL;
  788. tmp=CDL;
  789. if(tag==DOWN)
  790.     {
  791. SY=(SY<EY)?SY:EY;
  792. while (p!=NULL) 
  793. {
  794.    if(p->i0>SY) 
  795.   break;
  796.    if((p->j1<=EX&&p->j0>SX)&&p->i0>tmp.i0)
  797.    {
  798.    tmp=*p;
  799.    p=p->next;
  800.    }
  801.    else
  802.   p=p->next;
  803. }
  804. CDL=tmp;
  805. return &CDL;
  806. }
  807. else
  808. {
  809. SY=(SY>EY)?SY:EY;
  810. while (p!=NULL) 
  811. {
  812. if(p->i0<SY)
  813. {
  814. p=p->next; 
  815. continue;
  816. }
  817. if(p->j1<=EX&&p->j0>SX)
  818. {
  819. tmp=*p;
  820. break;
  821. }
  822. else
  823. p=p->next;
  824. }
  825. CDL=tmp;
  826. return &CDL;
  827. }
  828. }
  829. int CImageObject::RAStat(int x0, int y0, int x1, int y1)
  830. {
  831. int nCount=0;
  832. int i,j;
  833. for(i=y1;i<=y0;i++)
  834. for(j=x0;j<=x1;j++)
  835. FINISHED[i][j]=NOTSEARCH;
  836. for(i=y1;i<y0;i++)
  837. for(j=x0;j<x1;j++)
  838. {
  839. if(VetorRec[i][j]==NODIRECT)
  840. {
  841. FINISHED[i][j]=SEARCHED;
  842. }
  843. else
  844. if(FINISHED[i][j]==NOTSEARCH)
  845. {
  846.                 RASearch(VetorRec[i][j],i,j,x0,y0,x1,y1,nCount);
  847. }
  848. }
  849. return nCount;
  850. }
  851. void CImageObject::Graft2BmpData(BYTE BMP[])
  852. {
  853.     int i,j,k;
  854. for(i=0;i<COL;i++)
  855. {
  856. for(j=0;j<ROW;j++)
  857. {
  858.             k = i*ROW+j;
  859. lpBuf[k*3]=BMP[k*3];
  860. lpBuf[k*3+1]=BMP[k*3+1];
  861. lpBuf[k*3+2]=BMP[k*3+2];
  862. }
  863. }
  864. }
  865. void CImageObject::RASearch(int direct, int i, int j, int x0, int y0, int x1, int y1, int &count)
  866. {
  867. switch(direct) {
  868. case UP:if(i+1<=y0)
  869. {
  870. FINISHED[i][j]=SEARCHED;
  871. if(VetorRec[i+1][j]==NODIRECT||FINISHED[i+1][j]==SEARCHED)
  872. return;
  873. if(VetorRec[i+1][j]==LEFT||VetorRec[i+1][j]==RIGHT||VetorRec[i+1][j]==UP)
  874. count+=5;//count++;
  875.                 RASearch(VetorRec[i+1][j],i+1,j,x0,y0,x1,y1,count);
  876. }
  877. break;
  878. case DOWN:if(i-1>=y1)
  879.   {
  880. FINISHED[i][j]=SEARCHED;
  881.     if(VetorRec[i-1][j]==NODIRECT||FINISHED[i-1][j]==SEARCHED)
  882.     return;
  883.     if(VetorRec[i-1][j]==LEFT||VetorRec[i-1][j]==RIGHT||VetorRec[i-1][j]==DOWN)
  884.     count+=5;
  885.     RASearch(VetorRec[i-1][j],i-1,j,x0,y0,x1,y1,count);
  886.   }
  887. break;
  888. case RIGHT:if(j+1<=x1)
  889.    {
  890.    FINISHED[i][j]=SEARCHED;
  891.    if(VetorRec[i][j+1]==NODIRECT||FINISHED[i][j+1]==SEARCHED)
  892.    return;
  893.    if(VetorRec[i][j+1]==UP||VetorRec[i][j+1]==DOWN)
  894.    count+=5;
  895.    RASearch(VetorRec[i][j+1],i,j+1,x0,y0,x1,y1,count);
  896.    }
  897. break;
  898. case LEFT:if(j-1>=x0)
  899.   {
  900.   FINISHED[i][j]=SEARCHED;
  901.   if(VetorRec[i][j-1]==NODIRECT||FINISHED[i][j-1]==SEARCHED)
  902.   return;
  903.   if(VetorRec[i][j-1]==UP||VetorRec[i][j-1]==DOWN)
  904.   count+=5;  
  905.   RASearch(VetorRec[i][j-1],i,j-1,x0,y0,x1,y1,count);
  906.   }
  907. break;
  908. case UPRIGHT:if(j+1<=x1&&i+1<=y0)
  909.  {
  910.  FINISHED[i][j]=SEARCHED;
  911.  if(VetorRec[i+1][j+1]==NODIRECT||FINISHED[i+1][j+1]==SEARCHED)
  912.  return;
  913. //  if(VetorRec[i+1][j+1]==UPLEFT||VetorRec[i+1][j+1]==DOWNRIGHT||VetorRec[i+1][j+1]==UPRIGHT)
  914. if(VetorRec[i+1][j+1]!=UPRIGHT)
  915.    count+=3;
  916.  RASearch(VetorRec[i+1][j+1],i+1,j+1,x0,y0,x1,y1,count);
  917.  }
  918. break;
  919. case DOWNRIGHT:if(j+1<=x1&&i-1>=y1)
  920.    {
  921.    FINISHED[i][j]=SEARCHED;
  922.    if(VetorRec[i-1][j+1]==NODIRECT||FINISHED[i-1][j+1]==SEARCHED)
  923.    return;
  924. //    if(VetorRec[i-1][j+1]==DOWNLEFT||VetorRec[i-1][j+1]==UPRIGHT)
  925.                        if(VetorRec[i-1][j+1]!=DOWNRIGHT)
  926.  count+=3;
  927.    RASearch(VetorRec[i-1][j+1],i-1,j+1,x0,y0,x1,y1,count);
  928.    }
  929. break;
  930. case UPLEFT:if(i+1<=y0&&j-1>=x0)
  931. {
  932. FINISHED[i][j]=SEARCHED;
  933. if(VetorRec[i+1][j-1]==NODIRECT||FINISHED[i+1][j-1]==SEARCHED)
  934. return;
  935. // if(VetorRec[i+1][j-1]==UPRIGHT||VetorRec[i+1][j-1]==DOWNLEFT)
  936.                     if(VetorRec[i+1][j-1]!=UPLEFT)
  937.  count+=3;
  938. RASearch(VetorRec[i+1][j-1],i+1,j-1,x0,y0,x1,y1,count);
  939. }
  940. break;
  941. case DOWNLEFT:if(j-1>=x0&&i-1>=y1)
  942.   {
  943.   FINISHED[i][j]=SEARCHED;
  944.   if(VetorRec[i-1][j-1]==NODIRECT||FINISHED[i-1][j-1]==SEARCHED)
  945.   return;
  946. //   if(VetorRec[i-1][j-1]==UPRIGHT||VetorRec[i-1][j-1]==DOWNRIGHT)
  947.   if(VetorRec[i-1][j-1]!=DOWNLEFT)
  948.  count+=3;
  949.   RASearch(VetorRec[i-1][j-1],i-1,j-1,x0,y0,x1,y1,count);
  950.   }
  951. break;
  952. default:break;
  953. }
  954.     return;
  955. }
  956. BITMAPINFO CImageObject::WriteDibFile(int Height, int Width, BYTE buf[])
  957. {
  958. ForLPR.bmiHeader.biBitCount=24;
  959. ForLPR.bmiHeader.biHeight=Height;
  960. ForLPR.bmiHeader.biWidth=Width;
  961. ForLPR.bmiHeader.biClrUsed=0;
  962. ForLPR.bmiHeader.biClrImportant=0;
  963. ForLPR.bmiHeader.biSizeImage=Height*Width*3;
  964. ForLPR.bmiHeader.biCompression=0;
  965. ForLPR.bmiHeader.biPlanes=1;
  966. ForLPR.bmiHeader.biXPelsPerMeter=3780;
  967. ForLPR.bmiHeader.biYPelsPerMeter=3780;
  968. ForLPR.bmiHeader.biSize=40;
  969. ForLPR.bmiColors[0]=*quad;
  970. int k=0;
  971. for(int i=P->y1;i<=P->y0;i++)
  972. {
  973. for(int j=P->x0;j<=P->x1;j++)
  974. {
  975.  buf[k++]=BMPRec[i*ROW*3+j*3];
  976.  buf[k++]=BMPRec[i*ROW*3+j*3+1];
  977.  buf[k++]=BMPRec[i*ROW*3+j*3+2];
  978. }
  979. while((k*8)%32!=0)
  980. buf[k++]=0;
  981. }
  982. return ForLPR;
  983. }
  984. void CImageObject::Binary(BITMAPINFO DIBINFO,BYTE buf[])
  985. {
  986. BYTE GrayLevel;
  987. int i,j,k;
  988. int w = DIBINFO.bmiHeader.biWidth;
  989. int h = DIBINFO.bmiHeader.biHeight;
  990.     for(i = 0; i < h ;i++)
  991. {
  992. for(j = 0; j < w;j++)
  993. {
  994. k = i*w+j;
  995. GrayLevel = BYTE(0.299*buf[k*3] + 0.587*buf[k*3+1] + 0.114 * buf[k*3+2]);
  996.             if(GrayLevel<120)
  997. {
  998. buf[k*3] = 0;
  999.     buf[k*3+1] = 0;
  1000.     buf[k*3+2] = 0;
  1001. }
  1002. else 
  1003. {
  1004. buf[k*3] = 255;
  1005.                 buf[k*3+1] = 255;
  1006.     buf[k*3+2] = 255;
  1007. }
  1008.     
  1009. }
  1010. }
  1011. }