diff options
Diffstat (limited to 'src/plugins/lipi-toolkit/3rdparty/lipi-toolkit/src/reco/shaperec/featureextractor/l7/L7ShapeFeatureExtractor.cpp')
-rw-r--r-- | src/plugins/lipi-toolkit/3rdparty/lipi-toolkit/src/reco/shaperec/featureextractor/l7/L7ShapeFeatureExtractor.cpp | 587 |
1 files changed, 587 insertions, 0 deletions
diff --git a/src/plugins/lipi-toolkit/3rdparty/lipi-toolkit/src/reco/shaperec/featureextractor/l7/L7ShapeFeatureExtractor.cpp b/src/plugins/lipi-toolkit/3rdparty/lipi-toolkit/src/reco/shaperec/featureextractor/l7/L7ShapeFeatureExtractor.cpp new file mode 100644 index 00000000..19e6a9c1 --- /dev/null +++ b/src/plugins/lipi-toolkit/3rdparty/lipi-toolkit/src/reco/shaperec/featureextractor/l7/L7ShapeFeatureExtractor.cpp @@ -0,0 +1,587 @@ +/***************************************************************************************** +* Copyright (c) 2006 Hewlett-Packard Development Company, L.P. +* Permission is hereby granted, free of charge, to any person obtaining a copy of +* this software and associated documentation files (the "Software"), to deal in +* the Software without restriction, including without limitation the rights to use, +* copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +* Software, and to permit persons to whom the Software is furnished to do so, +* subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +* CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE +* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*****************************************************************************************/ + +/************************************************************************ + * SVN MACROS + * + * $LastChangedDate: 2008-02-20 10:03:51 +0530 (Wed, 20 Feb 2008) $ + * $Revision: 423 $ + * $Author: sharmnid $ + * + ************************************************************************/ +/************************************************************************ + * FILE DESCR: Implementation of RunShaperec tool + * + * CONTENTS: + * extractFeatures + * getShapeFeatureInstance + * clearFeatureVector + * computeDerivativeDenominator + * computeDerivative + * + * AUTHOR: Naveen Sundar G. + * + * DATE: August 30, 2005 + * CHANGE HISTORY: + * Author Date Description of change + ************************************************************************/ + + +#include "L7ShapeFeatureExtractor.h" +#include "L7ShapeFeature.h" +#include "LTKTraceGroup.h" +#include "LTKTrace.h" +#include "LTKChannel.h" +#include "LTKTraceFormat.h" +#include "LTKConfigFileReader.h" +#include "LTKMacros.h" +#include "LTKException.h" +#include "LTKErrors.h" +#include "LTKLoggerUtil.h" + +/****************************************************************************** +* AUTHOR : Dinesh M +* DATE : 1-Oct-2007 +* NAME : L7ShapeFeatureExtractor +* DESCRIPTION : parameterized constructor +* ARGUMENTS : +* RETURNS : +* NOTES : +* CHANGE HISTROY +* Author Date +*******************************************************************************/ +L7ShapeFeatureExtractor::L7ShapeFeatureExtractor(const LTKControlInfo& controlInfo): +m_radius(FEATEXTR_L7_DEF_RADIUS) +{ + string cfgFilePath = ""; + + // Config file + if ( ! ((controlInfo.lipiRoot).empty()) && + ! ((controlInfo.projectName).empty()) && + ! ((controlInfo.profileName).empty()) && + ! ((controlInfo.cfgFileName).empty())) + { + // construct the cfg path using project and profile name + cfgFilePath = (controlInfo.lipiRoot) + PROJECTS_PATH_STRING + + (controlInfo.projectName) + PROFILE_PATH_STRING + + (controlInfo.profileName) + SEPARATOR + + (controlInfo.cfgFileName) + CONFIGFILEEXT; + } + else if ( ! ((controlInfo.cfgFilePath).empty() )) + { + cfgFilePath = controlInfo.cfgFilePath; + } + else + { + throw LTKException(EINVALID_PROJECT_NAME); + } + + int returnVal = readConfig(cfgFilePath); + + if (returnVal != SUCCESS) + { + LOG(LTKLogger::LTK_LOGLEVEL_ERR) << + "Error: L7ShapeFeatureExtractor::L7ShapeFeatureExtractor()" <<endl; + + throw LTKException(returnVal); + } + + LOG(LTKLogger::LTK_LOGLEVEL_DEBUG) << "Exiting " << + "L7ShapeFeatureExtractor::L7ShapeFeatureExtractor()" << endl; + +} + +/********************************************************************************** +* AUTHOR : Dinesh M +* DATE : 1-Oct-2007 +* NAME : readConfig +* DESCRIPTION : read the config values from cfg file and set member variables +* ARGUMENTS : +* RETURNS : +* NOTES : +* CHANGE HISTROY +* Author Date +*************************************************************************************/ + +int L7ShapeFeatureExtractor::readConfig(const string& cfgFilePath) +{ + LOG( LTKLogger::LTK_LOGLEVEL_DEBUG) << "Entering " << + "L7ShapeFeatureExtractor::readConfig()" << endl; + + LTKConfigFileReader* configurableProperties = NULL; + string tempStringVar = ""; + + try + { + configurableProperties = new LTKConfigFileReader(cfgFilePath); + + int errorCode = configurableProperties->getConfigValue(L7RADIUS, tempStringVar); + + if( errorCode == SUCCESS) + { + if (setRadius(atoi((tempStringVar).c_str())) != SUCCESS) + { + LOG( LTKLogger::LTK_LOGLEVEL_ERR) << "Error: " << + ECONFIG_FILE_RANGE << " : " << + getErrorMessage(ECONFIG_FILE_RANGE) << + " L7ShapeFeatureExtractor::readConfig" <<endl; + + throw LTKException(ECONFIG_FILE_RANGE); + } + } + } + + catch(LTKException e) + { + delete configurableProperties; + + int eCode = e.getErrorCode(); + + LOG( LTKLogger::LTK_LOGLEVEL_ERR) << "Error: " << eCode << + " : " << getErrorMessage(eCode) << + " L7ShapeFeatureExtractor::readConfig" <<endl; + + LTKReturnError(eCode); + } + delete configurableProperties; + + LOG( LTKLogger::LTK_LOGLEVEL_DEBUG) << "Exiting " << + "L7ShapeFeatureExtractor::readConfig()" << endl; + + return SUCCESS; + +} + +/********************************************************************************** +* AUTHOR : Dinesh M +* DATE : 1-Oct-2007 +* NAME : setRadius +* DESCRIPTION : set the radius(the size of window) to compute L7 features +* ARGUMENTS : +* RETURNS : +* NOTES : +* CHANGE HISTROY +* Author Date +*************************************************************************************/ +int L7ShapeFeatureExtractor::setRadius(int radius) +{ + int returnVal = FAILURE; + + if ( radius > 0 ) + { + m_radius = radius; + returnVal = SUCCESS; + } + + return returnVal; +} + +/********************************************************************************** +* AUTHOR : Nidhi Sharma +* DATE : 15-Feb-2008 +* NAME : getRadius +* DESCRIPTION : +* ARGUMENTS : +* RETURNS : +* NOTES : +* CHANGE HISTROY +* Author Date +*************************************************************************************/ +int L7ShapeFeatureExtractor::getRadius() +{ + return m_radius; +} + + +/********************************************************************************** +* AUTHOR : Naveen Sundar G. +* DATE : 10-AUGUST-2007 +* NAME : extractFeatures +* DESCRIPTION : Extracts L7 features from a trace group +* ARGUMENTS : The trace group from which features have to be extracted +* RETURNS : vector of L7ShapeFeature objects +* NOTES : +* CHANGE HISTROY +* Author Date Description of change +*************************************************************************************/ +int L7ShapeFeatureExtractor::extractFeatures(const LTKTraceGroup& inTraceGroup, + vector<LTKShapeFeaturePtr>& outFeatureVec) +{ + + LOG(LTKLogger::LTK_LOGLEVEL_DEBUG) << "Entering " << + "L7ShapeFeatureExtractor::extractFeatures()" << endl; + + L7ShapeFeature* featurePtr = NULL; + float delta; + int currentStrokeSize; + int numPoints; + + int numberOfTraces = inTraceGroup.getNumTraces(); + + if (numberOfTraces == 0 ) + { + LOG(LTKLogger::LTK_LOGLEVEL_ERR) << "Error :" << + EEMPTY_TRACE_GROUP << " : " << getErrorMessage(EEMPTY_TRACE_GROUP) << + "L7ShapeFeatureExtractor::extractFeatures()" << endl; + + LTKReturnError(EEMPTY_TRACE_GROUP); + } + + + LTKTraceVector allTraces = inTraceGroup.getAllTraces(); + LTKTraceVector::iterator traceIter = allTraces.begin(); + LTKTraceVector::iterator traceEnd = allTraces.end(); + + //the feature vector + vector<float> xVec; + vector<float> yVec; + vector<bool> penUp; + + //concatentating the strokes + for (; traceIter != traceEnd ; ++traceIter) + { + floatVector tempxVec, tempyVec; + + (*traceIter).getChannelValues("X", tempxVec); + + (*traceIter).getChannelValues("Y", tempyVec); + + currentStrokeSize = tempxVec.size(); + + if (currentStrokeSize == 0) + { + LOG(LTKLogger::LTK_LOGLEVEL_ERR) << "Error :" << + EEMPTY_TRACE<< " : " << getErrorMessage(EEMPTY_TRACE) << + "L7ShapeFeatureExtractor::extractFeatures()" << endl; + + LTKReturnError(EEMPTY_TRACE); + } + + for(int point=0;point<currentStrokeSize;point++) + { + xVec.push_back(tempxVec[point]); + yVec.push_back(tempyVec[point]); + + if(point == currentStrokeSize - 1 ) + { + penUp.push_back(true); + } + else + { + penUp.push_back(false); + } + } + } + //concatentating the strokes + + numPoints=xVec.size(); + + vector<float> normfirstderv_x(numPoints); // Array to store the first normalized derivative w.r.t x + vector<float> normfirstderv_y(numPoints); // Array to store the first normalized derivative w.r.t y + vector<float> normsecondderv_x(numPoints); // Array to store the second normalized derivative w.r.t x + vector<float> normsecondderv_y(numPoints); // Array to store the second normalized derivative w.r.t y + vector<float> curvature(numPoints); // Array to store the curvature + + computeDerivative(xVec,yVec,normfirstderv_x,normfirstderv_y,m_radius); + + computeDerivative(normfirstderv_x,normfirstderv_y,normsecondderv_x,normsecondderv_y,m_radius); + + for(int i=0; i<numPoints; ++i) + { + //computing the curvature + delta= sqrt(pow(pow(normfirstderv_x[i],2)+pow(normfirstderv_y[i],2),3)); + curvature[i]= ((normfirstderv_x[i]*normsecondderv_y[i]) - (normsecondderv_x[i]*normfirstderv_y[i]))/(delta+EPS); + + featurePtr = new L7ShapeFeature(xVec[i], yVec[i], + normfirstderv_x[i], normfirstderv_y[i], + normsecondderv_x[i], normsecondderv_y[i], + curvature[i], penUp[i]); + //populating the feature vector + outFeatureVec.push_back(LTKShapeFeaturePtr(featurePtr)); + featurePtr = NULL; + } + + LOG(LTKLogger::LTK_LOGLEVEL_DEBUG) << "Exiting " << + "L7ShapeFeatureExtractor::extractFeatures()" << endl; + + return SUCCESS; +} + +/********************************************************************************** +* AUTHOR : Naveen Sundar G. +* DATE : 10-AUGUST-2007 +* NAME : getShapeFeatureInstance +* DESCRIPTION : Returns an L7ShapeFeature instance +* ARGUMENTS : +* RETURNS : An L7ShapeFeature instance +* NOTES : +* CHANGE HISTROY +* Author Date Description of change +*************************************************************************************/ +LTKShapeFeaturePtr L7ShapeFeatureExtractor::getShapeFeatureInstance() +{ + LTKShapeFeaturePtr tempPtr(new L7ShapeFeature); + return tempPtr; +} + + +/****************************************************************************** +* AUTHOR : Naveen Sundar G. +* DATE : Sept-10-2007 +* NAME : convertFeatVecToTraceGroup +* DESCRIPTION : +* ARGUMENTS : +* RETURNS : +* NOTES : +* CHANGE HISTROY +* Author Date Description +******************************************************************************/ +int L7ShapeFeatureExtractor::convertFeatVecToTraceGroup( + const vector<LTKShapeFeaturePtr>& shapeFeature, + LTKTraceGroup& outTraceGroup) +{ + LOG(LTKLogger::LTK_LOGLEVEL_DEBUG) << "Entering " << + "L7ShapeFeatureExtractor::convertFeatVecToTraceGroup()" << endl; + + vector<LTKChannel> channels; // channels of a trace + + LTKChannel xChannel("X", DT_INT, true); // x-coordinate channel of the trace + LTKChannel yChannel("Y", DT_INT, true); // y-coordinate channel of the trace + + //initializing the channels of the trace + channels.push_back(xChannel); + channels.push_back(yChannel); + + // composing the trace format object + LTKTraceFormat traceFormat(channels); + + vector<float> point; // a point of a trace + + LTKTrace trace(traceFormat); + + for(int count=0;count<(int)shapeFeature.size();count++) + { + float Xpoint, Ypoint; + bool penUp; + + L7ShapeFeature* ptr = (L7ShapeFeature*)(shapeFeature[count].operator ->()); + Xpoint = ptr->getX(); + Ypoint = ptr->getY(); + penUp = ptr->isPenUp(); + + + + point.push_back(Xpoint); + point.push_back(Ypoint); + + trace.addPoint(point); + point.clear(); + + + if(penUp == true) // end of a trace, clearing the trace now + { + outTraceGroup.addTrace(trace); + trace.emptyTrace(); + LTKTrace tempTrace(traceFormat); + trace = tempTrace; + } + } + + LOG(LTKLogger::LTK_LOGLEVEL_DEBUG) << "Exiting " << + "L7ShapeFeatureExtractor::convertFeatVecToTraceGroup()" << endl; + return SUCCESS; + +} + +/********************************************************************************** +* AUTHOR : Naveen Sundar G. +* DATE : 10-AUGUST-2007 +* NAME : computeDerivativeDenominator +* DESCRIPTION : Computes the denominator to be used in the derivative computation +* ARGUMENTS : The index used in derivative computation +* RETURNS : The denominator +* NOTES : +* CHANGE HISTROY +* Author Date Description of change +*************************************************************************************/ +int L7ShapeFeatureExtractor::computeDerivativeDenominator(int index) +{ + int denominator=0; + + for (int i=1;i<=index;i++) + { + + denominator=denominator+i*i; + } + return 2*denominator; +} + +/********************************************************************************** +* AUTHOR : Naveen Sundar G. +* DATE : 10-AUGUST-2007 +* NAME : computeDerivative +* DESCRIPTION : Computes the derivative +* ARGUMENTS : The input and output vectors. The output vectors are the derivatives of the input vectors +* RETURNS : +* NOTES : +* CHANGE HISTROY +* Author Date Description of change +*************************************************************************************/ +void L7ShapeFeatureExtractor::computeDerivative(const vector<float>& xVec, + const vector<float>& yVec, + vector<float>& dx, + vector<float>& dy, + int index) +{ + int size = xVec.size(); + int denominator = computeDerivativeDenominator(index); + float x,y,diffx,diffy,delta; + float firstderv_x,firstderv_y; + int i,j; + + if(index<size-index) + { + for(i=index; i<size-index; ++i) + { + x= xVec[i]; + y= yVec[i]; + diffx=0; + diffy=0; + + for( j=1;j<=index;j++) + { + diffx = diffx + j*(xVec[i+j]-xVec[i-j]) ; + diffy = diffy + j*(yVec[i+j]-yVec[i-j]) ; + } + + firstderv_x = diffx/denominator; + firstderv_y = diffy/denominator; + delta = sqrt(pow(firstderv_x,2)+pow(firstderv_y,2)); + if(delta!=0) + { + dx[i] = firstderv_x/(delta); + dy[i] = firstderv_y/(delta); + } + else + { + dx[i] = 0; + dy[i] = 0; + } + + + } + + for(i=0;i<index;i++) + { + x= xVec[i]; + y= yVec[i]; + diffx=0; + diffy=0; + + for( j=1;j<=index;j++) + { + diffx = diffx + j*(xVec[i+j]-x) ; + diffy = diffy + j*(yVec[i+j]-y) ; + } + firstderv_x = diffx/denominator; + firstderv_y = diffy/denominator; + delta = sqrt(pow(firstderv_x,2)+pow(firstderv_y,2)); + if(delta!=0) + { + dx[i] = firstderv_x/(delta); + dy[i] = firstderv_y/(delta); + } + else + { + dx[i] = 0; + dy[i] = 0; + } + + } + + for(i=size-index;i<=size-1;i++) + { + x= xVec[i]; + y= yVec[i]; + diffx=0; + diffy=0; + + for( j=1;j<=index;j++) + { + diffx = diffx + j*(x-xVec[i-j]) ; + diffy = diffy + j*(y-yVec[i-j]) ; + } + firstderv_x = diffx/denominator; + firstderv_y = diffy/denominator; + delta = sqrt(pow(firstderv_x,2)+pow(firstderv_y,2)); + if(delta!=0) + { + dx[i] = firstderv_x/(delta); + dy[i] = firstderv_y/(delta); + } + else + { + dx[i] = 0; + dy[i] = 0; + } + } + } + if(index>size-index) + { + for(i=0; i<size; ++i) + { + x= xVec[i]; + y= yVec[i]; + diffx=0; + diffy=0; + if((0<i+j)&(i+j<size)) + { + for( j=1;j<=index;j++) + { + diffx = diffx + j*(xVec[i+j]-x) ; + diffy = diffy + j*(yVec[i+j]-y) ; + } + } + else + { + for(j=1;j<=index;j++) + { + diffx = diffx + j*(x-xVec[i-j]) ; + diffy = diffy + j*(y-yVec[i-j]) ; + } + } + + firstderv_x = diffx/denominator; + firstderv_y = diffy/denominator; + delta = sqrt(pow(firstderv_x,2)+pow(firstderv_y,2)); + if(delta!=0) + { + dx[i] = firstderv_x/(delta); + dy[i] = firstderv_y/(delta); + } + else + { + dx[i] = 0; + dy[i] = 0; + } + + } + } +} + |