mirror of
https://github.com/tesseract-ocr/tesseract.git
synced 2024-12-23 23:17:49 +08:00
85 lines
2.7 KiB
C
85 lines
2.7 KiB
C
|
/**********************************************************************
|
||
|
* File: search_column.h
|
||
|
* Description: Declaration of the Beam Search Column Class
|
||
|
* Author: Ahmad Abdulkader
|
||
|
* Created: 2008
|
||
|
*
|
||
|
* (C) Copyright 2008, Google Inc.
|
||
|
** Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
** you may not use this file except in compliance with the License.
|
||
|
** You may obtain a copy of the License at
|
||
|
** http://www.apache.org/licenses/LICENSE-2.0
|
||
|
** Unless required by applicable law or agreed to in writing, software
|
||
|
** distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
** See the License for the specific language governing permissions and
|
||
|
** limitations under the License.
|
||
|
*
|
||
|
**********************************************************************/
|
||
|
|
||
|
// The SearchColumn class abstracts a column in the lattice that is created
|
||
|
// by the BeamSearch during the recognition process
|
||
|
// The class holds the lattice nodes. New nodes are added by calls to AddNode
|
||
|
// made from the BeamSearch
|
||
|
// The class maintains a hash table of the nodes to be able to lookup nodes
|
||
|
// quickly using their lang_mod_edge. This is needed to merge similar paths
|
||
|
// in the lattice
|
||
|
|
||
|
#ifndef SEARCH_COLUMN_H
|
||
|
#define SEARCH_COLUMN_H
|
||
|
|
||
|
#include "search_node.h"
|
||
|
#include "lang_mod_edge.h"
|
||
|
#include "cube_reco_context.h"
|
||
|
|
||
|
namespace tesseract {
|
||
|
|
||
|
class SearchColumn {
|
||
|
public:
|
||
|
SearchColumn(int col_idx, int max_node_cnt);
|
||
|
~SearchColumn();
|
||
|
// Accessor functions
|
||
|
inline int ColIdx() const { return col_idx_; }
|
||
|
inline int NodeCount() const { return node_cnt_; }
|
||
|
inline SearchNode **Nodes() const { return node_array_; }
|
||
|
|
||
|
// Prune the nodes if necessary. Pruning is done such that a max
|
||
|
// number of nodes is kept, i.e., the beam width
|
||
|
void Prune();
|
||
|
SearchNode *AddNode(LangModEdge *edge, int score,
|
||
|
SearchNode *parent, CubeRecoContext *cntxt);
|
||
|
// Returns the node with the least cost
|
||
|
SearchNode *BestNode();
|
||
|
// Sort the lattice nodes. Needed for visualization
|
||
|
void Sort();
|
||
|
// Free up the Hash Table. Added to be called by the Beam Search after
|
||
|
// a column is pruned to reduce memory foot print
|
||
|
void FreeHashTable() {
|
||
|
if (node_hash_table_ != NULL) {
|
||
|
delete node_hash_table_;
|
||
|
node_hash_table_ = NULL;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private:
|
||
|
static const int kNodeAllocChunk = 1024;
|
||
|
static const int kScoreBins = 1024;
|
||
|
bool init_;
|
||
|
int min_cost_;
|
||
|
int max_cost_;
|
||
|
int max_node_cnt_;
|
||
|
int node_cnt_;
|
||
|
int col_idx_;
|
||
|
int score_bins_[kScoreBins];
|
||
|
SearchNode **node_array_;
|
||
|
SearchNodeHashTable *node_hash_table_;
|
||
|
|
||
|
// Free node array and hash table
|
||
|
void Cleanup();
|
||
|
// Create hash table
|
||
|
bool Init();
|
||
|
};
|
||
|
}
|
||
|
|
||
|
#endif // SEARCH_COLUMN_H
|