From: Pierre M. <sid...@us...> - 2005-06-02 16:42:08
|
Update of /cvsroot/robotflow/RobotFlow/Vision/include In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv7001 Modified Files: VisualHistogramDesc.h Log Message: Added validity flag. Index: VisualHistogramDesc.h =================================================================== RCS file: /cvsroot/robotflow/RobotFlow/Vision/include/VisualHistogramDesc.h,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** VisualHistogramDesc.h 1 Jun 2005 03:34:48 -0000 1.5 --- VisualHistogramDesc.h 2 Jun 2005 16:41:59 -0000 1.6 *************** *** 16,21 **** */ ! #ifndef _VISUALHISTOGRAMFEATURE_H_ ! #define _VISUALHISTOGRAMFEATURE_H_ #include "Object.h" --- 16,21 ---- */ ! #ifndef _VISUALHISTOGRAMDESC_H_ ! #define _VISUALHISTOGRAMDESC_H_ #include "Object.h" *************** *** 32,35 **** --- 32,37 ---- e_VISUALHIST_BhattacharyyaCoeff = 0, e_VISUALHIST_BhattacharyyaDist, + e_VISUALHIST_HistIntersection, + e_VISUALHIST_EuclideanDist, // TODO: add other similarity methods e_VISUALHIST_unknownSimilarity *************** *** 55,58 **** --- 57,61 ---- : VisualFeatureDesc<BinType>(e_VISUALDESCRIPTOR_histogram), m_simType(e_VISUALHIST_unknownSimilarity), + m_valid(false), m_normFlag(false), m_numDimensions(0), *************** *** 68,71 **** --- 71,75 ---- : VisualFeatureDesc<BinType>(e_VISUALDESCRIPTOR_histogram), m_simType(i_simType), + m_valid(true), m_normFlag(i_normFlag), m_numDimensions(i_numDimensions), *************** *** 99,102 **** --- 103,107 ---- { this->SetType(i_ref.GetType()); + m_valid = i_ref.m_valid; m_simType = i_ref.m_simType; m_normFlag = i_ref.m_normFlag; *************** *** 143,146 **** --- 148,152 ---- this->SetType(i_ref.GetType()); m_simType = i_ref.m_simType; + m_valid = i_ref.m_valid; m_normFlag = i_ref.m_normFlag; *************** *** 195,198 **** --- 201,205 ---- out << "<TotalBins " << m_totalBins << " >" << std::endl; out << "<SimilarityType " << (int)m_simType << " >" << std::endl; + out << "<Validity " << (int)m_valid << " >" << std::endl; out << "<NormFlag " << (int)m_normFlag << " >" << std::endl; out << "<LastMaxVal " << m_lastMaxVal << " >" << std::endl; *************** *** 261,264 **** --- 268,276 ---- SetSimilarityFct(); } + else if (tag == "Validity") { + int val; + in >> val; + m_valid = bool(val); + } else if (tag == "NormFlag") { int val; *************** *** 320,323 **** --- 332,340 ---- } + if (!m_valid) { + // Invalid descriptor, output maximal distance + return 0.0; + } + // Use appropriate function return (this->*m_similarityFct)(i_candidate); *************** *** 754,757 **** --- 771,779 ---- } + bool GetValidity() const + { + return m_valid; + } + // WARNING: this function modifies only the histogram bins void SetSize(unsigned int i_size) *************** *** 797,800 **** --- 819,827 ---- } } + + void SetValidity(bool i_flag) + { + m_valid = i_flag; + } private: *************** *** 807,810 **** --- 834,848 ---- m_similarityFct = &VisualHistogramDesc::BhattacharyyaDist; } + else if (m_simType == e_VISUALHIST_HistIntersection) { + if (m_normFlag) { + m_similarityFct = &VisualHistogramDesc::HistogramIntersection; + } + else { + m_similarityFct = &VisualHistogramDesc::HistogramIntersectionWNorm; + } + } + else if (m_simType == e_VISUALHIST_EuclideanDist) { + m_similarityFct = &VisualHistogramDesc::EuclideanDist; + } else { m_similarityFct = NULL; *************** *** 849,852 **** --- 887,970 ---- } + double HistogramIntersection(const BinType *i_candidateBins) const + { + const BinType *p_curBins = (const BinType *)m_bins; + const BinType *p_candidateBins = i_candidateBins; + double sum = 0.0; + + for (int b=0; b<m_totalBins; b++) { + if (*p_curBins < *p_candidateBins) { + sum += *p_curBins; + } + else { + sum += *p_candidateBins; + } + + p_curBins++; + p_candidateBins++; + } + + return 1.0-sum; + } + + double HistogramIntersectionWNorm(const BinType *i_candidateBins) const + { + const BinType *p_curBins = (const BinType *)m_bins; + const BinType *p_candidateBins = i_candidateBins; + BinType curHistSum = (BinType)0; + BinType candHistSum = (BinType)0; + BinType curNormVal; + BinType candNormVal; + double sum = 0.0; + + for (int b=0; b<m_totalBins; b++) { + curHistSum += *p_curBins; + candHistSum += *p_candidateBins; + + p_curBins++; + p_candidateBins++; + } + + p_curBins = (const BinType *)m_bins; + p_candidateBins = i_candidateBins; + + for (int b=0; b<m_totalBins; b++) { + curNormVal = (*p_curBins)/curHistSum; + candNormVal = (*p_candidateBins)/candHistSum; + + if (curNormVal < candNormVal) { + sum += curNormVal; + } + else { + sum += candNormVal; + } + + p_curBins++; + p_candidateBins++; + } + + return 1.0-sum; + } + + double EuclideanDist(const BinType *i_candidateBins) const + { + int b; + BinType diff; + double dist = 0.0; + const BinType *p_curBins = (const BinType *)m_bins; + const BinType *p_candidateBins = i_candidateBins; + + for (int b=0; b<m_totalBins; b++) { + diff = (*p_curBins) - (*p_candidateBins); + dist += diff*diff; + p_curBins++; + p_candidateBins++; + } + + dist = sqrt(dist); + + return 1.0-dist; + } + void AdaptNorm(const BinType *i_candidateBins, double i_rate) { *************** *** 905,908 **** --- 1023,1029 ---- e_VISUALHIST_similarityType m_simType; + // Validity flag in cases where ROI was invalid for features extraction + bool m_valid; + // Flag to normalize histogram bins bool m_normFlag; |