ddView.cpp
上传用户:wjfckcom
上传日期:2014-06-28
资源大小:1989k
文件大小:13k
源码类别:

OpenCV

开发平台:

Visual C++

  1. // ddView.cpp : implementation of the CDdView class
  2. //
  3. #include "stdafx.h"
  4. #include "dd.h"
  5. #include "ddDoc.h"
  6. #include "ddView.h"
  7. #include "HistogramDlg.h"
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. /////////////////////////////////////////////////////////////////////////////
  14. // CDdView
  15. IMPLEMENT_DYNCREATE(CDdView, CView)
  16. BEGIN_MESSAGE_MAP(CDdView, CView)
  17. //{{AFX_MSG_MAP(CDdView)
  18. ON_COMMAND(ID_HISTOGRAM, OnHistogram)
  19. ON_COMMAND(ID_IMG, OnImg)
  20. ON_COMMAND(ID_MATCHCONTOUR, OnMatchcontour)
  21. //}}AFX_MSG_MAP
  22. // Standard printing commands
  23. ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
  24. ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
  25. ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
  26. END_MESSAGE_MAP()
  27. /////////////////////////////////////////////////////////////////////////////
  28. // CDdView construction/destruction
  29. CDdView::CDdView()
  30. {
  31. // TODO: add construction code here
  32. }
  33. CDdView::~CDdView()
  34. {
  35. }
  36. BOOL CDdView::PreCreateWindow(CREATESTRUCT& cs)
  37. {
  38. // TODO: Modify the Window class or styles here by modifying
  39. //  the CREATESTRUCT cs
  40. return CView::PreCreateWindow(cs);
  41. }
  42. /////////////////////////////////////////////////////////////////////////////
  43. // CDdView drawing
  44. void CDdView::OnDraw(CDC* pDC)
  45. {
  46. CDdDoc* pDoc = GetDocument();
  47. ASSERT_VALID(pDoc);
  48. // TODO: add draw code for native data here
  49. pDoc->myimage.CopyOf(pDoc->pSrcImg,1);
  50. CRect rect;
  51. GetClientRect(rect);
  52. rect.bottom = pDoc->myimage.Height();
  53. rect.right = pDoc->myimage.Width();
  54. pDoc->myimage.DrawToHDC(pDC->m_hDC , rect);
  55. }
  56. /////////////////////////////////////////////////////////////////////////////
  57. // CDdView printing
  58. BOOL CDdView::OnPreparePrinting(CPrintInfo* pInfo)
  59. {
  60. // default preparation
  61. return DoPreparePrinting(pInfo);
  62. }
  63. void CDdView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  64. {
  65. // TODO: add extra initialization before printing
  66. }
  67. void CDdView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  68. {
  69. // TODO: add cleanup after printing
  70. }
  71. /////////////////////////////////////////////////////////////////////////////
  72. // CDdView diagnostics
  73. #ifdef _DEBUG
  74. void CDdView::AssertValid() const
  75. {
  76. CView::AssertValid();
  77. }
  78. void CDdView::Dump(CDumpContext& dc) const
  79. {
  80. CView::Dump(dc);
  81. }
  82. CDdDoc* CDdView::GetDocument() // non-debug version is inline
  83. {
  84. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDdDoc)));
  85. return (CDdDoc*)m_pDocument;
  86. }
  87. #endif //_DEBUG
  88. /////////////////////////////////////////////////////////////////////////////
  89. // CDdView message handlers
  90. void CDdView::OnHistogram() 
  91. {
  92. int i,j;
  93. int width = GetDocument()->width;
  94. int height = GetDocument()->height;
  95. CvMemStorage * storage = cvCreateMemStorage(0);
  96. CvSeq * contour = 0;
  97. IplImage* pImage = cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,1);
  98. pContourImg1 = cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,3);
  99. Image = cvCreateImage(cvSize(width,height),8,1);
  100. IplImage* img = cvCreateImage(cvSize(width,height),8,3);
  101. cvCopy(GetDocument()->pSrcImg,img);
  102. cvCvtColor(GetDocument()->pSrcImg, Image, CV_RGB2GRAY);
  103. cvThreshold(Image,pImage,150, 255,CV_THRESH_BINARY_INV);
  104. cvSmooth(pImage, Image, CV_MEDIAN);
  105. cvCvtColor(Image, pContourImg1, CV_GRAY2BGR);
  106. cvFindContours( Image, storage, &contour, sizeof(CvContour), 
  107. CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
  108. cvDrawContours(pContourImg1, contour, CV_RGB(255,0,255),
  109. CV_RGB(255, 0, 0), 1, 1, 8);
  110. n1 = contour->total; 
  111. CvPoint *PointArray=new CvPoint[n1]; 
  112. cvCvtSeqToArray( contour, PointArray, CV_WHOLE_SEQ );//提取点集
  113. seq1 = new struct contourrate[n1];
  114. double* r = (double*)calloc(n1,sizeof(double));
  115. double sum = 0.0;
  116. for(i = 0; i<n1;i++)
  117. {
  118. int x0 =PointArray[i].x;
  119. int y0 =PointArray[i].y;
  120. int x1 =PointArray[(i-5+n1)%n1].x;
  121. int y1 =PointArray[(i-5+n1)%n1].y;
  122. int x2 =PointArray[(i+5+n1)%n1].x;
  123. int y2 =PointArray[(i+5+n1)%n1].y;
  124. if(((uchar*)(pImage->imageData + pImage->widthStep*(y1/2+y2/2)))[x1/2+x2/2]==0)
  125. r[i] = 0 - (double)abs((y2-y1)*(x0-x1)+(x2-x1)*(y1-y0))/(double)((y2-y1)*(y2-y1)+(x2-x1)*(x2-x1));
  126. else
  127. r[i] = (double)abs((y2-y1)*(x0-x1)+(x2-x1)*(y1-y0))/(double)((y2-y1)*(y2-y1)+(x2-x1)*(x2-x1));
  128. sum += r[i];
  129. }
  130. for(i =0; i<n1; i++)
  131. {
  132. seq1[i].p.x = PointArray[i].x;
  133. seq1[i].p.y = PointArray[i].y;
  134. seq1[i].q = (float) (r[i]/sum) ;
  135. }
  136. /* int gray[256]={0} ;
  137. for(i = 0;i < height;i++)
  138. for(j=0; j< width; j++)
  139. {
  140. int n =((uchar*)(Image->imageData + Image->widthStep*i))[j];
  141. gray[n]++;
  142. }
  143. for(i=0; i<256; i++)
  144. tongji[i] = gray[i]/(width*height/1.0f);*/
  145. CHistogramDlg* dlg;
  146. dlg = new CHistogramDlg(this);
  147. dlg->Create(IDD_HISTOGRAMDLG);
  148. for(i=0; i<n1; i++)
  149. dlg->m_fIntensity[i*256/n1+1] = seq1[i].q;
  150. dlg->ShowWindow(SW_RESTORE);
  151. cvCopy(pContourImg1, GetDocument()->pSrcImg);
  152. Invalidate();
  153. free(r);
  154. cvReleaseImage(&pImage);
  155. cvReleaseImage(&img);
  156. }
  157. void CDdView::OnImg() 
  158. {
  159. CFileDialog filedlg(TRUE, NULL, NULL, OFN_HIDEREADONLY,
  160. "所有文件   (*.*)|*.*||BMP Files(*.BMP)|*.BMP|JPEG Files(*.JPG)|*.JPG|");
  161. if(filedlg.DoModal()!=IDOK)
  162. {
  163. }
  164. CString filename = filedlg.GetPathName();
  165. IplImage* img = cvLoadImage(filename,0);
  166. int i,j;
  167. int width = img->width;
  168. int height = img->height;
  169. CvMemStorage * storage = cvCreateMemStorage(0);
  170. CvSeq * contour = 0;
  171. pContourImg2 = cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,3);
  172. IplImage* pImage = cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,1);
  173. cvThreshold(img,pImage,150, 255,CV_THRESH_BINARY_INV);
  174. cvSmooth(pImage, img, CV_MEDIAN);
  175. cvCvtColor(img, pContourImg2, CV_GRAY2BGR);
  176. cvFindContours( img, storage, &contour, sizeof(CvContour), 
  177. CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
  178. cvDrawContours(pContourImg2, contour, CV_RGB(255,0,255),
  179. CV_RGB(255, 0, 0), 1, 1, 8);
  180. n2 = contour->total; 
  181. CvPoint *PointArray=new CvPoint[n2]; 
  182. cvCvtSeqToArray( contour, PointArray, CV_WHOLE_SEQ );//提取点集
  183. seq2 = new struct contourrate [n2];
  184. double* r = (double*)calloc(n2,sizeof(double));
  185. double sum = 0.0;
  186. for(i = 0; i<n2;i++)
  187. {
  188. int x0 =PointArray[i].x;
  189. int y0 =PointArray[i].y;
  190. int x1 =PointArray[(i-5+n2)%n2].x;
  191. int y1 =PointArray[(i-5+n2)%n2].y;
  192. int x2 =PointArray[(i+5+n2)%n2].x;
  193. int y2 =PointArray[(i+5+n2)%n2].y;
  194. if(((uchar*)(pImage->imageData + pImage->widthStep*(y1/2+y2/2)))[x1/2+x2/2]==0)
  195. r[i] = 0 - (double)abs((y2-y1)*(x0-x1)+(x2-x1)*(y1-y0))/(double)((y2-y1)*(y2-y1)+(x2-x1)*(x2-x1));
  196. else
  197. r[i] = (double)abs((y2-y1)*(x0-x1)+(x2-x1)*(y1-y0))/(double)((y2-y1)*(y2-y1)+(x2-x1)*(x2-x1));
  198. sum += r[i];
  199. }
  200. for(i =0; i<n2; i++)
  201. {
  202. seq2[i].p.x = PointArray[i].x;
  203. seq2[i].p.y = PointArray[i].y;
  204. seq2[i].q =(float) (r[i]/sum);
  205. }
  206. CHistogramDlg* dlg;
  207. dlg = new CHistogramDlg(this);
  208. dlg->Create(IDD_HISTOGRAMDLG);
  209. for(i=0; i<n2; i++)
  210. dlg->m_fIntensity[i*256/n2+1] = seq2[i].q;
  211. dlg->ShowWindow(SW_RESTORE);
  212. cvNamedWindow("src", CV_WINDOW_AUTOSIZE);
  213. cvShowImage("src",pContourImg2);
  214. free(r);
  215. cvReleaseImage(&pImage);
  216. cvReleaseImage(&img);
  217. }
  218. void CDdView::OnMatchcontour() 
  219. {
  220. //t1 ...t4 alloc
  221. t1 = new struct rateseq[n1/5];
  222. t2 = new struct rateseq[n1/5];
  223. t3 = new struct rateseq[n2/5];
  224. t4 = new struct rateseq[n2/5];
  225. int i, j;
  226. int m1, m2, m3,m4;
  227. m1 = m2 = m3 = m4 = 0;
  228. for(i=1; i<n1-1; i++)
  229. {
  230. if(seq1[i].q>seq1[i-1].q&&seq1[i].q>seq1[i+1].q&&seq1[i].q>0)
  231. {
  232. t1[m1].q=seq1[i].q;
  233. t1[m1].index = i;
  234. m1++;
  235. continue;
  236. }
  237. else if(seq1[i].q<seq1[i-1].q&&seq1[i].q<seq1[i+1].q&&seq1[i].q<0)
  238. {
  239. t2[m2].q=seq1[i].q;
  240. t2[m2].index = i;
  241. m2++;
  242. continue;
  243. }
  244. continue;
  245. }
  246. for(i=1; i<n2-1; i++)
  247. {
  248. if(seq2[i].q>seq2[i-1].q&&seq2[i].q>seq2[i+1].q&&seq2[i].q>0)
  249. {
  250. t3[m3].q=seq2[i].q;
  251. t3[m3].index=i;
  252. m3++;
  253. continue;
  254. }
  255. else if(seq2[i].q<seq2[i-1].q&&seq2[i].q<seq2[i+1].q&&seq2[i].q<0)
  256. {
  257. t4[m4].q=seq2[i].q;
  258. t4[m4].index = i;
  259. m4++;
  260. continue;
  261. }
  262. continue;
  263. }
  264. /* IplImage* resultimg = cvCreateImage(cvSize(Image->width,Image->height),8,3);
  265. cvCvtColor(Image,resultimg,CV_GRAY2BGR); */
  266. IplImage* resultimg = stack_imgs(pContourImg1, pContourImg2);
  267. for(i=0; i<m1-1; i++)
  268. for(j=0; j<m3-1; j++)
  269. {
  270. if(fabs(t1[i].q-t3[j].q)<0.05*(t1[i].q+t3[j].q))
  271. {
  272. float hausv1 = Hausdorff(t1[i],t3[j], seq1 ,seq2);
  273. if (hausv1<THREHOLD)
  274. {
  275. /* int z = 0;
  276. if (t1[i].index<10)
  277. {
  278. for(int k=0; k<t1[i].index+10; k++)
  279. {
  280. ((uchar*)(resultimg->imageData + resultimg->widthStep*(seq1[k].p.y)))[(seq1[k].p.x)*3] = 0;
  281. ((uchar*)(resultimg->imageData + resultimg->widthStep*(seq1[k].p.y)))[(seq1[k].p.x)*3+1] = 125;
  282. ((uchar*)(resultimg->imageData + resultimg->widthStep*(seq1[k].p.y)))[(seq1[k].p.x)*3+2] = z;
  283. }
  284. z+=30;
  285. }
  286. else if (t1[i].index>n1-10)
  287. {
  288. for(int k=t1[i].index-10; k<n1-10; k++)
  289. {
  290. ((uchar*)(resultimg->imageData + resultimg->widthStep*(seq1[k].p.y)))[(seq1[k].p.x)*3] = z;
  291. ((uchar*)(resultimg->imageData + resultimg->widthStep*(seq1[k].p.y)))[(seq1[k].p.x)*3+1] = 125;
  292. ((uchar*)(resultimg->imageData + resultimg->widthStep*(seq1[k].p.y)))[(seq1[k].p.x)*3+2] = 0;
  293. }
  294. z+=30;
  295. }
  296. else
  297. {
  298. for(int k=t1[i].index-10; k<t1[i].index+10; k++)
  299. {
  300. ((uchar*)(resultimg->imageData + resultimg->widthStep*(seq1[k].p.y)))[(seq1[k].p.x)*3] = z;
  301. ((uchar*)(resultimg->imageData + resultimg->widthStep*(seq1[k].p.y)))[(seq1[k].p.x)*3+1] = 125;
  302. ((uchar*)(resultimg->imageData + resultimg->widthStep*(seq1[k].p.y)))[(seq1[k].p.x)*3+2] = z;
  303. }
  304. z+=30;
  305. }*/
  306. /*int m,n;
  307. for(m=0; m<10&&t1[i].index-m>0&&t3[j].index-m>0;m++)
  308. {
  309. CvPoint pt1 = seq1[(t1[i].index-m)].p;
  310. CvPoint pt2 = seq2[(t3[j].index-m)].p;
  311. pt2.y+=pContourImg1->height;
  312. cvLine( resultimg, pt1, pt2, CV_RGB(255,0,i*50%255), 1, 8, 0 );
  313. }
  314. for(n=1; n<10&&t1[i].index+n<n1&&t3[j].index+n<n2;n++)
  315. {
  316. CvPoint pt1 = seq1[t1[i].index+n].p;
  317. CvPoint pt2 = seq2[t3[j].index+n].p;
  318. pt2.y+=pContourImg1->height;
  319. cvLine( resultimg, pt1, pt2, CV_RGB(255,i*50%255,255), 1, 8, 0 );
  320. }*/
  321. CvPoint pt1 = seq1[t1[i].index].p;
  322. CvPoint pt2 = seq2[t3[j].index].p;
  323. pt2.y+=pContourImg1->height;
  324. cvLine( resultimg, pt1, pt2, CV_RGB(255,i*50%255,255), 1, 8, 0 );
  325. }
  326. }
  327. continue;
  328. }
  329. for(i=0; i<m2; i++)
  330. for(j=0; j<m4; j++)
  331. {
  332. if (fabs(t2[i].q-t4[j].q)<0.05*abs(t2[i].q+t4[j].q))
  333. {
  334. float hausv2 = Hausdorff(t2[i], t4[j], seq1, seq2);
  335. if (hausv2<THREHOLD)
  336. {
  337. /* if (t2[i].index<10)
  338. {
  339. for(int k=0; k<t2[i].index+10; k++)
  340. {
  341. ((uchar*)(resultimg->imageData + resultimg->widthStep*(seq1[k].p.y)))[(seq1[k].p.x)*3] = 255;
  342. ((uchar*)(resultimg->imageData + resultimg->widthStep*(seq1[k].p.y)))[(seq1[k].p.x)*3+1] = 255;
  343. ((uchar*)(resultimg->imageData + resultimg->widthStep*(seq1[k].p.y)))[(seq1[k].p.x)*3+2] = 0;
  344. }
  345. }
  346. else if (t2[i].index>n1-10)
  347. {
  348. for(int k=t2[i].index-10; k<n1-10; k++)
  349. {
  350. ((uchar*)(resultimg->imageData + resultimg->widthStep*(seq1[k].p.y)))[(seq1[k].p.x)*3] = 255;
  351. ((uchar*)(resultimg->imageData + resultimg->widthStep*(seq1[k].p.y)))[(seq1[k].p.x)*3+1] =255;
  352. ((uchar*)(resultimg->imageData + resultimg->widthStep*(seq1[k].p.y)))[(seq1[k].p.x)*3+2] = 0;
  353. }
  354. }
  355. else
  356. {
  357. for(int k=t2[i].index-10; k<t2[i].index+10; k++)
  358. {
  359. ((uchar*)(resultimg->imageData + resultimg->widthStep*(seq1[k].p.y)))[(seq1[k].p.x)*3] = 255;
  360. ((uchar*)(resultimg->imageData + resultimg->widthStep*(seq1[k].p.y)))[(seq1[k].p.x)*3+1] = 255;
  361. ((uchar*)(resultimg->imageData + resultimg->widthStep*(seq1[k].p.y)))[(seq1[k].p.x)*3+2] = 0;
  362. }
  363. }*/
  364. /*int m,n;
  365. for(m=0; m<10&&t2[i].index-m>0&&t4[j].index-m>0;m++)
  366. {
  367. CvPoint pt1 = seq1[t2[i].index-m].p;
  368. CvPoint pt2 = seq2[t4[j].index-m].p;
  369. pt2.y+=pContourImg1->height;
  370. cvLine( resultimg, pt1, pt2, CV_RGB(i*50%255,0,255), 1, 8, 0 );
  371. }
  372. for(n=1; n<10&&t2[i].index+n<n1&&t4[j].index+n<n2;n++)
  373. {
  374. CvPoint pt1 = seq1[(t2[i].index+n)].p;
  375. CvPoint pt2 = seq2[t4[j].index+n].p;
  376. pt2.y+=pContourImg1->height;
  377. cvLine( resultimg, pt1, pt2, CV_RGB(255,i*50%255,i*50%255), 1, 8, 0 );
  378. }*/
  379. CvPoint pt1 = seq1[t2[i].index].p;
  380. CvPoint pt2 = seq2[t4[j].index].p;
  381. pt2.y+=pContourImg1->height;
  382. cvLine( resultimg, pt1, pt2, CV_RGB(255,i*50%255,0), 1, 8, 0 );
  383. }
  384. }
  385. continue;
  386. }
  387. cvNamedWindow("matchresult",CV_WINDOW_AUTOSIZE);
  388. cvShowImage("matchresult",resultimg);
  389. delete [] t1;
  390. delete [] t2;
  391. delete [] t3;
  392. delete [] t4;
  393. delete [] seq1;
  394. delete [] seq2;
  395. cvReleaseImage(&Image);
  396. cvReleaseImage(&pContourImg2);
  397. cvReleaseImage(&pContourImg1);
  398. cvReleaseImage(&resultimg);
  399. }