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

视频捕捉/采集

开发平台:

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: Mask.cpp,v 1.7 2005/08/16 00:14:26 matz Exp $
  22. **/
  23. #include "Common.h"
  24. #include "Mask.h"
  25. #include "Exceptions.h"
  26. #include <fstream>
  27. Mask::Mask()
  28. : m_width(-1),
  29.   m_height(-1),
  30.   m_image_area_ratio(-1),
  31.   m_name("")
  32. {
  33. }
  34. Mask::~Mask()
  35. {
  36. }
  37. void Mask::ParseFrom(string filename)
  38. {
  39.   ifstream mask_file(filename.c_str());
  40.   if (!mask_file.is_open()) {
  41.     throw HVEFileNotFound(filename);
  42.   }
  43.   string line;
  44.   do {
  45.     getline(mask_file, line);
  46.   } while (line=="" || line[0]=='#');
  47.   m_probs.clear();
  48.   if (line==HV_MASK_VERSION_1_0_STRING) {
  49.   // version 1.0
  50.     do {
  51.       getline(mask_file, line);
  52.     } while (line=="" || line[0]=='#');
  53.     float ratio;
  54.     char name[1024];
  55.     int scanned = sscanf(line.c_str(), "Mask %s %dx%d, ratio %f", 
  56.                          name, &m_width, &m_height, &ratio);
  57.     if (scanned!=4) {
  58.       throw HVEFile(filename, string("expected mask metadata, found: ")+line);
  59.     }
  60.     if (name[strlen(name)-1]==',') name[strlen(name)-1] = 0;
  61.     if (name[strlen(name)-1]=='"') name[strlen(name)-1] = 0;
  62.     if (name[0]=='"') {
  63.       m_name = string(&name[1]);
  64.     } else {
  65.       m_name = string(name);
  66.     }
  67.     m_image_area_ratio = ratio;
  68.     m_probs.resize(m_width*m_height);
  69.     for (int row=0; row<m_height; row++) {
  70.       do {
  71.         getline(mask_file, line);
  72.       } while (line=="" || line[0]=='#');
  73.       char* cline = (char*) alloca(line.size()*sizeof(char));
  74.       strcpy(cline, line.c_str());
  75.       char* ctok = strtok(cline, " ");
  76.       for (int col=0; col<m_width; col++) {
  77.         double val = atof(ctok);
  78.         m_probs[row*m_width+col] = val;
  79.         ctok = strtok(NULL, " ");
  80.         if (ctok==NULL && col<m_width-1) {
  81.           throw HVEFile(filename, string("expected probabilities, found: ")+line);
  82.         }
  83.       }
  84.     }
  85.   } else {
  86.     // wrong version
  87.     throw HVEFile(filename, string("missing or wrong version: ")+line);
  88.   }
  89.   mask_file.close();
  90. }
  91. double Mask::GetProb(int x, int y) const
  92. {
  93.   ASSERT(0<=x && x<m_width);
  94.   ASSERT(0<=y && y<m_height);
  95.   return m_probs[y*m_width+x];
  96. }