ydpdView.cpp
上传用户:seppec
上传日期:2010-02-09
资源大小:2347k
文件大小:11k
源码类别:

2D图形编程

开发平台:

Visual C++

  1. // ydpdView.cpp : implementation of the CYdpdView class
  2. //
  3. #include "stdafx.h"
  4. #include "ydpd.h"
  5. #include "ydpdDoc.h"
  6. #include "ydpdView.h"
  7. #include "DIB.h"
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. /////////////////////////////////////////////////////////////////////////////
  14. // CYdpdView
  15. DIB cDib;
  16. extern HANDLE hDIBBK1;
  17. extern HANDLE hDIBBK2;
  18. extern HANDLE hDIBBKGray;
  19. extern HANDLE hDIBBKGradient;
  20. HANDLE hDIBCurrent = NULL;
  21. CPoint ImportantPoint,ImportantPoint2,ImpPoiCur;
  22. CPoint ImportantPointSecond;
  23. int ImportantColorInfo[RADIUS*2+1][RADIUS*2+1][3];
  24. int locax,locay;
  25. IMPLEMENT_DYNCREATE(CYdpdView, CScrollView)
  26. BEGIN_MESSAGE_MAP(CYdpdView, CScrollView)
  27. //{{AFX_MSG_MAP(CYdpdView)
  28. ON_COMMAND(ID_MENU_BK_FIRST, OnMenuBkFirst)
  29. ON_COMMAND(ID_MENU_BK_SECOND, OnMenuBkSecond)
  30. ON_COMMAND(ID_MENU_BK_GRAY, OnMenuBkGray)
  31. ON_COMMAND(ID_MENU_GRADIENT, OnMenuGradient)
  32. ON_COMMAND(ID_MENU_PIPEIZHONGXIN, OnMenuPipeizhongxin)
  33. ON_COMMAND(ID_MENU_TEZHENGQUYU, OnMenuTezhengquyu)
  34. ON_COMMAND(ID_MENU_PIPEI, OnMenuPipei)
  35. ON_COMMAND(ID_MEDIFILTER, OnMedifilter)
  36. ON_COMMAND(ID_MENU_FILElOAD, OnMENUFILElOAD)
  37. ON_COMMAND(ID_MENU_YDPD_PIPEI, OnMenuYdpdPipei)
  38. ON_COMMAND(ID_MENU_YDPD_MEDI, OnMenuYdpdMedi)
  39. ON_COMMAND(ID_MENU_YDPD_LKTQ, OnMenuYdpdLktq)
  40. ON_COMMAND(ID_SECOND_PIPEI, OnSecondPipei)
  41. //}}AFX_MSG_MAP
  42. // Standard printing commands
  43. ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
  44. ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
  45. ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
  46. END_MESSAGE_MAP()
  47. /////////////////////////////////////////////////////////////////////////////
  48. // CYdpdView construction/destruction
  49. CYdpdView::CYdpdView()
  50. {
  51. hDIBBK1 = NULL;
  52. hDIBBK2 = NULL;
  53. hDIBBKGray = NULL;
  54. hDIBBKGradient = NULL;
  55. isTeZhengZhi = false;
  56. isBKChonsen = false;
  57. m_Pointnum =0;
  58. }
  59. CYdpdView::~CYdpdView()
  60. {
  61. }
  62. BOOL CYdpdView::PreCreateWindow(CREATESTRUCT& cs)
  63. {
  64. // TODO: Modify the Window class or styles here by modifying
  65. //  the CREATESTRUCT cs
  66. return CScrollView::PreCreateWindow(cs);
  67. }
  68. /////////////////////////////////////////////////////////////////////////////
  69. // CYdpdView drawing
  70. void CYdpdView::OnDraw(CDC* pDC)
  71. {
  72. CYdpdDoc* pDoc = GetDocument();
  73. ASSERT_VALID(pDoc);
  74. if(hDIBBK1 && hDIBBKGray== NULL)
  75. cDib.PaintDIBTrue(pDC->GetSafeHdc(),CRect(0,0,m_bk_first_width,m_bk_first_height),
  76. hDIBBK1,CRect(0,0,m_bk_first_width,m_bk_first_height),SRCCOPY);
  77. if(hDIBBKGray && hDIBBKGradient == NULL)
  78. cDib.PaintDIBTrue(pDC->GetSafeHdc(),CRect(0,0,m_bk_first_width,m_bk_first_height),
  79. hDIBBKGray,CRect(0,0,m_bk_first_width,m_bk_first_height),SRCCOPY);
  80. if(hDIBBKGradient)
  81. cDib.PaintDIBTrue(pDC->GetSafeHdc(),CRect(0,0,m_bk_first_width,m_bk_first_height),
  82. hDIBBKGradient,CRect(0,0,m_bk_first_width,m_bk_first_height),SRCCOPY);
  83. if(hDIBBK2)
  84. { SetScrollSizes(MM_TEXT,CSize(m_bk_first_width*2+20,m_bk_first_height*2+10));
  85. //SetScrollSizes(MM_TEXT,CSize(m_bk_first_width*2+20,m_bk_first_height));
  86. cDib.PaintDIBTrue(pDC->GetSafeHdc(),CRect(m_bk_first_width+5,0,m_bk_first_width*2+5,m_bk_first_height),
  87. hDIBBK2,CRect(0,0,m_bk_first_width,m_bk_first_height),SRCCOPY);
  88. }
  89. if(hDIBCurrent)
  90. {
  91. cDib.PaintDIBTrue(pDC->GetSafeHdc(),CRect(m_bk_first_width+5,m_bk_first_height+5,m_bk_first_width*2+5,m_bk_first_height*2+5),
  92. hDIBCurrent,CRect(0,0,m_bk_first_width,m_bk_first_height),SRCCOPY);
  93. SetScrollSizes(MM_TEXT,CSize(m_bk_first_width*2+20,m_bk_first_height*2+10));
  94. }
  95. if(this->isTeZhengZhi)
  96. cDib.PaintDIBTrue(pDC->GetSafeHdc(),CRect(0,m_bk_first_height+10,RADIUS*2+1,m_bk_first_height+10+RADIUS*2+1),
  97. hDIBBK1,CRect(ImportantPoint.x-RADIUS,m_bk_first_height -ImportantPoint.y-RADIUS,ImportantPoint.x+RADIUS,m_bk_first_height -ImportantPoint.y +RADIUS),SRCCOPY);
  98. }
  99. void CYdpdView::OnInitialUpdate()
  100. {
  101. CScrollView::OnInitialUpdate();
  102. CSize sizeTotal;
  103. // TODO: calculate the total size of this view
  104. sizeTotal.cx = sizeTotal.cy = 100;
  105. SetScrollSizes(MM_TEXT, sizeTotal);
  106. }
  107. /////////////////////////////////////////////////////////////////////////////
  108. // CYdpdView printing
  109. BOOL CYdpdView::OnPreparePrinting(CPrintInfo* pInfo)
  110. {
  111. // default preparation
  112. return DoPreparePrinting(pInfo);
  113. }
  114. void CYdpdView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  115. {
  116. // TODO: add extra initialization before printing
  117. }
  118. void CYdpdView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  119. {
  120. // TODO: add cleanup after printing
  121. }
  122. /////////////////////////////////////////////////////////////////////////////
  123. // CYdpdView diagnostics
  124. #ifdef _DEBUG
  125. void CYdpdView::AssertValid() const
  126. {
  127. CScrollView::AssertValid();
  128. }
  129. void CYdpdView::Dump(CDumpContext& dc) const
  130. {
  131. CScrollView::Dump(dc);
  132. }
  133. CYdpdDoc* CYdpdView::GetDocument() // non-debug version is inline
  134. {
  135. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CYdpdDoc)));
  136. return (CYdpdDoc*)m_pDocument;
  137. }
  138. #endif //_DEBUG
  139. /////////////////////////////////////////////////////////////////////////////
  140. // CYdpdView message handlers
  141. void CYdpdView::OnMenuBkFirst() 
  142. {
  143. CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,NULL,NULL);
  144. if(dlg.DoModal() == IDOK)
  145. {
  146. CString a;
  147. a = dlg.GetPathName();
  148. hDIBBK1 = cDib.LoadDIB(a);
  149. if(!hDIBBK1)
  150. {
  151. AfxMessageBox("open file error");
  152. return;
  153. }
  154. LPBITMAPINFOHEADER lpbi;
  155. lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDIBBK1);
  156. this->m_bk_first_width = lpbi->biWidth;
  157. this->m_bk_first_height = lpbi->biHeight;
  158. GlobalUnlock(hDIBBK1);
  159. Invalidate();
  160. }
  161. }
  162. void CYdpdView::OnMenuBkSecond() 
  163. {
  164. CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,NULL,NULL);
  165. if(dlg.DoModal() == IDOK)
  166. {
  167. hDIBBK2 = cDib.LoadDIB(dlg.GetPathName());
  168. if(!hDIBBK2)
  169. {
  170. AfxMessageBox("open file error");
  171. return;
  172. }
  173. Invalidate();
  174. }
  175. }
  176. void CYdpdView::OnMenuBkGray() 
  177. {
  178. hDIBBKGray = cDib.ToGray(hDIBBK1);
  179. Invalidate();
  180. }
  181. void CYdpdView::OnMenuGradient() 
  182. {
  183. hDIBBKGradient = cDib.Gradient(hDIBBKGray);
  184. Invalidate();
  185. }
  186. void CYdpdView::OnMenuPipeizhongxin() 
  187. {
  188. cDib.LocateImporntPoint(hDIBBKGradient,RADIUS,&ImportantPoint);
  189. Invalidate();
  190. }
  191. void CYdpdView::OnMenuTezhengquyu() 
  192. {
  193. long  lOffset;
  194. WORD wBytesPerLine;
  195. LPBYTE lpData;
  196. GlobalLock(hDIBBK1);
  197. wBytesPerLine = cDib.BytePerLine(hDIBBK1);
  198. lpData = cDib.FindDIBBits(hDIBBK1);
  199. for(int i=-RADIUS;i<=RADIUS;i++)
  200. for(int j=-RADIUS;j<=RADIUS;j++)
  201. {
  202. lOffset = cDib.PixelOffset(i+ImportantPoint.y,j+ImportantPoint.x,wBytesPerLine);
  203. ImportantColorInfo[i+RADIUS][j+RADIUS][0] = *(lpData+lOffset++);
  204. ImportantColorInfo[i+RADIUS][j+RADIUS][1] = *(lpData+lOffset++);
  205. ImportantColorInfo[i+RADIUS][j+RADIUS][2] = *(lpData+lOffset++);
  206. }
  207. this->isTeZhengZhi = true;
  208. GlobalUnlock(hDIBBK1);
  209. Invalidate();
  210. }
  211. void CYdpdView::OnMenuPipei() 
  212. {
  213. cDib.MatchImportantPoint(hDIBBK2,ImportantColorInfo,&ImportantPoint2);
  214. if(cDib.ComPareImg(hDIBBK1,hDIBBK2,ImportantPoint,ImportantPoint2))
  215. {
  216. AfxMessageBox("match successed");
  217. this->isBKChonsen = true;
  218. }
  219. else
  220. AfxMessageBox("match failed");
  221. Invalidate();
  222. }
  223. void CYdpdView::OnMedifilter() 
  224. {
  225. if(hDIBBK1)
  226. cDib.MedianFilterDIB(hDIBBK1);
  227. if(hDIBBK2)
  228. cDib.MedianFilterDIB(hDIBBK2);
  229. Invalidate();
  230. }
  231. void CYdpdView::OnMENUFILElOAD() 
  232. {
  233. CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,NULL,NULL);
  234. if(dlg.DoModal() == IDOK)
  235. {
  236. CString a;
  237. a = dlg.GetPathName();
  238. hDIBCurrent = cDib.LoadDIB(a);
  239. if(!hDIBCurrent)
  240. {
  241. AfxMessageBox("open file error");
  242. return;
  243. }
  244. }
  245. }
  246. void CYdpdView::OnMenuYdpdPipei() 
  247. {
  248. bool kk = cDib.MatchImportantPoint(hDIBCurrent,ImportantColorInfo,&ImportantPoint2);
  249. if(cDib.ComPareImg(hDIBBK1,hDIBCurrent,ImportantPoint,ImportantPoint2))
  250. {
  251. AfxMessageBox("match successed");
  252. this->isBKChonsen = true;
  253. }
  254. else
  255. AfxMessageBox("match failed");
  256. Invalidate();
  257. }
  258. void CYdpdView::OnMenuYdpdMedi() 
  259. {
  260. if(hDIBCurrent)
  261. {
  262. cDib.MedianFilterDIB(hDIBCurrent);
  263. Invalidate();
  264. }
  265. }
  266. void CYdpdView::OnMenuYdpdLktq() 
  267. {
  268. cDib.CompareImg2(hDIBBK1,hDIBCurrent,ImportantPoint,ImportantPoint2);
  269. LPBITMAPFILEHEADER lpbi;
  270. lpbi = (LPBITMAPFILEHEADER)GlobalLock(hDIBCurrent);
  271. LPBYTE lpData = cDib.FindDIBBits(hDIBCurrent);
  272. long lOffset;
  273. WORD wBytesPerLine = cDib.BytePerLine(hDIBCurrent);
  274. for(int i= -RADIUS;i<=RADIUS;i++)
  275. {
  276. lOffset = cDib.PixelOffset(i+ImportantPoint2.y,RADIUS+ImportantPoint2.x,wBytesPerLine);
  277. *(lpData+lOffset++) = 0;
  278. *(lpData+lOffset++) = 0;
  279. *(lpData+lOffset++) = 0;
  280. }
  281. for( i= -RADIUS;i<=RADIUS;i++)
  282. {
  283. lOffset = cDib.PixelOffset(i+ImportantPoint2.y,ImportantPoint2.x-RADIUS,wBytesPerLine);
  284. *(lpData+lOffset++) = 0;
  285. *(lpData+lOffset++) = 0;
  286. *(lpData+lOffset++) = 0;
  287. }
  288. for( i= -RADIUS;i<=RADIUS;i++)
  289. {
  290. lOffset = cDib.PixelOffset(ImportantPoint2.y-RADIUS,i+ImportantPoint2.x,wBytesPerLine);
  291. *(lpData+lOffset++) = 0;
  292. *(lpData+lOffset++) = 0;
  293. *(lpData+lOffset++) = 0;
  294. }
  295. for( i= -RADIUS;i<=RADIUS;i++)
  296. {
  297. lOffset = cDib.PixelOffset(RADIUS+ImportantPoint2.y,i+ImportantPoint2.x,wBytesPerLine);
  298. *(lpData+lOffset++) = 0;
  299. *(lpData+lOffset++) = 0;
  300. *(lpData+lOffset++) = 0;
  301. }
  302. GlobalUnlock(hDIBCurrent);
  303. Invalidate();
  304. }
  305. //实现图片特征区域的再次匹配
  306. void CYdpdView::OnSecondPipei() 
  307. {
  308. LPBITMAPINFOHEADER lpbi;
  309. LPBYTE lpData;
  310. WORD wBytesPerLine;
  311. int height1,width1,height2,width2;
  312. lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDIBBK1);
  313. //下面的一段代码设定第二个特征区域的查找范围
  314. //第一个特征区域的纵坐标大于原图高度的一半
  315. if(lpbi->biHeight/2 < ImportantPoint.y)
  316. {
  317.     //设定考察的两个纵坐标位置
  318. height2 = lpbi->biHeight/2;
  319. height1 = 0;
  320. }
  321. else//第一个特征区域的坐标小于等于原图高度的一半
  322. {   //设定纵坐标位置
  323. height2 = lpbi->biHeight;
  324. height1 = lpbi->biHeight/2;
  325. }
  326. //如果第一个特征区域的横坐标大于原来图片的一半
  327. if(lpbi->biWidth/2 < ImportantPoint.x)
  328. {  //设定考察区域横坐标的两个值
  329. width1 = 0;
  330. width2 = lpbi->biWidth/2;
  331. }
  332. else //第一个特征区域的横坐标小于等于原来图片的一半
  333. {  //设定考察区域的横坐标的两个值
  334. width1 = lpbi->biWidth/2;
  335. width2 = lpbi->biWidth;
  336. }
  337. lpData = cDib.FindDIBBits(hDIBBK1);
  338. //得到每行象素的字节数
  339. wBytesPerLine = cDib.BytePerLine(hDIBBK1);
  340. int tempsum=0,sum=0;
  341. long lOffset;
  342. //在设定的区域内部查找第二个特征区域
  343. for(int i=height1+RADIUS;i<height2-RADIUS;i++)
  344. for(int j=width2+ RADIUS;j<width2-RADIUS;j++)
  345. { tempsum =0;
  346.    //考察以RADIUS82+1为边长的正方形区域
  347. for(int k1=-RADIUS;k1<=RADIUS;k1++)
  348. for(int k2 =-RADIUS;k2<=RADIUS;k2++)
  349. {   
  350. //得到数据偏移
  351. lOffset = cDib.PixelOffset(i+k1,j+k2,wBytesPerLine);
  352. //得到颜色值
  353. int color = *(lpData+lOffset);
  354. //增加当前tempsum的值
  355. tempsum +=color;
  356. }
  357. if(tempsum>sum)//当前区域特征更明显
  358. {
  359. sum = tempsum;
  360. //设定区域中心点坐标
  361. ImportantPointSecond.x = j;
  362. ImportantPointSecond.y = i;
  363. }
  364. }
  365. GlobalUnlock(hDIBBK1);
  366.    //按照新找到的特征区域,再次匹配中心点
  367. bool kk = cDib.MatchImportantPoint(hDIBCurrent,ImportantColorInfo,&ImportantPoint2);
  368. //比较图片的相似度
  369. if(cDib.ComPareImg(hDIBBK1,hDIBCurrent,ImportantPoint,ImportantPoint2))
  370. AfxMessageBox("match successed");
  371. else
  372. AfxMessageBox("match failed");
  373. Invalidate();
  374. }