CubicleWrapper.cpp
上传用户:lijia5631
上传日期:2008-11-10
资源大小:1214k
文件大小:4k
源码类别:

视频捕捉/采集

开发平台:

MultiPlatform

  1. /**
  2.   * HandVu - a library for computer vision-based hand gesture
  3.   * recognition.
  4.   * Copyright (C) 2004 Mathias Kolsch, matz@cs.ucsb.edu
  5.   *
  6.   * This program is free software; you can redistribute it and/or
  7.   * modify it under the terms of the GNU General Public License
  8.   * as published by the Free Software Foundation; either version 2
  9.   * of the License, or (at your option) any later version.
  10.   *
  11.   * This program is distributed in the hope that it will be useful,
  12.   * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.   * GNU General Public License for more details.
  15.   *
  16.   * You should have received a copy of the GNU General Public License
  17.   * along with this program; if not, write to the Free Software
  18.   * Foundation, Inc., 59 Temple Place - Suite 330, 
  19.   * Boston, MA  02111-1307, USA.
  20.   *
  21.   * $Id: CubicleWrapper.cpp,v 1.13 2005/10/30 21:16:03 matz Exp $
  22. **/
  23. #include "Common.h"
  24. #include "CubicleWrapper.h"
  25. #include "HandVu.hpp"
  26. //
  27. // Constructor
  28. //
  29. CubicleWrapper::CubicleWrapper()
  30. {
  31.   cvInitFont( &m_cvFont, CV_FONT_VECTOR0, 0.5f /* hscale */, 
  32.     0.5f /* vscale */, 0.1f /*italic_scale */, 
  33.     1 /* thickness */);
  34.   m_bbox = CRect(-1, -1, -1, -1);
  35. }
  36. CubicleWrapper::~CubicleWrapper()
  37. {
  38. }
  39. void CubicleWrapper::Initialize(int width, int height)
  40. {
  41.   cuInitialize(width, height);
  42. }
  43. void CubicleWrapper::Process(IplImage* grayImage)
  44. {
  45.   cuScan(grayImage, m_matches);
  46.   cuGetScannedArea(&m_bbox.left, &m_bbox.top, &m_bbox.right, &m_bbox.bottom);
  47.   cuGetScaleSizes(&m_min_width, &m_max_width, &m_min_height, &m_max_height);
  48. } // Process
  49. void CubicleWrapper::DrawOverlay(IplImage* iplImage, int overlay_level) const
  50. {
  51.   if (overlay_level>=1) {
  52.     DrawMatches(iplImage, overlay_level);
  53.   }
  54. }
  55. void CubicleWrapper::DrawMatches(IplImage* iplImage, int overlay_level) const
  56. {
  57.   for (CuScanMatchVector::const_iterator it
  58.          = m_matches.begin();
  59.        it!=m_matches.end();
  60.        it++)
  61.   {
  62.     cvLine(iplImage, cvPoint(it->left, it->top),
  63.            cvPoint(it->right, it->top), CV_RGB(0, 255, 0));
  64.     cvLine(iplImage, cvPoint(it->right, it->top),
  65.            cvPoint(it->right, it->bottom), CV_RGB(0, 255, 0));
  66.     cvLine(iplImage, cvPoint(it->left, it->bottom),
  67.            cvPoint(it->right, it->bottom), CV_RGB(0, 255, 0));
  68.     cvLine(iplImage, cvPoint(it->left, it->top),
  69.            cvPoint(it->left, it->bottom), CV_RGB(0, 255, 0));
  70.   }
  71.   
  72.   if (m_bbox.left>-1 && overlay_level>=2) {
  73.     cvLine(iplImage, cvPoint(m_bbox.left, m_bbox.top),
  74.            cvPoint(m_bbox.right, m_bbox.top), CV_RGB(255, 255, 255));
  75.     cvLine(iplImage, cvPoint(m_bbox.right, m_bbox.top),
  76.            cvPoint(m_bbox.right, m_bbox.bottom), CV_RGB(255, 255, 255));
  77.     cvLine(iplImage, cvPoint(m_bbox.left, m_bbox.bottom),
  78.            cvPoint(m_bbox.right, m_bbox.bottom), CV_RGB(255, 255, 255));
  79.     cvLine(iplImage, cvPoint(m_bbox.left, m_bbox.top),
  80.            cvPoint(m_bbox.left, m_bbox.bottom), CV_RGB(255, 255, 255));
  81.   }
  82.   if (m_bbox.left>-1 && overlay_level>=3) {
  83.     int top;
  84.     int left;
  85.     // min scan size
  86.     top = max(m_bbox.top, m_bbox.bottom-m_min_height);
  87.     left = max(m_bbox.left, m_bbox.right-m_min_width);
  88.     cvLine(iplImage, 
  89.       cvPoint(m_bbox.right, top),
  90.       cvPoint(left, top), 
  91.       CV_RGB(0, 0, 255));
  92.     cvLine(iplImage, 
  93.       cvPoint(left, top),
  94.       cvPoint(left, m_bbox.bottom), 
  95.       CV_RGB(0, 0, 255));
  96.     // max scan size
  97.     top = max(m_bbox.top, m_bbox.bottom-m_max_height);
  98.     left = max(m_bbox.left, m_bbox.right-m_max_width);
  99.     cvLine(iplImage, 
  100.       cvPoint(m_bbox.right, top),
  101.       cvPoint(left, top), 
  102.       CV_RGB(0, 0, 255));
  103.     cvLine(iplImage, 
  104.       cvPoint(left, top),
  105.       cvPoint(left, m_bbox.bottom), 
  106.       CV_RGB(0, 0, 255));
  107.   }
  108. }
  109. CuScanMatch CubicleWrapper::GetBestMatch()
  110. {
  111.   int num_matches = (int)m_matches.size();
  112.   ASSERT(num_matches);
  113.   if (num_matches==1) {
  114.     return m_matches[0];
  115.   }
  116.   // pick the smallest height for now
  117.   int min_height = INT_MAX;
  118.   int best_indx = -1;
  119.   for (int mc=0; mc<num_matches; mc++) {
  120.     int height = m_matches[mc].bottom-m_matches[mc].top;
  121.     if (height<min_height) {
  122.       min_height = height;
  123.       best_indx = mc;
  124.     }
  125.   }
  126.   ASSERT(best_indx!=-1);
  127.   return m_matches[best_indx];
  128. }