| /////////////////////////////////////////////////////////////////////// |
| // File: linefind.h |
| // Description: Class to find vertical lines in an image and create |
| // a corresponding list of empty blobs. |
| // Author: Ray Smith |
| // Created: Thu Mar 20 09:49:01 PDT 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. |
| // |
| /////////////////////////////////////////////////////////////////////// |
| |
| #ifndef TESSERACT_TEXTORD_LINEFIND_H__ |
| #define TESSERACT_TEXTORD_LINEFIND_H__ |
| |
| struct Pix; |
| struct Boxa; |
| class C_BLOB_LIST; |
| class BLOBNBOX_LIST; |
| class ICOORD; |
| |
| namespace tesseract { |
| |
| class TabVector_LIST; |
| |
| // The LineFinder class is a simple static function wrapper class that mainly |
| // exposes the FindVerticalLines function. |
| class LineFinder { |
| public: |
| // Finds vertical line objects in the given pix. |
| // Uses the given resolution to determine size thresholds instead of any |
| // that may be present in the pix. |
| // The output vertical_x and vertical_y contain a sum of the output vectors, |
| // thereby giving the mean vertical direction. |
| // The output vectors are owned by the list and Frozen (cannot refit) by |
| // having no boxes, as there is no need to refit or merge separator lines. |
| static void FindVerticalLines(int resolution, Pix* pix, |
| int* vertical_x, int* vertical_y, |
| TabVector_LIST* vectors); |
| |
| // Finds horizontal line objects in the given pix. |
| // Uses the given resolution to determine size thresholds instead of any |
| // that may be present in the pix. |
| // The output vectors are owned by the list and Frozen (cannot refit) by |
| // having no boxes, as there is no need to refit or merge separator lines. |
| static void FindHorizontalLines(int resolution, Pix* pix, |
| TabVector_LIST* vectors); |
| |
| // Converts the Boxa array to a list of C_BLOB, getting rid of severely |
| // overlapping outlines and those that are children of a bigger one. |
| // The output is a list of C_BLOBs that are owned by the list. |
| // The C_OUTLINEs in the C_BLOBs contain no outline data - just empty |
| // bounding boxes. The Boxa is consumed and destroyed. |
| static void ConvertBoxaToBlobs(int image_width, int image_height, |
| Boxa** boxes, C_BLOB_LIST* blobs); |
| |
| private: |
| // Finds vertical lines in the given list of BLOBNBOXes. bleft and tright |
| // are the bounds of the image on which the input line_bblobs were found. |
| // The input line_bblobs list is const really. |
| // The output vertical_x and vertical_y are the total of all the vectors. |
| // The output list of TabVector makes no reference to the input BLOBNBOXes. |
| static void FindLineVectors(const ICOORD& bleft, const ICOORD& tright, |
| BLOBNBOX_LIST* line_bblobs, |
| int* vertical_x, int* vertical_y, |
| TabVector_LIST* vectors); |
| |
| // Get a set of bounding boxes of possible vertical lines in the image. |
| // The input resolution overrides any resolution set in src_pix. |
| // The output line_pix contains just all the detected lines. |
| static Boxa* GetVLineBoxes(int resolution, Pix* src_pix, Pix** line_pix); |
| |
| // Get a set of bounding boxes of possible horizontal lines in the image. |
| // The input resolution overrides any resolution set in src_pix. |
| // The output line_pix contains just all the detected lines. |
| // The output boxes undergo the transformation (x,y)->(height-y,x) so the |
| // lines can be found with a vertical line finder afterwards. |
| // This transformation allows a simple x/y flip to reverse it in tesseract |
| // coordinates and it is faster to flip the lines than rotate the image. |
| static Boxa* GetHLineBoxes(int resolution, Pix* src_pix, Pix** line_pix); |
| }; |
| |
| } // namespace tesseract. |
| |
| #endif // TESSERACT_TEXTORD_LINEFIND_H__ |
| |