demoDlg.cpp
上传用户:gzysjn
上传日期:2013-07-12
资源大小:225k
文件大小:10k
源码类别:

2D图形编程

开发平台:

Visual C++

  1. // demoDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "demo.h"
  5. #include "demoDlg.h"
  6. //#include "cvaux.h"
  7. #include "cv.h"      // include core library interface
  8. #include "highgui.h" // include GUI library interface
  9. #ifdef _DEBUG
  10. #define new DEBUG_NEW
  11. #undef THIS_FILE
  12. static char THIS_FILE[] = __FILE__;
  13. #endif
  14. ////////////////////////////////////////////
  15. IplImage *image = 0, *hsv = 0, *hue = 0, *mask = 0, *backproject = 0, *histimg = 0;
  16. CvHistogram *hist = 0;
  17. int backproject_mode = 0;
  18. int select_object = 0;
  19. int track_object = 0;
  20. int show_hist = 1;
  21. CvPoint origin;
  22. CvRect selection;
  23. CvRect track_window;
  24. CvBox2D track_box;
  25. CvConnectedComp track_comp;
  26. int hdims = 16;
  27. float hranges_arr[] = {0,180};
  28. float* hranges = hranges_arr;
  29. int vmin = 10, vmax = 256, smin = 30;
  30. void on_mouse(int event, int x, int y, int flags, void *param);
  31. /////////////////////////////////////////////////////////////////////////////
  32. // CDemoDlg dialog
  33. CDemoDlg::CDemoDlg(CWnd* pParent /*=NULL*/)
  34. : CDialog(CDemoDlg::IDD, pParent)
  35. {
  36. //{{AFX_DATA_INIT(CDemoDlg)
  37. // NOTE: the ClassWizard will add member initialization here
  38. //}}AFX_DATA_INIT
  39. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  40. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  41. }
  42. void CDemoDlg::DoDataExchange(CDataExchange* pDX)
  43. {
  44. CDialog::DoDataExchange(pDX);
  45. //{{AFX_DATA_MAP(CDemoDlg)
  46. // NOTE: the ClassWizard will add DDX and DDV calls here
  47. //}}AFX_DATA_MAP
  48. }
  49. BEGIN_MESSAGE_MAP(CDemoDlg, CDialog)
  50. //{{AFX_MSG_MAP(CDemoDlg)
  51. ON_WM_PAINT()
  52. ON_WM_QUERYDRAGICON()
  53. ON_BN_CLICKED(IDC_BUTTON1, OnButtonEdge)
  54. //}}AFX_MSG_MAP
  55. END_MESSAGE_MAP()
  56. /////////////////////////////////////////////////////////////////////////////
  57. // CDemoDlg message handlers
  58. BOOL CDemoDlg::OnInitDialog()
  59. {
  60. CDialog::OnInitDialog();
  61. // Set the icon for this dialog.  The framework does this automatically
  62. //  when the application's main window is not a dialog
  63. SetIcon(m_hIcon, TRUE); // Set big icon
  64. SetIcon(m_hIcon, FALSE); // Set small icon
  65. // TODO: Add extra initialization here
  66. return TRUE;  // return TRUE  unless you set the focus to a control
  67. }
  68. // If you add a minimize button to your dialog, you will need the code below
  69. //  to draw the icon.  For MFC applications using the document/view model,
  70. //  this is automatically done for you by the framework.
  71. void CDemoDlg::OnPaint() 
  72. {
  73. if (IsIconic())
  74. {
  75. CPaintDC dc(this); // device context for painting
  76. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  77. // Center icon in client rectangle
  78. int cxIcon = GetSystemMetrics(SM_CXICON);
  79. int cyIcon = GetSystemMetrics(SM_CYICON);
  80. CRect rect;
  81. GetClientRect(&rect);
  82. int x = (rect.Width() - cxIcon + 1) / 2;
  83. int y = (rect.Height() - cyIcon + 1) / 2;
  84. // Draw the icon
  85. dc.DrawIcon(x, y, m_hIcon);
  86. }
  87. else
  88. {
  89. CDialog::OnPaint();
  90. }
  91. }
  92. // The system calls this to obtain the cursor to display while the user drags
  93. //  the minimized window.
  94. HCURSOR CDemoDlg::OnQueryDragIcon()
  95. {
  96. return (HCURSOR) m_hIcon;
  97. }
  98. void CDemoDlg::OnOK() 
  99. {
  100. // TODO: Add extra validation here
  101. CDialog::OnOK();
  102. }
  103. void CDemoDlg::OnButtonEdge() 
  104. {
  105. CFileDialog dlg(TRUE, _T("*.avi"), "",                    
  106.  OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST|OFN_HIDEREADONLY,
  107. "AVI files (*.avi) |*.avi|All Files (*.*)|*.*||",NULL);
  108.    CString strFileName;
  109.    char title[]= {"打开视频文件"};
  110.    dlg.m_ofn.lpstrTitle= title;
  111.    if (dlg.DoModal() == IDOK) {
  112.     strFileName= dlg.GetPathName();
  113.    }
  114.    IplImage*       tmp_frame = NULL;
  115.     CvCapture*      capture = NULL;
  116.   
  117.     capture= cvCaptureFromFile(strFileName);
  118.     tmp_frame = cvQueryFrame(capture);
  119.     if(!tmp_frame)
  120.     {
  121.         printf("bad video n");
  122.         exit(0);
  123.     }
  124.     cvNamedWindow( "Histogram", 1 );
  125.     cvNamedWindow( "MeanShiftDemo", 1 );
  126.    cvSetMouseCallback( "MeanShiftDemo",on_mouse, 0 );
  127.     //cvCreateTrackbar( "Vmin", "MeanShiftDemo", &vmin, 256, 0 );
  128.    // cvCreateTrackbar( "Vmax", "MeanShiftDemo", &vmax, 256, 0 );
  129.    // cvCreateTrackbar( "Smin", "MeanShiftDemo", &smin, 256, 0 );
  130. bool bBackProject=true;
  131. CvConnectedComp comp; 
  132.     for(;;)
  133.     {
  134.         IplImage* frame = 0;
  135.         int i, bin_w, c;
  136.         frame = cvQueryFrame( capture );
  137.         if( !frame )
  138.             break;
  139.         if( !image )
  140.         {
  141.             /* allocate all the buffers */
  142.             image = cvCreateImage( cvGetSize(frame), 8, 3 );
  143.             image->origin = frame->origin;
  144.             hsv = cvCreateImage( cvGetSize(frame), 8, 3 );
  145.             hue = cvCreateImage( cvGetSize(frame), 8, 1 );
  146.             mask = cvCreateImage( cvGetSize(frame), 8, 1 );
  147.             backproject = cvCreateImage( cvGetSize(frame), 8, 1 );
  148.             hist = cvCreateHist( 1, &hdims, CV_HIST_ARRAY, &hranges, 1 );
  149.             histimg = cvCreateImage( cvSize(320,200), 8, 3 );
  150.             cvZero( histimg );
  151.         }
  152.         cvCopy( frame, image, 0 );
  153.         cvCvtColor( image, hsv, CV_BGR2HSV );
  154.         if( track_object )
  155.         {
  156.             int _vmin = vmin, _vmax = vmax;
  157.             cvInRangeS( hsv, cvScalar(0,smin,MIN(_vmin,_vmax),0),
  158.                         cvScalar(180,256,MAX(_vmin,_vmax),0), mask );
  159.             cvSplit( hsv, hue, 0, 0, 0 );
  160.                        
  161.             if( track_object < 0 )
  162.             {
  163.                 float max_val = 0.f;
  164.                 cvSetImageROI( hue, selection );
  165.                 cvSetImageROI( mask, selection );
  166.                 cvCalcHist( &hue, hist, 0, mask );
  167.                 cvGetMinMaxHistValue( hist, 0, &max_val, 0, 0 );
  168.                 cvConvertScale( hist->bins, hist->bins, max_val ? 255. / max_val : 0., 0 );
  169.                 cvResetImageROI( hue );
  170.                 cvResetImageROI( mask );
  171.                 track_window = selection;
  172.                 track_object = 1;
  173.                 cvZero( histimg );
  174.                 bin_w = histimg->width / hdims;
  175.                 for( i = 0; i < hdims; i++ )
  176.                 {
  177.                     int val = cvRound( cvGetReal1D(hist->bins,i)*histimg->height/255 );
  178.                     CvScalar color = hsv2rgb(i*180.f/hdims);
  179.                     cvRectangle( histimg, cvPoint(i*bin_w,histimg->height),
  180.                                  cvPoint((i+1)*bin_w,histimg->height - val),
  181.                                  color, -1, 8, 0 );
  182.                 }
  183.             }
  184. // if(bBackProject)
  185. // {
  186.               cvCalcBackProject( &hue, backproject, hist );
  187.               cvAnd( backproject, mask, backproject, 0 );
  188.   bBackProject=false;
  189. // }
  190. cvMeanShift( backproject, track_window,
  191.                         cvTermCriteria( CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 20, 1 ), 
  192.  &comp );
  193.             //cvCamShift( backproject, track_window,
  194.              ////           cvTermCriteria( CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 10, 1 ),
  195.               //         &track_comp, &track_box );
  196.             //track_window = track_comp.rect;
  197. track_window= comp.rect;
  198. CvPoint pt1,pt2;
  199. pt1.x=comp.rect.x;
  200. pt1.y=comp.rect.y;
  201. pt2.x=comp.rect.x+comp.rect.width;
  202. pt2.y=(comp.rect.y+comp.rect.height);
  203. cvRectangle(image,pt1,pt2,CV_RGB(0,0,255));
  204.             
  205.             if( backproject_mode )
  206.                 cvCvtColor( backproject, image, CV_GRAY2BGR );
  207.            // if( image->origin )
  208.            //     track_box.angle = -track_box.angle;
  209.            // cvEllipseBox( image, track_box, CV_RGB(255,0,0), 3, CV_AA, 0 );
  210.         }
  211.         
  212.         if( select_object && selection.width > 0 && selection.height > 0 )
  213.         {
  214.             cvSetImageROI( image, selection );
  215.             cvXorS( image, cvScalarAll(255), image, 0 );
  216.             cvResetImageROI( image );
  217.         }
  218.         cvShowImage( "MeanShiftDemo", image );
  219.         cvShowImage( "Histogram", histimg );
  220.         c = cvWaitKey(10);
  221.         if( c == 27 )
  222.             break;
  223.         switch( c )
  224.         {
  225.         case 'b':
  226.             backproject_mode ^= 1;
  227.             break;
  228.         case 'c':
  229.             track_object = 0;
  230.             cvZero( histimg );
  231.             break;
  232.         case 'h':
  233.             show_hist ^= 1;
  234.             if( !show_hist )
  235.                 cvDestroyWindow( "Histogram" );
  236.             else
  237.                 cvNamedWindow( "Histogram", 1 );
  238.             break;
  239.         default:
  240.             ;
  241. Sleep(100);
  242.         }
  243.     }
  244.     cvReleaseCapture( &capture );
  245.     cvDestroyWindow("CamShiftDemo");
  246.     
  247. }
  248. void on_mouse(int event, int x, int y, int flags, void *param)
  249. {
  250.     if( !image )
  251.         return;
  252.     if( image->origin )
  253.         y = image->height - y;
  254.     if( select_object )
  255.     {
  256.         selection.x = MIN(x,origin.x);
  257.         selection.y = MIN(y,origin.y);
  258.         selection.width = selection.x + CV_IABS(x - origin.x);
  259.         selection.height = selection.y + CV_IABS(y - origin.y);
  260.         
  261.         selection.x = MAX( selection.x, 0 );
  262.         selection.y = MAX( selection.y, 0 );
  263.         selection.width = MIN( selection.width, image->width );
  264.         selection.height = MIN( selection.height, image->height );
  265.         selection.width -= selection.x;
  266.         selection.height -= selection.y;
  267.     }
  268.     switch( event )
  269.     {
  270.     case CV_EVENT_LBUTTONDOWN:
  271.         origin = cvPoint(x,y);
  272.         selection = cvRect(x,y,0,0);
  273.         select_object = 1;
  274.         break;
  275.     case CV_EVENT_LBUTTONUP:
  276.         select_object = 0;
  277.         if( selection.width > 0 && selection.height > 0 )
  278.             track_object = -1;
  279.         break;
  280.     }
  281. }
  282. CvScalar CDemoDlg::hsv2rgb(float hue)
  283. {
  284. int rgb[3], p, sector;
  285.     static const int sector_data[][3]=
  286.         {{0,2,1}, {1,2,0}, {1,0,2}, {2,0,1}, {2,1,0}, {0,1,2}};
  287.     hue *= 0.033333333333333333333333333333333f;
  288.     sector = cvFloor(hue);
  289.     p = cvRound(255*(hue - sector));
  290.     p ^= sector & 1 ? 255 : 0;
  291.     rgb[sector_data[sector][0]] = 255;
  292.     rgb[sector_data[sector][1]] = 0;
  293.     rgb[sector_data[sector][2]] = p;
  294.     return cvScalar(rgb[2], rgb[1], rgb[0],0);
  295. }