bool T_Closeness::SetRisk( const vector<EqvClass*>& rVecPtEqv, vector<float>& rVecRisk ) { long num_eqv = rVecPtEqv.size(); long num_tuple = 0; long i; map<UnitValue, long>::const_iterator sv_pos; map<UnitValue, long> mapEqClsCnt = (rVecPtEqv[0])->m_mapSenCnt; for (sv_pos = (rVecPtEqv[0])->m_mapSenCnt.begin(); sv_pos != (rVecPtEqv[0])->m_mapSenCnt.end(); ++sv_pos) { // map<UnitValue, long>::iterator temp_pos = mapEqClsCnt.find( (*sv_pos).first ); // if (temp_pos == mapEqClsCnt.end()) // { // mapEqClsCnt.insert( *sv_pos ); // } // else // { // (*temp_pos).second += (*sv_pos).second; // } num_tuple += (*sv_pos).second; } for (i = 1; i < num_eqv; ++i) { const map<UnitValue, long>& r_sa_map = (rVecPtEqv[i])->m_mapSenCnt; for (sv_pos = r_sa_map.begin(); sv_pos != r_sa_map.end(); ++sv_pos) { map<UnitValue, long>::iterator temp_pos = mapEqClsCnt.find( (*sv_pos).first ); if (temp_pos == mapEqClsCnt.end()) { mapEqClsCnt.insert( *sv_pos ); } else { (*temp_pos).second += (*sv_pos).second; } num_tuple += (*sv_pos).second; } } float emd = EMD( m_nTuples, num_tuple, m_vecSenId, m_mapSenDistn, mapEqClsCnt ); list<long>::const_iterator tpl_pos; for (i = 0; i < num_eqv; ++i) { const EqvClass& r_eqv = *rVecPtEqv[i]; for (tpl_pos = r_eqv.m_lstTplId.begin(); tpl_pos != r_eqv.m_lstTplId.end(); ++tpl_pos) { rVecRisk[*tpl_pos] = emd; } } return true; }
bool T_Closeness::Verify( const EqvClass& rEqvCls ) { long total = 0; map<UnitValue, long>::const_iterator sen_pos; for (sen_pos = rEqvCls.m_mapSenCnt.begin(); sen_pos != rEqvCls.m_mapSenCnt.end(); ++sen_pos) { total += (*sen_pos).second; } float emd = EMD( m_nTuples, rEqvCls.m_lstTplId.size(), m_vecSenId, m_mapSenDistn, rEqvCls.m_mapSenCnt ); if ( emd > m_fT ) { return false; } return true; }
//Perform statistical comparison int IMCSEngine::compare(const char* image_file2, double& result, int& result_type, int& message_len, char* message) { //Check if prepared successfully if (im_prepared == false) { message_len = snprintf(message, message_len, "Invalid prepared state: %d", im_prepared); return ST_INVALID_PARAMETERS; } //Read image file data image2 = imread(image_file2, CV_LOAD_IMAGE_COLOR); if (image2.empty() == true || image2.channels() != 3) { message_len = snprintf(message, message_len, "Invalid image file: %s", image_file2); return ST_INVALID_IMAGE; } //Reduce image colors if (im_reduce_factor >= RF_MIN) { colorReduce(image2, im_reduce_factor); } //Create image histogram calcHistBGR(image2, image_histo2, im_dim_size); #ifdef IMCS_DEBUG_TIMES double tStart = getTimingStart(); //Start timing #endif double identity = 0.0; //Used only in IM_COMP_INTERSECT switch (im_compare_method){ case COMP_CORREL: result = compareHist(image_histo1, image_histo2, CV_COMP_CORREL); //Comparison result (1 is perfect) result = (result > 0) ? result : 0; //Eliminate negative values result_type = RES_TYPE_PERCENT; break; case COMP_CHISQR: result = compareHist(image_histo1, image_histo2, CV_COMP_CHISQR); //Comparison result (0 is perfect) result_type = RES_TYPE_VALUE; break; case COMP_INTERSECT: identity = compareHist(image_histo1, image_histo1, CV_COMP_INTERSECT); //Calculate "identity" value for image1 histogram result = compareHist(image_histo1, image_histo2, CV_COMP_INTERSECT); //Comparison result (higher score is better match) result = (result / identity); //Express as identity fraction result_type = RES_TYPE_PERCENT; break; case COMP_BHATTACHARYYA: result = compareHist(image_histo1, image_histo2, CV_COMP_BHATTACHARYYA); //Comparison result (0 is perfect match) result = (1.0 - result); //Invert scale (1 is perfect) result_type = RES_TYPE_PERCENT; break; case COMP_EMD_L1: calcEMDSig(image_histo2, emd_sig2, im_dim_size); result = EMD(emd_sig1, emd_sig2, CV_DIST_L1); //Calculate distance (0 is perfect match) result_type = RES_TYPE_VALUE; break; case COMP_EMD_L2: calcEMDSig(image_histo2, emd_sig2, im_dim_size); result = EMD(emd_sig1, emd_sig2, CV_DIST_L2); //Calculate distance (0 is perfect match) result_type = RES_TYPE_VALUE; break; } #ifdef IMCS_DEBUG_TIMES double tElapsed = getTimingResult(tStart); //Get timing result printf("image_compare_stat() exec time: %fms\n", tElapsed); //Display timing results #endif //Info message on success if (result_type == RES_TYPE_PERCENT) { message_len = snprintf(message, message_len, "Result: %f%% for compare method: %d", (result * 100), im_compare_method); } else { message_len = snprintf(message, message_len, "Result: %f for compare method: %d", result, im_compare_method); } //Success return ST_OK; }