BLOB_CHOICE_LIST *Wordrec::classify_piece(TBLOB *pieces, const DENORM& denorm, SEAMS seams, inT16 start, inT16 end, BlamerBundle *blamer_bundle) { BLOB_CHOICE_LIST *choices; TBLOB *blob; inT16 x; join_pieces(pieces, seams, start, end); for (blob = pieces, x = 0; x < start; x++) { blob = blob->next; } choices = classify_blob(blob, denorm, "pieces:", White, blamer_bundle); break_pieces(blob, seams, start, end); #ifndef GRAPHICS_DISABLED if (wordrec_display_segmentations > 2) { STATE current_state; SEARCH_STATE chunk_groups; set_n_ones (¤t_state, array_count(seams)); chunk_groups = bin_to_chunks(¤t_state, array_count(seams)); display_segmentation(pieces, chunk_groups); window_wait(segm_window); memfree(chunk_groups); } #endif return (choices); }
BLOB_CHOICE_LIST *Wordrec::classify_piece(TBLOB *pieces, SEAMS seams, inT16 start, inT16 end) { STATE current_state; BLOB_CHOICE_LIST *choices; TBLOB *pblob; TBLOB *blob; TBLOB *nblob; inT16 x; SEARCH_STATE chunk_groups; set_n_ones (¤t_state, array_count (seams)); join_pieces(pieces, seams, start, end); for (blob = pieces, pblob = NULL, x = 0; x < start; x++) { pblob = blob; blob = blob->next; } for (nblob = blob->next; x < end; x++) nblob = nblob->next; choices = classify_blob (pblob, blob, nblob, NULL, "pieces:", White); break_pieces(blob, seams, start, end); #ifndef GRAPHICS_DISABLED if (wordrec_display_segmentations > 2) { chunk_groups = bin_to_chunks (¤t_state, array_count (seams)); display_segmentation(pieces, chunk_groups); window_wait(segm_window); memfree(chunk_groups); } #endif return (choices); }
BLOB_CHOICE_LIST *Wordrec::classify_piece(const GenericVector<SEAM*>& seams, inT16 start, inT16 end, const char* description, TWERD *word, BlamerBundle *blamer_bundle) { if (end > start) join_pieces(seams, start, end, word); BLOB_CHOICE_LIST *choices = classify_blob(word->blobs[start], description, White, blamer_bundle); // Set the matrix_cell_ entries in all the BLOB_CHOICES. BLOB_CHOICE_IT bc_it(choices); for (bc_it.mark_cycle_pt(); !bc_it.cycled_list(); bc_it.forward()) { bc_it.data()->set_matrix_cell(start, end); } if (end > start) break_pieces(seams, start, end, word); return (choices); }
// Creates a joined copy of the blobs between x and y (inclusive) and // inserts as the first blob at word->rebuild_word->blobs. // Returns a deep copy of the classifier results for the blob. BLOB_CHOICE_LIST *Wordrec::join_blobs_and_classify( WERD_RES* word, int x, int y, int choice_index, MATRIX *ratings, BLOB_CHOICE_LIST_VECTOR *old_choices) { // Join parts to make the blob if needed. if (x != y) join_pieces(word->chopped_word->blobs, word->seam_array, x, y); TBLOB *blob = word->chopped_word->blobs; for (int i = 0; i < x; i++) { blob = blob->next; } // Deep copy this blob into the output word. TBLOB* copy_blob = new TBLOB(*blob); copy_blob->next = word->rebuild_word->blobs; word->rebuild_word->blobs = copy_blob; BLOB_CHOICE_LIST *choices = NULL; // First check to see if we can look up the classificaiton // in old_choices (if there is no need to merge blobs). if (choice_index >= 0 && old_choices != NULL) { choices = old_choices->get(choice_index); old_choices->set(NULL, choice_index); } // The ratings matrix filled in by the associator will contain the next most // up-to-date classification info. Thus we look up the classification there // next, and only call classify_blob() if the classification is not found. if (choices == NULL && ratings != NULL) { choices = ratings->get(x, y); if (choices != NOT_CLASSIFIED) { ratings->put(x, y, NULL); } } // Get the choices for the blob by classification if necessary. if (choices == NULL) { choices = classify_blob(blob, word->denorm, "rebuild", Orange, word->blamer_bundle); } // Undo join_pieces to restore the chopped word to its fully chopped state. if (x != y) break_pieces(blob, word->seam_array, x, y); return choices; }
/********************************************************************** * classify_piece * * Create a larger piece from a collection of smaller ones. Classify * it and return the results. Take the large piece apart to leave * the collection of small pieces un modified. **********************************************************************/ CHOICES classify_piece(TBLOB *pieces, SEAMS seams, INT16 start, INT16 end, INT32 fx, STATE *this_state, STATE *best_state, INT32 pass, INT32 blob_index) { STATE current_state; CHOICES choices; TBLOB *pblob; TBLOB *blob; TBLOB *nblob; INT16 x; SEARCH_STATE chunk_groups; set_n_ones (¤t_state, array_count (seams)); join_pieces(pieces, seams, start, end); for (blob = pieces, pblob = NULL, x = 0; x < start; x++) { pblob = blob; blob = blob->next; } for (nblob = blob->next; x < end; x++) nblob = nblob->next; choices = classify_blob (pblob, blob, nblob, NULL, fx, "pieces:", White, this_state, best_state, pass, blob_index); break_pieces(blob, seams, start, end); #ifndef GRAPHICS_DISABLED if (display_segmentations > 2) { chunk_groups = bin_to_chunks (¤t_state, array_count (seams)); display_segmentation(pieces, chunk_groups); window_wait(segm_window); memfree(chunk_groups); } #endif return (choices); }