Skincolor.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: Skincolor.cpp,v 1.6 2004/10/15 20:03:24 matz Exp $
  22. **/
  23. // fixed segmentation
  24. #include "Common.h"
  25. #include "Skincolor.h"
  26. #include "skinrgb.h"
  27. //
  28. // Constructor
  29. //
  30. Skincolor::Skincolor()
  31.   : m_draw_once(false),
  32.     m_last_coverage(-1)
  33. {
  34. } // (Constructor)
  35. Skincolor::~Skincolor()
  36. {
  37. }
  38. void Skincolor::Initialize(int /*width*/, int /*height*/)
  39. {
  40. }
  41. #pragma warning (disable:4786)
  42. /* return the coverage with skin pixels, given the fixed lookup table
  43.  */
  44. double Skincolor::GetCoverage(IplImage *image, const CRect& roi,
  45.                                    ConstMaskIt mask, 
  46.                                    bool backproject)
  47. {
  48.   ColorBGR black; 
  49.   black.red = black.green = black.blue = 0;
  50.   const double scp_thresh = 0.7;  // skin color probability
  51.   int skin = 0;
  52.   int noskin = 0;
  53.   int start_x = max(0, roi.left);
  54.   int start_y = max(0, roi.top);
  55.   int stop_x = min(image->width, roi.right);
  56.   int stop_y = min(image->height, roi.bottom);
  57.   double scale_x = (double)(stop_x-start_x-1)/((*mask).second.GetWidth()-1.);
  58.   double scale_y = (double)(stop_y-start_y-1)/((*mask).second.GetHeight()-1.);
  59.   for (int y=start_y; y<stop_y; y++) {
  60.     ColorBGR* prgb = (ColorBGR*) image->imageData;
  61. //    RGBTRIPLE* prgb = (RGBTRIPLE*) image->imageData;
  62.     prgb += y*image->width + start_x;
  63.     for (int x=start_x; x<stop_x; x++) {
  64.       int m_x = cvRound((double)(x-start_x)/scale_x);
  65.       int m_y = cvRound((double)(y-start_y)/scale_y);
  66.       double scp = (*mask).second.GetProb(m_x, m_y);
  67.       if (scp>=scp_thresh) {
  68.         if (IsSkin_RGB(*prgb)) {
  69.           skin++;
  70.         } else {
  71.           noskin++;
  72.           if (backproject) {
  73.             *prgb = black; 
  74.           }
  75.         }
  76.       }
  77.       prgb++;
  78.     }
  79.   }
  80.   { // for drawing output only:
  81.     m_draw_once = true;
  82.     m_last_mask = mask;
  83.   }
  84.   m_last_coverage = (double)skin/(double)(skin+noskin);
  85.   return m_last_coverage;
  86. }
  87. #pragma warning (default:4786)
  88. void Skincolor::DrawOverlay(IplImage* rgbImage, int overlay_level, 
  89.                             const CRect& roi)
  90. {
  91.   if (m_draw_once) {
  92.     if (overlay_level>=3) {
  93.       GetCoverage(rgbImage, roi, m_last_mask, true);
  94.     }
  95.     if (overlay_level>=2) {
  96.       // draw coverage bar
  97.       int img_height = rgbImage->height;
  98.       int img_width = rgbImage->width;
  99.       double height = img_height/2;
  100.       int xpos = img_width-25;
  101.       int width = 20;
  102.       int space = 5;
  103.       cvRectangle(rgbImage, cvPoint(xpos, img_height),
  104.                   cvPoint(xpos+width, img_height-(int)height),
  105.                   CV_RGB(255,255,0), 1);
  106.       cvRectangle(rgbImage, cvPoint(xpos, img_height),
  107.                   cvPoint(xpos+width, img_height-(int)(height*m_last_coverage)),
  108.                   CV_RGB(255,255,0), CV_FILLED);
  109.       xpos -= width+space;
  110.     }
  111.     m_draw_once = false;
  112.   }
  113. }