PlateLocateView.cpp
上传用户:sgmlaoniu
上传日期:2013-03-16
资源大小:403k
文件大小:21k
源码类别:

Windows编程

开发平台:

Visual C++

  1. // PlateLocateView.cpp : implementation of the CPlateLocateView class
  2. //
  3. #include "stdafx.h"
  4. #include "PlateLocate.h"
  5. #include "MainFrm.h"
  6. #include "DlgIntensity.h"
  7. #include "PlateLocateDoc.h"
  8. #include "PlateLocateView.h"
  9. #include "PlateLocateMethod.h"
  10. #include "ColorTable.h"
  11. #ifdef _DEBUG
  12. #define new DEBUG_NEW
  13. #undef THIS_FILE
  14. static char THIS_FILE[] = __FILE__;
  15. #endif
  16. /////////////////////////////////////////////////////////////////////////////
  17. // CPlateLocateView
  18. IMPLEMENT_DYNCREATE(CPlateLocateView, CView)
  19. BEGIN_MESSAGE_MAP(CPlateLocateView, CView)
  20. //{{AFX_MSG_MAP(CPlateLocateView)
  21. ON_WM_ERASEBKGND()
  22. ON_COMMAND(ID_PLATE_PRE, OnPreProcess)
  23. ON_COMMAND(ID_VIEW_INTENSITY, OnViewIntensity)
  24. ON_COMMAND(ID_PLATE_TOGRAY, OnPlateToGray)
  25. ON_COMMAND(ID_PLATE_EQUA, OnPlateEqua)
  26. ON_COMMAND(ID_PLATE_ROBERT, OnPlateRobert)
  27. ON_COMMAND(ID_PLATE_LOCATE, OnPlateLocate)
  28. ON_COMMAND(ID_PLATE_CUT, OnPlateCut)
  29. ON_COMMAND(ID_BUTTON_TOGRAY, OnPlateToGray)
  30. ON_COMMAND(ID_BUTTON_EQUA, OnPlateEqua)
  31. ON_COMMAND(ID_BUTTON_ROBERT, OnPlateRobert)
  32. ON_COMMAND(ID_BUTTON_PRE, OnPreProcess)
  33. ON_COMMAND(ID_BUTTON_LOCATE, OnPlateLocate)
  34. ON_COMMAND(ID_BUTTON_CUT, OnPlateCut)
  35. ON_COMMAND(ID_PLATE_FILTER, OnPlateFilter)
  36.     ON_COMMAND(ID_BUTTON_FILTER, OnPlateFilter)
  37. //}}AFX_MSG_MAP
  38. // Standard printing commands
  39. ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
  40. ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
  41. ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
  42. END_MESSAGE_MAP()
  43. /////////////////////////////////////////////////////////////////////////////
  44. // CPlateLocateView construction/destruction
  45. CPlateLocateView::CPlateLocateView()
  46. {
  47. // TODO: add construction code here
  48. m_ipzLeft=0;
  49. m_ipzRight=0;
  50. m_ipzBottom=0;
  51. m_ipzTop=0;
  52. }
  53. CPlateLocateView::~CPlateLocateView()
  54. {
  55. }
  56. BOOL CPlateLocateView::PreCreateWindow(CREATESTRUCT& cs)
  57. {
  58. // TODO: Modify the Window class or styles here by modifying
  59. //  the CREATESTRUCT cs
  60. return CView::PreCreateWindow(cs);
  61. }
  62. /////////////////////////////////////////////////////////////////////////////
  63. // CPlateLocateView drawing
  64. void CPlateLocateView::OnDraw(CDC* pDC)
  65. {
  66. // 显示等待光标
  67. BeginWaitCursor();
  68. // 获取文档
  69. CPlateLocateDoc* pDoc = GetDocument();
  70. ASSERT_VALID(pDoc);
  71. // 获取DIB
  72. HDIB hDIB = pDoc->GetHDIB();
  73. // 判断DIB是否为空
  74. if (hDIB != NULL)
  75. {
  76. LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);
  77. // 获取DIB宽度
  78. int cxDIB = (int) ::DIBWidth(lpDIB);
  79. // 获取DIB高度
  80. int cyDIB = (int) ::DIBHeight(lpDIB);
  81. ::GlobalUnlock((HGLOBAL) hDIB);
  82. CRect rcDIB;
  83. rcDIB.top = rcDIB.left = 0;
  84. rcDIB.right = cxDIB;
  85. rcDIB.bottom = cyDIB;
  86. CRect rcDest;
  87. // 判断是否是打印
  88. if (pDC->IsPrinting())
  89. {
  90. // 是打印,计算输出图像的位置和大小,以便符合页面
  91. // 获取打印页面的水平宽度(象素)
  92. int cxPage = pDC->GetDeviceCaps(HORZRES);
  93. // 获取打印页面的垂直高度(象素)
  94. int cyPage = pDC->GetDeviceCaps(VERTRES);
  95. // 获取打印机每英寸象素数
  96. int cxInch = pDC->GetDeviceCaps(LOGPIXELSX);
  97. int cyInch = pDC->GetDeviceCaps(LOGPIXELSY);
  98. // 计算打印图像大小(缩放,根据页面宽度调整图像大小)
  99. rcDest.top = rcDest.left = 0;
  100. rcDest.bottom = (int)(((double)cyDIB * cxPage * cyInch)
  101. / ((double)cxDIB * cxInch));
  102. rcDest.right = cxPage;
  103. // 计算打印图像位置(垂直居中)
  104. int temp = cyPage - (rcDest.bottom - rcDest.top);
  105. rcDest.bottom += temp/2;
  106. rcDest.top += temp/2;
  107. }
  108. else   
  109. // 非打印
  110. {
  111. // 不必缩放图像
  112. rcDest = rcDIB;
  113. }
  114. // 输出DIB
  115. ::PaintDIB(pDC->m_hDC, &rcDest, pDoc->GetHDIB(),
  116. &rcDIB, pDoc->GetDocPalette());
  117. }
  118. // 恢复正常光标
  119. EndWaitCursor();
  120. }
  121. /////////////////////////////////////////////////////////////////////////////
  122. // CPlateLocateView printing
  123. BOOL CPlateLocateView::OnPreparePrinting(CPrintInfo* pInfo)
  124. {
  125. // default preparation
  126. return DoPreparePrinting(pInfo);
  127. }
  128. void CPlateLocateView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  129. {
  130. // TODO: add extra initialization before printing
  131. }
  132. void CPlateLocateView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  133. {
  134. // TODO: add cleanup after printing
  135. }
  136. /////////////////////////////////////////////////////////////////////////////
  137. // CPlateLocateView diagnostics
  138. #ifdef _DEBUG
  139. void CPlateLocateView::AssertValid() const
  140. {
  141. CView::AssertValid();
  142. }
  143. void CPlateLocateView::Dump(CDumpContext& dc) const
  144. {
  145. CView::Dump(dc);
  146. }
  147. CPlateLocateDoc* CPlateLocateView::GetDocument() // non-debug version is inline
  148. {
  149. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CPlateLocateDoc)));
  150. return (CPlateLocateDoc*)m_pDocument;
  151. }
  152. #endif //_DEBUG
  153. /////////////////////////////////////////////////////////////////////////////
  154. // CPlateLocateView message handlers
  155. LRESULT CPlateLocateView::OnDoRealize(WPARAM wParam, LPARAM)
  156. {
  157. ASSERT(wParam != NULL);
  158. // 获取文档
  159. CPlateLocateDoc* pDoc = GetDocument();
  160. // 判断DIB是否为空
  161. if (pDoc->GetHDIB() == NULL)
  162. {
  163. // 直接返回
  164. return 0L;
  165. }
  166. // 获取Palette
  167. CPalette* pPal = pDoc->GetDocPalette();
  168. if (pPal != NULL)
  169. {
  170. // 获取MainFrame
  171. CMainFrame* pAppFrame = (CMainFrame*) AfxGetApp()->m_pMainWnd;
  172. ASSERT_KINDOF(CMainFrame, pAppFrame);
  173. CClientDC appDC(pAppFrame);
  174. // All views but one should be a background palette.
  175. // wParam contains a handle to the active view, so the SelectPalette
  176. // bForceBackground flag is FALSE only if wParam == m_hWnd (this view)
  177. CPalette* oldPalette = appDC.SelectPalette(pPal, ((HWND)wParam) != m_hWnd);
  178. if (oldPalette != NULL)
  179. {
  180. UINT nColorsChanged = appDC.RealizePalette();
  181. if (nColorsChanged > 0)
  182. pDoc->UpdateAllViews(NULL);
  183. appDC.SelectPalette(oldPalette, TRUE);
  184. }
  185. else
  186. {
  187. TRACE0("tCCh1_1View::OnPaletteChanged中调用SelectPalette()失败!n");
  188. }
  189. }
  190. return 0L;
  191. }
  192. BOOL CPlateLocateView::OnEraseBkgnd(CDC* pDC) 
  193. {
  194. // 主要是为了设置子窗体默认的背景色
  195. // 背景色由文档成员变量m_refColorBKG指定
  196. // 获取文档
  197. CPlateLocateDoc* pDoc = GetDocument();
  198. // 创建一个Brush
  199. CBrush brush(pDoc->m_refColorBKG);                                              
  200. // 保存以前的Brush
  201. CBrush* pOldBrush = pDC->SelectObject(&brush);
  202. // 获取重绘区域
  203. CRect rectClip;
  204. pDC->GetClipBox(&rectClip);
  205. // 重绘
  206. pDC->PatBlt(rectClip.left, rectClip.top, rectClip.Width(), rectClip.Height(), PATCOPY);
  207. // 恢复以前的Brush
  208. pDC->SelectObject(pOldBrush); 
  209. // 返回
  210. return TRUE;
  211. //return CView::OnEraseBkgnd(pDC);
  212. }
  213. void CPlateLocateView::OnViewIntensity() 
  214. {
  215. // 查看当前图像灰度直方图
  216. // 获取文档
  217. CPlateLocateDoc* pDoc = GetDocument();
  218. // 指向DIB的指针
  219. LPSTR lpDIB;
  220. // 指向DIB象素指针
  221. LPSTR    lpDIBBits;
  222. // 锁定DIB
  223. lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
  224. // 找到DIB图像象素起始位置
  225. lpDIBBits = ::FindDIBBits(lpDIB);
  226. // 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图,其它的可以类推)
  227. if (::DIBNumColors(lpDIB) != 256)
  228. {
  229. // 提示用户
  230. MessageBox("目前只支持查看256色位图灰度直方图!", "系统提示" , MB_ICONINFORMATION | MB_OK);
  231. // 解除锁定
  232. ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
  233. // 返回
  234. return;
  235. }
  236. // 更改光标形状
  237. BeginWaitCursor();
  238. // 创建对话框
  239. CDlgIntensity dlgPara;
  240. // 初始化变量值
  241. dlgPara.m_lpDIBBits = lpDIBBits;
  242. dlgPara.m_lWidth = ::DIBWidth(lpDIB);
  243. dlgPara.m_lHeight = ::DIBHeight(lpDIB);
  244. dlgPara.m_iLowGray = 0;
  245. dlgPara.m_iUpGray = 255;
  246. // 显示对话框,提示用户设定平移量
  247. if (dlgPara.DoModal() != IDOK)
  248. {
  249. // 返回
  250. return;
  251. }
  252. // 解除锁定
  253. ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
  254. // 恢复光标
  255. EndWaitCursor();
  256. }
  257. void CPlateLocateView::OnTempSubrect() 
  258. {
  259. CPlateLocateDoc* pDoc = GetDocument();
  260. HDIB hDIB,hNewDIB;
  261. hDIB=pDoc->GetHDIB();
  262. long lWidth;                    //图像宽度和高度
  263. long lHeight;
  264. // 指向DIB的指针
  265. LPSTR lpDIB;
  266. lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());//获得当前位图
  267. // 找到DIB图像象素起始位置
  268. lWidth = ::DIBWidth(lpDIB);   //DIB 宽度
  269. lHeight = ::DIBHeight(lpDIB); //DIB 高度
  270.     //假定的剪裁区域(车牌附近)
  271. //
  272. CRect rect(m_ipzLeft,m_ipzTop,m_ipzRight,m_ipzBottom);
  273. // CRect rect(m_ipzLeft,190,m_ipzRight,240);
  274. //CRect rect(0,190,lWidth,260);
  275. // CRect rect(0,m_ipzTop,lWidth,m_ipzBottom);
  276. hNewDIB= myCropDIB(hDIB,rect);
  277. if (OpenClipboard())
  278. {
  279. EmptyClipboard();
  280. SetClipboardData (CF_DIB, CopyHandle((HANDLE) hNewDIB ));
  281. CloseClipboard();
  282. }
  283. }
  284. void CPlateLocateView::OnPlateToGray() 
  285. {
  286. CPlateLocateDoc* pDoc = GetDocument(); //获取文档
  287. LPSTR lpDIB;                       //指向DIB的指针
  288. lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
  289. ConvertToGrayScale(lpDIB);
  290. OnEditCopy();
  291. ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
  292. pDoc->SetModifiedFlag(TRUE);
  293. pDoc->UpdateAllViews(NULL);
  294. }
  295. void CPlateLocateView::OnPlateEqua() 
  296. {
  297. // 灰度均衡
  298. // 获取文档
  299. CPlateLocateDoc* pDoc = GetDocument();
  300. // 指向DIB的指针
  301. LPSTR lpDIB;
  302. // 指向DIB象素指针
  303. LPSTR    lpDIBBits;
  304. // 锁定DIB
  305. lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
  306. // 找到DIB图像象素起始位置
  307. lpDIBBits = ::FindDIBBits(lpDIB);
  308. // 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的直方图均衡,其它的可以类推)
  309. if (::DIBNumColors(lpDIB) != 256)
  310. {
  311. // 提示用户
  312. MessageBox("目前只支持256色位图的直方图均衡!", "系统提示" , 
  313. MB_ICONINFORMATION | MB_OK);
  314. // 解除锁定
  315. ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
  316. // 返回
  317. return;
  318. }
  319. // 更改光标形状
  320. BeginWaitCursor();
  321. // 调用InteEqualize()函数进行直方图均衡
  322. InteEqualize(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB));
  323. // 设置脏标记
  324. pDoc->SetModifiedFlag(TRUE);
  325. // 更新视图
  326. pDoc->UpdateAllViews(NULL);
  327. // 解除锁定
  328. ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
  329. // 恢复光标
  330. EndWaitCursor();
  331. }
  332. void CPlateLocateView::OnPlateRobert() 
  333. {
  334. //Robert边缘检测运算
  335. // 获取文档
  336. CPlateLocateDoc* pDoc = GetDocument();
  337. // 指向DIB的指针
  338. LPSTR lpDIB;
  339. // 指向DIB象素指针
  340. LPSTR   lpDIBBits;
  341. // 锁定DIB
  342. lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
  343. // 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的边缘检测,其它的可以类推)
  344. if (::DIBNumColors(lpDIB) != 256)
  345. {
  346. // 提示用户
  347. MessageBox("目前只支持256色位图的运算!", "系统提示" , MB_ICONINFORMATION | MB_OK);
  348. // 解除锁定
  349. ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
  350. // 返回
  351. return;
  352. }
  353. // 更改光标形状
  354. BeginWaitCursor();
  355. // 找到DIB图像象素起始位置
  356. lpDIBBits = ::FindDIBBits(lpDIB);
  357. // 调用RobertDIB()函数对DIB进行边缘检测
  358. if (RobertDIB(lpDIBBits, WIDTHBYTES(::DIBWidth(lpDIB) * 8), ::DIBHeight(lpDIB)))
  359. {
  360. // 设置脏标记
  361. pDoc->SetModifiedFlag(TRUE);
  362. // 更新视图
  363. pDoc->UpdateAllViews(NULL);
  364. }
  365. else
  366. {
  367. // 提示用户
  368. MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
  369. }
  370. // 解除锁定
  371. ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
  372. // 恢复光标
  373. EndWaitCursor();
  374. }
  375. void CPlateLocateView::OnThresholdTrans() 
  376. {
  377. CPlateLocateDoc* pDoc=GetDocument();   //获得文档
  378. LPSTR lpDIB;                       //指向DIB的指针
  379. LPSTR lpDIBBits;                   //指向DIB的象素的指针
  380.     LONG lLineBytes;
  381. unsigned char * lpSrc;             //指向原图像象素点的指针
  382.     long lWidth;                       //图像宽度和高度
  383. long lHeight;
  384. long i,j;           //循环变量
  385. OnEditCopy();
  386. lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());//获得当前位图
  387. // 找到DIB图像象素起始位置
  388. lpDIBBits = ::FindDIBBits(lpDIB);
  389. lWidth = ::DIBWidth(lpDIB);   //DIB 宽度
  390. lHeight = ::DIBHeight(lpDIB); //DIB 高度
  391. // 计算图像每行的字节数
  392. lLineBytes = WIDTHBYTES(lWidth * 8);
  393. long lCount[256];
  394. for(i=0;i<256;i++)
  395. {
  396. lCount[i]=0;  //清零
  397. }
  398. if(::DIBNumColors(lpDIB) != 256)  //256色位图不作任何处理
  399. {
  400. return;
  401. }
  402. for(i=0;i<lHeight;i++)
  403. {
  404. for(j=0;j<lWidth;j++)
  405. {
  406. lpSrc=(unsigned char *)lpDIB+lLineBytes*i+j;
  407. lCount[*(lpSrc)]++;
  408. }
  409. }
  410. /*// 灰度均衡
  411. // 获取文档
  412. //CTypeRecDoc* pDoc = GetDocument();
  413. // 指向DIB的指针
  414. // LPSTR lpDIB;
  415. // 指向DIB象素指针
  416. //LPSTR    lpDIBBits;
  417. // 锁定DIB
  418. lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
  419. // 找到DIB图像象素起始位置
  420. lpDIBBits = ::FindDIBBits(lpDIB);
  421. // 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的直方图均衡,其它的可以类推)
  422. if (::DIBNumColors(lpDIB) != 256)
  423. {
  424. // 提示用户
  425. MessageBox("目前只支持256色位图的直方图均衡!", "系统提示" , 
  426. MB_ICONINFORMATION | MB_OK);
  427. // 解除锁定
  428. ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
  429. // 返回
  430. return;
  431. }
  432. // 更改光标形状
  433. BeginWaitCursor();
  434. // 调用InteEqualize()函数进行直方图均衡
  435. InteEqualize(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB));
  436. // 设置脏标记
  437. pDoc->SetModifiedFlag(TRUE);
  438. // 更新视图
  439. pDoc->UpdateAllViews(NULL);
  440. // 解除锁定
  441. ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
  442. // 恢复光标
  443. EndWaitCursor();*/
  444. long total = 0;
  445. long total1 = 0;
  446. for(i = 0;i < 256;i++)
  447. {
  448. total += lCount[i];
  449. }
  450. int aver = total / 256;
  451. int mostClosed = 0;
  452. for(i = 0;i < 256;i++)
  453. {
  454. if((abs(aver - lCount[i]) < abs(aver - lCount[mostClosed])))
  455. {
  456. mostClosed = i;
  457. }
  458. }
  459. for(i = 0;i < 100; i++)
  460. {
  461. total1 += lCount[i];
  462. }
  463. //求窗口变换的上限和下限
  464. //
  465. long temp[16];
  466. int k=0;
  467. for(k=0;k<16;k++)
  468. {
  469. temp[k]=0;
  470. for(i=k*16;i<(k+1)*16;i++)
  471. temp[k]+=lCount[i];
  472. }
  473. long max=0;
  474. int t=0;
  475. for(k=15;k>=0;k--)
  476. {
  477. if(temp[k]>max)
  478. {
  479. max=temp[k];
  480. t=k;
  481. }
  482. }
  483. int bLow=0,bUp=0;
  484. bLow=(t-1)*16;
  485. // bUp=(t+5)*16;
  486. // bLow=100;
  487. bUp=255;
  488. // 阈值
  489. INT bThre;
  490. bThre=(INT)((2*bUp+bLow)/3);
  491. if(double(total1) / total > 0.2)//图片比较亮
  492. bThre = 200;
  493. if(double(total1) / total > 0.25)
  494. bThre = 160;
  495.     if(double(total1) / total > 0.3)
  496. bThre = 150;
  497. if(double(total1) / total > 0.34)
  498. bThre = 130;
  499. if(double(total1) / total > 0.38)
  500. bThre = 110;
  501. if(double(total1) / total > 0.4)
  502. bThre = 100;
  503. if(double(total1) / total > 0.5)
  504. bThre = 90;
  505. if(double(total1) / total > 0.6)//图片比较黑
  506. bThre = 80;
  507. // 更改光标形状
  508. BeginWaitCursor();
  509. // 调用ThresholdTrans()函数进行阈值变换
  510. ThresholdTrans(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB), 100);
  511. pDoc->SetModifiedFlag(TRUE);
  512. pDoc->UpdateAllViews(NULL);
  513. ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
  514. // 恢复光标
  515. EndWaitCursor();
  516. }
  517. //(2)削弱背景干扰。对图像B作简单的相邻像素灰度值相减,得到新的图像G,
  518. //即Gi,j=|Pi,j-Pi,j-1|i=0,1,…,439;j=0,1,…,639Gi,0=Pi,0,左边缘直接赋值,
  519. //不会影响整体效果。
  520. //
  521. void CPlateLocateView::OnWeakenBkgInerfere() 
  522. {
  523. CPlateLocateDoc* pDoc=GetDocument();   //获得文档
  524. LPSTR lpDIB;                       //指向DIB的指针
  525. lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());//获得当前位图
  526. //用自定义的模板消弱背景干扰
  527. myTemplate(lpDIB);
  528. pDoc->SetModifiedFlag(TRUE);
  529. pDoc->UpdateAllViews(NULL);
  530. ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
  531. }
  532. void CPlateLocateView::OnMidFilter() 
  533. {
  534. // 中值滤波
  535. // 获取文档
  536. CPlateLocateDoc* pDoc = GetDocument();
  537. // 指向DIB的指针
  538. LPSTR lpDIB;
  539. // 指向DIB象素指针
  540. LPSTR   lpDIBBits;
  541. // 滤波器的高度
  542. int iFilterH;
  543. // 滤波器的宽度
  544. int iFilterW;
  545. // 中心元素的X坐标
  546. int iFilterMX;
  547. // 中心元素的Y坐标
  548. int iFilterMY;
  549. // 锁定DIB
  550. lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
  551. // 找到DIB图像象素起始位置
  552. lpDIBBits = ::FindDIBBits(lpDIB);
  553. // 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的中值滤波,其它的可以类推)
  554. if (::DIBNumColors(lpDIB) != 256)
  555. {
  556. // 提示用户
  557. MessageBox("目前只支持256色位图的中值滤波!", "系统提示" ,
  558. MB_ICONINFORMATION | MB_OK);
  559. // 解除锁定
  560. ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
  561. // 返回
  562. return;
  563. }
  564. // 创建对话框
  565. // 初始化变量值
  566. iFilterH = 5;
  567. iFilterW = 1;
  568. iFilterMX = 0;
  569. iFilterMY = 2;
  570. // 更改光标形状
  571. BeginWaitCursor();
  572. // 调用MedianFilter()函数中值滤波
  573. if (myMedianFilter(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB), 
  574. iFilterH, iFilterW, iFilterMX, iFilterMY))
  575. {
  576. // 设置脏标记
  577. pDoc->SetModifiedFlag(TRUE);
  578. // 更新视图
  579. pDoc->UpdateAllViews(NULL);
  580. }
  581. else
  582. {
  583. // 提示用户
  584. MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
  585. }
  586. // 解除锁定
  587. ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
  588. // 恢复光标
  589. EndWaitCursor();
  590. }
  591. void CPlateLocateView::OnFindPlate() 
  592. {
  593. CPlateLocateDoc* pDoc=GetDocument();   //获得文档
  594. LPSTR lpDIB;                       //指向DIB的指针
  595.     long lWidth;                       //图像宽度和高度
  596. long lHeight;
  597. lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());//获得当前位图
  598. lWidth = ::DIBWidth(lpDIB);   //DIB 宽度
  599. lHeight = ::DIBHeight(lpDIB); //DIB 高度
  600. //水平投影,求取车牌子图像的上下边缘位置
  601. //
  602. myHprojectDIB(lpDIB, lWidth, lHeight,&m_ipzTop, &m_ipzBottom) ;
  603. m_ipzLeft=0;
  604. m_ipzRight=lWidth;
  605. HDIB hDIB;
  606. HDIB hNewDIB;
  607. hDIB=pDoc->GetHDIB();
  608. //假定的剪裁区域(车牌附近)
  609. //
  610. CRect rect(m_ipzLeft,m_ipzTop,m_ipzRight,m_ipzBottom);
  611. hNewDIB= myCropDIB(hDIB,rect);
  612. // 判断是否剪裁成功
  613. if (hNewDIB != NULL)
  614. {
  615. // 获取文档
  616. CPlateLocateDoc* pDoc = GetDocument();
  617. // 替换DIB,同时释放旧DIB对象
  618. pDoc->ReplaceHDIB(hNewDIB);
  619. // 更新DIB大小和调色板
  620. pDoc->InitDIBData();
  621. // 设置脏标记
  622. pDoc->SetModifiedFlag(TRUE);
  623. // 实现新的调色板
  624. OnDoRealize((WPARAM)m_hWnd,0);
  625. }
  626. //5
  627. lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());//获得当前位图
  628. lWidth = ::DIBWidth(lpDIB);   //DIB 宽度
  629. lHeight =::DIBHeight(lpDIB); //DIB 高度
  630. myVprojectDIB(lpDIB, lWidth, lHeight,&m_ipzLeft, &m_ipzRight) ;
  631. pDoc->UpdateAllViews(NULL);
  632. ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
  633. }
  634. void CPlateLocateView::OnEditCopy() 
  635. {
  636. // 复制当前图像
  637. // 获取文档
  638. CPlateLocateDoc* pDoc = GetDocument();
  639. // 打开剪贴板
  640. if (OpenClipboard())
  641. {
  642. // 更改光标形状
  643. BeginWaitCursor();
  644. // 清空剪贴板
  645. EmptyClipboard();
  646. // 复制当前图像到剪贴板
  647. SetClipboardData (CF_DIB, CopyHandle((HANDLE) pDoc->GetHDIB()) );
  648. // 关闭剪贴板
  649. CloseClipboard();
  650. // 恢复光标
  651. EndWaitCursor();
  652. }
  653. }
  654. void CPlateLocateView::OnEditPaste() 
  655. {
  656. // 粘贴图像
  657. // 创建新DIB
  658. HDIB hNewDIB = NULL;
  659. // 打开剪贴板
  660. if (OpenClipboard())
  661. {
  662. // 更改光标形状
  663. BeginWaitCursor();
  664. // 读取剪贴板中的图像
  665. hNewDIB = (HDIB) CopyHandle(::GetClipboardData(CF_DIB));
  666. // 关闭剪贴板
  667. CloseClipboard();
  668. // 判断是否读取成功
  669. if (hNewDIB != NULL)
  670. {
  671. // 获取文档
  672. CPlateLocateDoc* pDoc = GetDocument();
  673. // 替换DIB,同时释放旧DIB对象
  674. pDoc->ReplaceHDIB(hNewDIB);
  675. // 更新DIB大小和调色板
  676. pDoc->InitDIBData();
  677. // 设置脏标记
  678. pDoc->SetModifiedFlag(TRUE);
  679. // 重新设置滚动视图大小
  680. // SetScrollSizes(MM_TEXT, pDoc->GetDocSize());
  681. // 实现新的调色板
  682. OnDoRealize((WPARAM)m_hWnd,0);
  683. // 更新视图
  684. pDoc->UpdateAllViews(NULL);
  685. }
  686. // 恢复光标
  687. EndWaitCursor();
  688. }
  689. }
  690. void CPlateLocateView::OnPreProcess() 
  691. {
  692. OnEditPaste();
  693. OnThresholdTrans();
  694. OnWeakenBkgInerfere();
  695. }
  696. void CPlateLocateView::OnPlateLocate()
  697. {
  698. OnFindRightAngle();
  699. }
  700. void CPlateLocateView::OnPlateCut() 
  701. {
  702. OnEditPaste();
  703. OnTempSubrect();
  704. OnEditPaste();
  705. }
  706. void CPlateLocateView::OnFindRightAngle()
  707. {
  708. CPlateLocateDoc* pDoc=GetDocument();   //获得文档
  709. LPSTR lpDIB;                       //指向DIB的指针
  710. lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());//获得当前位图
  711. CDC* pDC = GetDC();
  712. myFindRightAngle(pDC,lpDIB,&m_ipzLeft,&m_ipzTop,&m_ipzRight,&m_ipzBottom);
  713. DrawRectangle(pDC,m_ipzLeft,m_ipzTop,m_ipzRight,m_ipzBottom);
  714. }
  715. void CPlateLocateView::OnPlateFilter() 
  716. {
  717. CPlateLocateDoc* pDoc=GetDocument();   //获得文档
  718. LPSTR lpDIB;                       //指向DIB的指针
  719. LPSTR lpDIBBits;                   //指向DIB的象素的指针
  720.     LONG lLineBytes;
  721. //unsigned char * lpSrc;             //指向原图像象素点的指针
  722.     long lWidth;                       //图像宽度和高度
  723. long lHeight;
  724. lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());//获得当前位图
  725. // 找到DIB图像象素起始位置
  726. lpDIBBits = ::FindDIBBits(lpDIB);
  727. lWidth = ::DIBWidth(lpDIB);   //DIB 宽度
  728. lHeight = ::DIBHeight(lpDIB); //DIB 高度
  729. // 计算图像每行的字节数
  730. lLineBytes = WIDTHBYTES(lWidth * 8);
  731. // 更改光标形状
  732. BeginWaitCursor();
  733. // 调用ThresholdTrans()函数进行阈值变换
  734. ThresholdTrans(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB), 128);
  735. pDoc->SetModifiedFlag(TRUE);
  736. pDoc->UpdateAllViews(NULL);
  737. ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
  738. // 恢复光标
  739. EndWaitCursor();
  740. }