// Returns an Imagedata containing the image of the given box, // and ground truth boxes/truth text if available in the input. // The image is not normalized in any way. ImageData* Tesseract::GetLineData(const TBOX& line_box, const GenericVector<TBOX>& boxes, const GenericVector<STRING>& texts, int start_box, int end_box, const BLOCK& block) { TBOX revised_box; ImageData* image_data = GetRectImage(line_box, block, kImagePadding, &revised_box); if (image_data == NULL) return NULL; image_data->set_page_number(applybox_page); // Copy the boxes and shift them so they are relative to the image. FCOORD block_rotation(block.re_rotation().x(), -block.re_rotation().y()); ICOORD shift = -revised_box.botleft(); GenericVector<TBOX> line_boxes; GenericVector<STRING> line_texts; for (int b = start_box; b < end_box; ++b) { TBOX box = boxes[b]; box.rotate(block_rotation); box.move(shift); line_boxes.push_back(box); line_texts.push_back(texts[b]); } GenericVector<int> page_numbers; page_numbers.init_to_size(line_boxes.size(), applybox_page); image_data->AddBoxes(line_boxes, line_texts, page_numbers); return image_data; }
// Recognizes a word or group of words, converting to WERD_RES in *words. // Analogous to classify_word_pass1, but can handle a group of words as well. void Tesseract::LSTMRecognizeWord(const BLOCK& block, ROW *row, WERD_RES *word, PointerVector<WERD_RES>* words) { TBOX word_box = word->word->bounding_box(); // Get the word image - no frills. if (tessedit_pageseg_mode == PSM_SINGLE_WORD || tessedit_pageseg_mode == PSM_RAW_LINE) { // In single word mode, use the whole image without any other row/word // interpretation. word_box = TBOX(0, 0, ImageWidth(), ImageHeight()); } else { float baseline = row->base_line((word_box.left() + word_box.right()) / 2); if (baseline + row->descenders() < word_box.bottom()) word_box.set_bottom(baseline + row->descenders()); if (baseline + row->x_height() + row->ascenders() > word_box.top()) word_box.set_top(baseline + row->x_height() + row->ascenders()); } ImageData* im_data = GetRectImage(word_box, block, kImagePadding, &word_box); if (im_data == NULL) return; lstm_recognizer_->RecognizeLine(*im_data, true, classify_debug_level > 0, kWorstDictCertainty / kCertaintyScale, lstm_use_matrix, &unicharset, word_box, 2.0, false, words); delete im_data; SearchWords(words); }
IplImage* LPRotateFromRect(const IplImage* src_lpr,CvRect rect,int color) { double angle; IplImage* src,*gray,*bw,*dst; gray = cvCreateImage(cvSize(rect.width,rect.height),IPL_DEPTH_8U,1); bw = cvCreateImage(cvSize(rect.width,rect.height),IPL_DEPTH_8U,1); dst = cvCreateImage(cvSize(rect.width,rect.height),src_lpr->depth,src_lpr->nChannels); src = GetRectImage(src_lpr,rect); cvConvertImage(src,gray,CV_BGR2GRAY); AdjustContrast(gray,gray,100); ThresholdPartIter(gray,bw,color,3); // cvShowImage("img_bw",bw); cvWaitKey(0); angle = img_rotate_angle(src); rotate_img(src,dst,angle); cvReleaseImage(&src); cvReleaseImage(&gray); cvReleaseImage(&bw); return dst; }