mirror of
https://github.com/tesseract-ocr/tesseract.git
synced 2024-12-23 06:57:50 +08:00
Adding workflow order to table detector java debug output + adding final column and row calculation
This commit is contained in:
parent
95befed6b1
commit
46f16b8430
@ -265,14 +265,15 @@ void TableFinder::LocateTables(ColPartitionGrid* grid,
|
|||||||
|
|
||||||
#ifndef GRAPHICS_DISABLED
|
#ifndef GRAPHICS_DISABLED
|
||||||
if (textord_show_tables) {
|
if (textord_show_tables) {
|
||||||
ScrollView* table_win = MakeWindow(0, 300, "Column Partitions & Neighbors");
|
ScrollView* table_win = MakeWindow(0, 300,
|
||||||
|
"Step 1: Column Partitions & Neighbors");
|
||||||
DisplayColPartitions(table_win, &clean_part_grid_, ScrollView::BLUE);
|
DisplayColPartitions(table_win, &clean_part_grid_, ScrollView::BLUE);
|
||||||
DisplayColPartitions(table_win, &leader_and_ruling_grid_,
|
DisplayColPartitions(table_win, &leader_and_ruling_grid_,
|
||||||
ScrollView::AQUAMARINE);
|
ScrollView::AQUAMARINE);
|
||||||
DisplayColPartitionConnections(table_win, &clean_part_grid_,
|
DisplayColPartitionConnections(table_win, &clean_part_grid_,
|
||||||
ScrollView::ORANGE);
|
ScrollView::ORANGE);
|
||||||
|
|
||||||
table_win = MakeWindow(100, 300, "Fragmented Text");
|
table_win = MakeWindow(100, 300, "Step 2: Fragmented Text");
|
||||||
DisplayColPartitions(table_win, &fragmented_text_grid_, ScrollView::BLUE);
|
DisplayColPartitions(table_win, &fragmented_text_grid_, ScrollView::BLUE);
|
||||||
}
|
}
|
||||||
#endif // GRAPHICS_DISABLED
|
#endif // GRAPHICS_DISABLED
|
||||||
@ -307,7 +308,8 @@ void TableFinder::LocateTables(ColPartitionGrid* grid,
|
|||||||
|
|
||||||
#ifndef GRAPHICS_DISABLED
|
#ifndef GRAPHICS_DISABLED
|
||||||
if (textord_tablefind_show_mark) {
|
if (textord_tablefind_show_mark) {
|
||||||
ScrollView* table_win = MakeWindow(1200, 300, "Table Columns and Regions");
|
ScrollView* table_win = MakeWindow(1200, 300,
|
||||||
|
"Step 7: Table Columns and Regions");
|
||||||
DisplayColSegments(table_win, &table_columns, ScrollView::DARK_TURQUOISE);
|
DisplayColSegments(table_win, &table_columns, ScrollView::DARK_TURQUOISE);
|
||||||
DisplayColSegments(table_win, &table_regions, ScrollView::YELLOW);
|
DisplayColSegments(table_win, &table_regions, ScrollView::YELLOW);
|
||||||
}
|
}
|
||||||
@ -329,7 +331,8 @@ void TableFinder::LocateTables(ColPartitionGrid* grid,
|
|||||||
|
|
||||||
#ifndef GRAPHICS_DISABLED
|
#ifndef GRAPHICS_DISABLED
|
||||||
if (textord_show_tables) {
|
if (textord_show_tables) {
|
||||||
ScrollView* table_win = MakeWindow(1200, 300, "Detected Table Locations");
|
ScrollView* table_win = MakeWindow(1200, 300,
|
||||||
|
"Step 8: Detected Table Locations");
|
||||||
DisplayColPartitions(table_win, &clean_part_grid_, ScrollView::BLUE);
|
DisplayColPartitions(table_win, &clean_part_grid_, ScrollView::BLUE);
|
||||||
DisplayColSegments(table_win, &table_columns, ScrollView::KHAKI);
|
DisplayColSegments(table_win, &table_columns, ScrollView::KHAKI);
|
||||||
table_grid_.DisplayBoxes(table_win);
|
table_grid_.DisplayBoxes(table_win);
|
||||||
@ -343,7 +346,8 @@ void TableFinder::LocateTables(ColPartitionGrid* grid,
|
|||||||
|
|
||||||
#ifndef GRAPHICS_DISABLED
|
#ifndef GRAPHICS_DISABLED
|
||||||
if (textord_show_tables) {
|
if (textord_show_tables) {
|
||||||
ScrollView* table_win = MakeWindow(1400, 600, "Recognized Tables");
|
ScrollView* table_win = MakeWindow(1400, 600,
|
||||||
|
"Step 10: Recognized Tables");
|
||||||
DisplayColPartitions(table_win, &clean_part_grid_,
|
DisplayColPartitions(table_win, &clean_part_grid_,
|
||||||
ScrollView::BLUE, ScrollView::BLUE);
|
ScrollView::BLUE, ScrollView::BLUE);
|
||||||
table_grid_.DisplayBoxes(table_win);
|
table_grid_.DisplayBoxes(table_win);
|
||||||
@ -358,7 +362,7 @@ void TableFinder::LocateTables(ColPartitionGrid* grid,
|
|||||||
|
|
||||||
#ifndef GRAPHICS_DISABLED
|
#ifndef GRAPHICS_DISABLED
|
||||||
if (textord_show_tables) {
|
if (textord_show_tables) {
|
||||||
ScrollView* table_win = MakeWindow(1500, 300, "Detected Tables");
|
ScrollView* table_win = MakeWindow(1500, 300, "Step 11: Detected Tables");
|
||||||
DisplayColPartitions(table_win, &clean_part_grid_,
|
DisplayColPartitions(table_win, &clean_part_grid_,
|
||||||
ScrollView::BLUE, ScrollView::BLUE);
|
ScrollView::BLUE, ScrollView::BLUE);
|
||||||
table_grid_.DisplayBoxes(table_win);
|
table_grid_.DisplayBoxes(table_win);
|
||||||
@ -789,28 +793,32 @@ void TableFinder::FindNeighbors() {
|
|||||||
void TableFinder::MarkTablePartitions() {
|
void TableFinder::MarkTablePartitions() {
|
||||||
MarkPartitionsUsingLocalInformation();
|
MarkPartitionsUsingLocalInformation();
|
||||||
if (textord_tablefind_show_mark) {
|
if (textord_tablefind_show_mark) {
|
||||||
ScrollView* table_win = MakeWindow(300, 300, "Initial Table Partitions");
|
ScrollView* table_win = MakeWindow(300, 300,
|
||||||
|
"Step 3: Initial Table Partitions");
|
||||||
DisplayColPartitions(table_win, &clean_part_grid_, ScrollView::BLUE);
|
DisplayColPartitions(table_win, &clean_part_grid_, ScrollView::BLUE);
|
||||||
DisplayColPartitions(table_win, &leader_and_ruling_grid_,
|
DisplayColPartitions(table_win, &leader_and_ruling_grid_,
|
||||||
ScrollView::AQUAMARINE);
|
ScrollView::AQUAMARINE);
|
||||||
}
|
}
|
||||||
FilterFalseAlarms();
|
FilterFalseAlarms();
|
||||||
if (textord_tablefind_show_mark) {
|
if (textord_tablefind_show_mark) {
|
||||||
ScrollView* table_win = MakeWindow(600, 300, "Filtered Table Partitions");
|
ScrollView* table_win = MakeWindow(600, 300,
|
||||||
|
"Step 4: Filtered Table Partitions");
|
||||||
DisplayColPartitions(table_win, &clean_part_grid_, ScrollView::BLUE);
|
DisplayColPartitions(table_win, &clean_part_grid_, ScrollView::BLUE);
|
||||||
DisplayColPartitions(table_win, &leader_and_ruling_grid_,
|
DisplayColPartitions(table_win, &leader_and_ruling_grid_,
|
||||||
ScrollView::AQUAMARINE);
|
ScrollView::AQUAMARINE);
|
||||||
}
|
}
|
||||||
SmoothTablePartitionRuns();
|
SmoothTablePartitionRuns();
|
||||||
if (textord_tablefind_show_mark) {
|
if (textord_tablefind_show_mark) {
|
||||||
ScrollView* table_win = MakeWindow(900, 300, "Smoothed Table Partitions");
|
ScrollView* table_win = MakeWindow(900, 300,
|
||||||
|
"Step 5: Smoothed Table Partitions");
|
||||||
DisplayColPartitions(table_win, &clean_part_grid_, ScrollView::BLUE);
|
DisplayColPartitions(table_win, &clean_part_grid_, ScrollView::BLUE);
|
||||||
DisplayColPartitions(table_win, &leader_and_ruling_grid_,
|
DisplayColPartitions(table_win, &leader_and_ruling_grid_,
|
||||||
ScrollView::AQUAMARINE);
|
ScrollView::AQUAMARINE);
|
||||||
}
|
}
|
||||||
FilterFalseAlarms();
|
FilterFalseAlarms();
|
||||||
if (textord_tablefind_show_mark || textord_show_tables) {
|
if (textord_tablefind_show_mark || textord_show_tables) {
|
||||||
ScrollView* table_win = MakeWindow(900, 300, "Final Table Partitions");
|
ScrollView* table_win = MakeWindow(900, 300,
|
||||||
|
"Step 6: Final Table Partitions");
|
||||||
DisplayColPartitions(table_win, &clean_part_grid_, ScrollView::BLUE);
|
DisplayColPartitions(table_win, &clean_part_grid_, ScrollView::BLUE);
|
||||||
DisplayColPartitions(table_win, &leader_and_ruling_grid_,
|
DisplayColPartitions(table_win, &leader_and_ruling_grid_,
|
||||||
ScrollView::AQUAMARINE);
|
ScrollView::AQUAMARINE);
|
||||||
@ -1815,13 +1823,13 @@ bool TableFinder::GapInXProjection(int* xprojection, int length) {
|
|||||||
// (rejected before)
|
// (rejected before)
|
||||||
// Overall, this just needs some more work.
|
// Overall, this just needs some more work.
|
||||||
void TableFinder::RecognizeTables() {
|
void TableFinder::RecognizeTables() {
|
||||||
ScrollView* table_win = nullptr;
|
// ScrollView* table_win = nullptr;
|
||||||
if (textord_show_tables) {
|
// if (textord_show_tables) {
|
||||||
table_win = MakeWindow(0, 0, "Table Structure");
|
// table_win = MakeWindow(0, 0, "Step 9: Table Structure");
|
||||||
DisplayColPartitions(table_win, &fragmented_text_grid_,
|
// DisplayColPartitions(table_win, &fragmented_text_grid_,
|
||||||
ScrollView::BLUE, ScrollView::LIGHT_BLUE);
|
// ScrollView::BLUE, ScrollView::LIGHT_BLUE);
|
||||||
// table_grid_.DisplayBoxes(table_win);
|
// // table_grid_.DisplayBoxes(table_win);
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
|
||||||
TableRecognizer recognizer;
|
TableRecognizer recognizer;
|
||||||
@ -1849,9 +1857,9 @@ void TableFinder::RecognizeTables() {
|
|||||||
// Process a table. Good tables are inserted into the grid again later on
|
// Process a table. Good tables are inserted into the grid again later on
|
||||||
// We can't change boxes in the grid while it is running a search.
|
// We can't change boxes in the grid while it is running a search.
|
||||||
if (table_structure != nullptr) {
|
if (table_structure != nullptr) {
|
||||||
if (textord_show_tables) {
|
// if (textord_show_tables) {
|
||||||
table_structure->Display(table_win, ScrollView::LIME_GREEN);
|
// table_structure->Display(table_win, ScrollView::LIME_GREEN);
|
||||||
}
|
// }
|
||||||
found_table->set_bounding_box(table_structure->bounding_box());
|
found_table->set_bounding_box(table_structure->bounding_box());
|
||||||
delete table_structure;
|
delete table_structure;
|
||||||
good_it.add_after_then_move(found_table);
|
good_it.add_after_then_move(found_table);
|
||||||
@ -1997,6 +2005,25 @@ void TableFinder::DisplayColPartitionConnections(
|
|||||||
void TableFinder::MakeTableBlocks(ColPartitionGrid* grid,
|
void TableFinder::MakeTableBlocks(ColPartitionGrid* grid,
|
||||||
ColPartitionSet** all_columns,
|
ColPartitionSet** all_columns,
|
||||||
WidthCallback width_cb) {
|
WidthCallback width_cb) {
|
||||||
|
#ifndef GRAPHICS_DISABLED
|
||||||
|
ScrollView* table_win = nullptr;
|
||||||
|
if (textord_show_tables) {
|
||||||
|
table_win = MakeWindow(0, 0, "Step 12: Final tables");
|
||||||
|
DisplayColPartitions(table_win, &fragmented_text_grid_,
|
||||||
|
ScrollView::BLUE, ScrollView::LIGHT_BLUE);
|
||||||
|
}
|
||||||
|
#endif // GRAPHICS_DISABLED
|
||||||
|
|
||||||
|
// initializing recognizer in order to extract table row and columnd info
|
||||||
|
TableRecognizer recognizer;
|
||||||
|
{
|
||||||
|
recognizer.Init();
|
||||||
|
recognizer.set_line_grid(&leader_and_ruling_grid_);
|
||||||
|
recognizer.set_text_grid(&fragmented_text_grid_);
|
||||||
|
recognizer.set_max_text_height(global_median_xheight_ * 2.0);
|
||||||
|
recognizer.set_min_height(1.5 * gridheight());
|
||||||
|
}
|
||||||
|
|
||||||
// Since we have table blocks already, remove table tags from all
|
// Since we have table blocks already, remove table tags from all
|
||||||
// colpartitions
|
// colpartitions
|
||||||
GridSearch<ColPartition, ColPartition_CLIST, ColPartition_C_IT>
|
GridSearch<ColPartition, ColPartition_CLIST, ColPartition_C_IT>
|
||||||
@ -2053,8 +2080,26 @@ void TableFinder::MakeTableBlocks(ColPartitionGrid* grid,
|
|||||||
table_partition->set_flow(BTFT_CHAIN);
|
table_partition->set_flow(BTFT_CHAIN);
|
||||||
table_partition->SetBlobTypes();
|
table_partition->SetBlobTypes();
|
||||||
grid->InsertBBox(true, true, table_partition);
|
grid->InsertBBox(true, true, table_partition);
|
||||||
|
|
||||||
|
// Insert table columns and rows into an api accessible object
|
||||||
|
StructuredTable* table_structure = recognizer.RecognizeTable(table_box);
|
||||||
|
if (table_structure != nullptr) {
|
||||||
|
#ifndef GRAPHICS_DISABLED
|
||||||
|
if (textord_show_tables) {
|
||||||
|
table_structure->Display(table_win, ScrollView::LIME_GREEN);
|
||||||
|
}
|
||||||
|
#endif // GRAPHICS_DISABLED
|
||||||
|
|
||||||
|
delete table_structure;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef GRAPHICS_DISABLED
|
||||||
|
if (textord_show_tables) {
|
||||||
|
table_grid_.DisplayBoxes(table_win);
|
||||||
|
}
|
||||||
|
#endif // GRAPHICS_DISABLED
|
||||||
}
|
}
|
||||||
|
|
||||||
//////// ColSegment code
|
//////// ColSegment code
|
||||||
|
Loading…
Reference in New Issue
Block a user