void resetImageData(SPImageData image){ if (image != NULL){ if (image->featuresArray != NULL){ freeFeatures(image->featuresArray, image->numOfFeatures); free(image->featuresArray); image->featuresArray = NULL; } image->numOfFeatures = 0; } else{ spLoggerSafePrintWarning(WARNING_IMAGES_DATA_NULL_ON_RESET, __FILE__,__FUNCTION__, __LINE__); } }
void freeImageData(SPImageData imageData, bool suppressFeaturesArrayWarning, bool freeInternalFeatures){ if (imageData != NULL){ if (imageData->featuresArray != NULL){ if (freeInternalFeatures) freeFeatures(imageData->featuresArray, imageData->numOfFeatures); free(imageData->featuresArray); imageData->featuresArray = NULL; } else if (!suppressFeaturesArrayWarning){ spLoggerSafePrintWarning(WARNING_IMAGE_DATA_POINTS_ARRAY_NULL, __FILE__,__FUNCTION__, __LINE__); } free(imageData); imageData = NULL; } else{ spLoggerSafePrintWarning(WARNING_IMAGE_DATA_NULL, __FILE__,__FUNCTION__, __LINE__); } }
Features word_features(enum part_of_speech pos, Track tr1, Track tr2, Track tr3, int lookahead, int raw, void *medoids, char **objects, int ol, int discard_bad_features, Flow **flows_movie, int fl_tt, Real scale, FeatureMedoid **fms, int mn){ /* For shorter code */ #define ONE_TRACK_FEATURES(type, tr) \ one_track_features(type, tr, lookahead, one_track_raw, medoids, objects, ol, \ discard_bad_features, flows_movie, fl_tt, scale, fms, mn) Features f = NULL, one_track_f1 = NULL, one_track_f2 = NULL; int i, t, tt; int one_track_raw = raw; Track tr, tr_; enum one_track_feature_type velocity_types[] = {FLOW_MAGNITUDE_IN_BOX, FLOW_ORIENTATION_IN_BOX}; /* At least one track is valid */ assert(tr1); tt = tr1->tt; if (tr2) assert(tt == tr2->tt); if (tr3) assert(tt == tr3->tt); assert(medoids == NULL); if (raw == 0) assert(fms); /* If discard_bad_features, we expect the feature length returned to be tt-(lookahead-1) */ tt = (discard_bad_features == 1)? tt-(lookahead-1): tt; switch(pos){ case NOUN: /* Feature for a noun is the model name Only the first track should be valid */ assert(tr2 == NULL && tr3 == NULL); one_track_raw = raw; f = ONE_TRACK_FEATURES(MODEL_NAME, tr1); break; case VERB: /* At least two tracks*/ assert(tr2); if (tr3 == NULL){ /* Features for a verb with two participants are: 1. agent velocity magnitude 2. agent velocity orientation 3. patient velocity magnitude 4. patient velocity orientation 5. agent-patient-x-distance 6. agent-patient-relative-box-area */ f = allocFeatures(tt, 6); // 1 - 4 for (i = 0; i < 4; i ++){ if (i < 2) tr = tr1; else tr = tr2; one_track_raw = raw; one_track_f1 = ONE_TRACK_FEATURES(velocity_types[i % 2], tr); for (t = 0; t < tt; t ++) f->v[t][i] = one_track_f1->v[t][0]; freeFeatures(one_track_f1); } // 5 one_track_raw = 1; one_track_f1 = ONE_TRACK_FEATURES(POSITION_X, tr1); one_track_f2 = ONE_TRACK_FEATURES(POSITION_X, tr2); for (t = 0; t < tt; t ++){ f->v[t][4] = DISTANCE_2D(one_track_f1->v[t][0], 0, one_track_f2->v[t][0], 0); if (raw == 0) f->v[t][4] = quantize(f->v[t][4], "x_distance", fms, mn); } freeFeatures(one_track_f1); freeFeatures(one_track_f2); // 6 one_track_raw = 1; one_track_f1 = ONE_TRACK_FEATURES(AREA, tr1); one_track_f2 = ONE_TRACK_FEATURES(AREA, tr2); for (t = 0; t < tt; t ++){ f->v[t][5] = one_track_f1->v[t][0] / one_track_f2->v[t][0]; if (raw == 0) f->v[t][5] = 1 - quantize(f->v[t][5], "box_ratio", fms, mn); } freeFeatures(one_track_f1); freeFeatures(one_track_f2); } else{ /* Features for a verb with three participants are: 1. agent velocity magnitude 2. agent velocity orientation 3. patient velocity magnitude 4. patient velocity orientation 5. goal velocity magnitude 6. goal velocity orientation 7. agent-patient-x-distance 8. agent-patient-y-distance 9. agent-patient-relative-box-area 10. agent-patient-overlap 11. agent-goal-x-distance 12. agent-goal-y-distance 13. agent-goal-relative-box-area 14. agent-goal-overlap 15. patient-goal-x-distance 16. patient-goal-y-distance 17. patient-goal-relative-box-area 18. patient-goal-overlap */ f = allocFeatures(tt, 18); // 1 - 6 for (i = 0; i < 6; i ++){ if (i < 2) tr = tr1; else if (i < 4) tr = tr2; else tr = tr3; one_track_raw = raw; one_track_f1 = ONE_TRACK_FEATURES(velocity_types[i % 2], tr); for (t = 0; t < tt; t ++) f->v[t][i] = one_track_f1->v[t][0]; freeFeatures(one_track_f1); } // 7 - 18 for (i = 6; i < 18; i += 4){ if (i < 10){ tr = tr1; tr_ = tr2; } else if (i < 14){ tr = tr1; tr_ = tr3; } else{ tr = tr2; tr_ = tr3; } /* x-distance */ one_track_raw = 1; one_track_f1 = ONE_TRACK_FEATURES(POSITION_X, tr); one_track_f2 = ONE_TRACK_FEATURES(POSITION_X, tr_); for (t = 0; t < tt; t ++){ f->v[t][i] = DISTANCE_2D(one_track_f1->v[t][0], 0, one_track_f2->v[t][0], 0); if (raw == 0) f->v[t][i] = quantize(f->v[t][i], "x_distance", fms, mn); } freeFeatures(one_track_f1); freeFeatures(one_track_f2); /* y-distance */ one_track_raw = 1; one_track_f1 = ONE_TRACK_FEATURES(POSITION_Y, tr); one_track_f2 = ONE_TRACK_FEATURES(POSITION_Y, tr_); for (t = 0; t < tt; t ++){ f->v[t][i+1] = DISTANCE_2D(0, one_track_f1->v[t][0], 0, one_track_f2->v[t][0]); if (raw == 0) f->v[t][i+1] = quantize(f->v[t][i+1], "y_distance", fms, mn); } freeFeatures(one_track_f1); freeFeatures(one_track_f2); /* relative-box-area */ one_track_raw = 1; one_track_f1 = ONE_TRACK_FEATURES(AREA, tr); one_track_f2 = ONE_TRACK_FEATURES(AREA, tr_); for (t = 0; t < tt; t ++){ f->v[t][i+2] = one_track_f1->v[t][0] / one_track_f2->v[t][0]; if (raw == 0) f->v[t][i+2] = 1 - quantize(f->v[t][i+2], "box_ratio", fms, mn); } freeFeatures(one_track_f1); freeFeatures(one_track_f2); /* overlap */ for (t = 0; t < tt; t ++){ f->v[t][i+3] = box_overlap_percentage(tr->ds[t], tr_->ds[t]); if (raw == 0) f->v[t][i+3] = quantize(f->v[t][i+3], "overlap", fms, mn); } } } break; case ADVERB: /* Features for an adverb is: agent velocity magnitude */ assert(tr2 == NULL && tr3 == NULL); one_track_raw = raw; f = ONE_TRACK_FEATURES(FLOW_MAGNITUDE_IN_BOX, tr1); break; case ADJECTIVE: /* Feature for an adjective is the color Only the first track should be valid */ assert(tr2 == NULL && tr3 == NULL); one_track_raw = raw; f = ONE_TRACK_FEATURES(MODEL_COLOR, tr1); break; case PREPOSITION: /* Feature for a preposition is the relative position of two objects:*/ assert(tr2 && tr3 == NULL); f = allocFeatures(tt, 1); one_track_raw = 1; one_track_f1 = ONE_TRACK_FEATURES(POSITION_X, tr1); one_track_f2 = ONE_TRACK_FEATURES(POSITION_X, tr2); for (t = 0; t < tt; t ++){ if (one_track_f1->v[t][0] < (one_track_f2->v[t][0] - 50)) f->v[t][0] = 0; else if (one_track_f1->v[t][0] > (one_track_f2->v[t][0] + 50)) f->v[t][0] = 1; else f->v[t][0] = 2; } freeFeatures(one_track_f1); freeFeatures(one_track_f2); break; case MOTION_PREPOSITION: /* Features for a motion_preposition are: 1. agent velocity 2. agent and location distance */ assert(tr2 && tr3 == NULL); f = allocFeatures(tt, 2); one_track_raw = raw; one_track_f1 = ONE_TRACK_FEATURES(FLOW_MAGNITUDE_IN_BOX, tr1); for (t = 0; t < tt; t ++) f->v[t][0] = one_track_f1->v[t][0]; freeFeatures(one_track_f1); one_track_raw = 1; one_track_f1 = ONE_TRACK_FEATURES(POSITION_X, tr1); one_track_f2 = ONE_TRACK_FEATURES(POSITION_X, tr2); for (t = 0; t < tt; t ++){ f->v[t][1] = DISTANCE_2D(one_track_f1->v[t][0], 0, one_track_f2->v[t][0], 0); if (raw == 0) f->v[t][1] = quantize(f->v[t][1], "x_distance", fms, mn); } freeFeatures(one_track_f1); freeFeatures(one_track_f2); break; default: panic("word_features: part of speech %d unrecognized", pos); } return f; }