mirror of
https://github.com/qurator-spk/eynollah.git
synced 2025-10-15 19:09:58 +02:00
writer: simplify
- simplify serialization of coordinates - re-use `serialize_lines_in_region` (drop `*_in_dropcapital` and `*_in_marginal`) - re-use `calculate_polygon_coords`
This commit is contained in:
parent
d88ca18eec
commit
e32479765c
1 changed files with 131 additions and 212 deletions
|
@ -56,113 +56,30 @@ class EynollahXmlWriter():
|
||||||
points_page_print = points_page_print + ' '
|
points_page_print = points_page_print + ' '
|
||||||
return points_page_print[:-1]
|
return points_page_print[:-1]
|
||||||
|
|
||||||
def serialize_lines_in_marginal(self, marginal_region, all_found_textline_polygons_marginals, marginal_idx, page_coord, all_box_coord_marginals, slopes_marginals, counter, ocr_all_textlines_textregion):
|
|
||||||
for j in range(len(all_found_textline_polygons_marginals[marginal_idx])):
|
|
||||||
coords = CoordsType()
|
|
||||||
textline = TextLineType(id=counter.next_line_id, Coords=coords)
|
|
||||||
if ocr_all_textlines_textregion:
|
|
||||||
textline.set_TextEquiv( [ TextEquivType(Unicode=ocr_all_textlines_textregion[j]) ] )
|
|
||||||
marginal_region.add_TextLine(textline)
|
|
||||||
marginal_region.set_orientation(-slopes_marginals[marginal_idx])
|
|
||||||
points_co = ''
|
|
||||||
for l in range(len(all_found_textline_polygons_marginals[marginal_idx][j])):
|
|
||||||
if not (self.curved_line or self.textline_light):
|
|
||||||
if len(all_found_textline_polygons_marginals[marginal_idx][j][l]) == 2:
|
|
||||||
textline_x_coord = max(0, int((all_found_textline_polygons_marginals[marginal_idx][j][l][0] + all_box_coord_marginals[marginal_idx][2] + page_coord[2]) / self.scale_x) )
|
|
||||||
textline_y_coord = max(0, int((all_found_textline_polygons_marginals[marginal_idx][j][l][1] + all_box_coord_marginals[marginal_idx][0] + page_coord[0]) / self.scale_y) )
|
|
||||||
else:
|
|
||||||
textline_x_coord = max(0, int((all_found_textline_polygons_marginals[marginal_idx][j][l][0][0] + all_box_coord_marginals[marginal_idx][2] + page_coord[2]) / self.scale_x) )
|
|
||||||
textline_y_coord = max(0, int((all_found_textline_polygons_marginals[marginal_idx][j][l][0][1] + all_box_coord_marginals[marginal_idx][0] + page_coord[0]) / self.scale_y) )
|
|
||||||
points_co += str(textline_x_coord)
|
|
||||||
points_co += ','
|
|
||||||
points_co += str(textline_y_coord)
|
|
||||||
if (self.curved_line or self.textline_light) and np.abs(slopes_marginals[marginal_idx]) <= 45:
|
|
||||||
if len(all_found_textline_polygons_marginals[marginal_idx][j][l]) == 2:
|
|
||||||
points_co += str(int((all_found_textline_polygons_marginals[marginal_idx][j][l][0] + page_coord[2]) / self.scale_x))
|
|
||||||
points_co += ','
|
|
||||||
points_co += str(int((all_found_textline_polygons_marginals[marginal_idx][j][l][1] + page_coord[0]) / self.scale_y))
|
|
||||||
else:
|
|
||||||
points_co += str(int((all_found_textline_polygons_marginals[marginal_idx][j][l][0][0] + page_coord[2]) / self.scale_x))
|
|
||||||
points_co += ','
|
|
||||||
points_co += str(int((all_found_textline_polygons_marginals[marginal_idx][j][l][0][1] + page_coord[0]) / self.scale_y))
|
|
||||||
|
|
||||||
elif (self.curved_line or self.textline_light) and np.abs(slopes_marginals[marginal_idx]) > 45:
|
|
||||||
if len(all_found_textline_polygons_marginals[marginal_idx][j][l]) == 2:
|
|
||||||
points_co += str(int((all_found_textline_polygons_marginals[marginal_idx][j][l][0] + all_box_coord_marginals[marginal_idx][2] + page_coord[2]) / self.scale_x))
|
|
||||||
points_co += ','
|
|
||||||
points_co += str(int((all_found_textline_polygons_marginals[marginal_idx][j][l][1] + all_box_coord_marginals[marginal_idx][0] + page_coord[0]) / self.scale_y))
|
|
||||||
else:
|
|
||||||
points_co += str(int((all_found_textline_polygons_marginals[marginal_idx][j][l][0][0] + all_box_coord_marginals[marginal_idx][2] + page_coord[2]) / self.scale_x))
|
|
||||||
points_co += ','
|
|
||||||
points_co += str(int((all_found_textline_polygons_marginals[marginal_idx][j][l][0][1] + all_box_coord_marginals[marginal_idx][0] + page_coord[0]) / self.scale_y))
|
|
||||||
points_co += ' '
|
|
||||||
coords.set_points(points_co[:-1])
|
|
||||||
|
|
||||||
def serialize_lines_in_region(self, text_region, all_found_textline_polygons, region_idx, page_coord, all_box_coord, slopes, counter, ocr_all_textlines_textregion):
|
def serialize_lines_in_region(self, text_region, all_found_textline_polygons, region_idx, page_coord, all_box_coord, slopes, counter, ocr_all_textlines_textregion):
|
||||||
self.logger.debug('enter serialize_lines_in_region')
|
self.logger.debug('enter serialize_lines_in_region')
|
||||||
for j in range(len(all_found_textline_polygons[region_idx])):
|
for j, polygon_textline in enumerate(all_found_textline_polygons[region_idx]):
|
||||||
coords = CoordsType()
|
coords = CoordsType()
|
||||||
textline = TextLineType(id=counter.next_line_id, Coords=coords)
|
textline = TextLineType(id=counter.next_line_id, Coords=coords)
|
||||||
if ocr_all_textlines_textregion:
|
if ocr_all_textlines_textregion:
|
||||||
|
# FIXME: add OCR confidence
|
||||||
textline.set_TextEquiv([TextEquivType(Unicode=ocr_all_textlines_textregion[j])])
|
textline.set_TextEquiv([TextEquivType(Unicode=ocr_all_textlines_textregion[j])])
|
||||||
text_region.add_TextLine(textline)
|
text_region.add_TextLine(textline)
|
||||||
text_region.set_orientation(-slopes[region_idx])
|
text_region.set_orientation(-slopes[region_idx])
|
||||||
region_bboxes = all_box_coord[region_idx]
|
region_bboxes = all_box_coord[region_idx]
|
||||||
points_co = ''
|
points_co = ''
|
||||||
for idx_contour_textline, contour_textline in enumerate(all_found_textline_polygons[region_idx][j]):
|
for point in polygon_textline:
|
||||||
if not (self.curved_line or self.textline_light):
|
if len(point) != 2:
|
||||||
if len(contour_textline) == 2:
|
point = point[0]
|
||||||
textline_x_coord = max(0, int((contour_textline[0] + region_bboxes[2] + page_coord[2]) / self.scale_x))
|
point_x = point[0] + page_coord[2]
|
||||||
textline_y_coord = max(0, int((contour_textline[1] + region_bboxes[0] + page_coord[0]) / self.scale_y))
|
point_y = point[1] + page_coord[0]
|
||||||
else:
|
# FIXME: or actually... not self.textline_light and not self.curved_line or np.abs(slopes[region_idx]) > 45?
|
||||||
textline_x_coord = max(0, int((contour_textline[0][0] + region_bboxes[2] + page_coord[2]) / self.scale_x))
|
if not self.textline_light and not (self.curved_line and np.abs(slopes[region_idx]) <= 45):
|
||||||
textline_y_coord = max(0, int((contour_textline[0][1] + region_bboxes[0] + page_coord[0]) / self.scale_y))
|
point_x += region_bboxes[2]
|
||||||
points_co += str(textline_x_coord)
|
point_y += region_bboxes[0]
|
||||||
points_co += ','
|
point_x = max(0, int(point_x / self.scale_x))
|
||||||
points_co += str(textline_y_coord)
|
point_y = max(0, int(point_y / self.scale_y))
|
||||||
|
points_co += str(point_x) + ',' + str(point_y) + ' '
|
||||||
if self.textline_light or (self.curved_line and np.abs(slopes[region_idx]) <= 45):
|
|
||||||
if len(contour_textline) == 2:
|
|
||||||
points_co += str(int((contour_textline[0] + page_coord[2]) / self.scale_x))
|
|
||||||
points_co += ','
|
|
||||||
points_co += str(int((contour_textline[1] + page_coord[0]) / self.scale_y))
|
|
||||||
else:
|
|
||||||
points_co += str(int((contour_textline[0][0] + page_coord[2]) / self.scale_x))
|
|
||||||
points_co += ','
|
|
||||||
points_co += str(int((contour_textline[0][1] + page_coord[0])/self.scale_y))
|
|
||||||
elif self.curved_line and np.abs(slopes[region_idx]) > 45:
|
|
||||||
if len(contour_textline)==2:
|
|
||||||
points_co += str(int((contour_textline[0] + region_bboxes[2] + page_coord[2])/self.scale_x))
|
|
||||||
points_co += ','
|
|
||||||
points_co += str(int((contour_textline[1] + region_bboxes[0] + page_coord[0])/self.scale_y))
|
|
||||||
else:
|
|
||||||
points_co += str(int((contour_textline[0][0] + region_bboxes[2]+page_coord[2])/self.scale_x))
|
|
||||||
points_co += ','
|
|
||||||
points_co += str(int((contour_textline[0][1] + region_bboxes[0]+page_coord[0])/self.scale_y))
|
|
||||||
points_co += ' '
|
|
||||||
coords.set_points(points_co[:-1])
|
|
||||||
|
|
||||||
def serialize_lines_in_dropcapital(self, text_region, all_found_textline_polygons, region_idx, page_coord, all_box_coord, slopes, counter, ocr_all_textlines_textregion):
|
|
||||||
self.logger.debug('enter serialize_lines_in_region')
|
|
||||||
for j in range(1):
|
|
||||||
coords = CoordsType()
|
|
||||||
textline = TextLineType(id=counter.next_line_id, Coords=coords)
|
|
||||||
if ocr_all_textlines_textregion:
|
|
||||||
textline.set_TextEquiv( [ TextEquivType(Unicode=ocr_all_textlines_textregion[j]) ] )
|
|
||||||
text_region.add_TextLine(textline)
|
|
||||||
#region_bboxes = all_box_coord[region_idx]
|
|
||||||
points_co = ''
|
|
||||||
for idx_contour_textline, contour_textline in enumerate(all_found_textline_polygons[j]):
|
|
||||||
if len(contour_textline) == 2:
|
|
||||||
points_co += str(int((contour_textline[0] + page_coord[2]) / self.scale_x))
|
|
||||||
points_co += ','
|
|
||||||
points_co += str(int((contour_textline[1] + page_coord[0]) / self.scale_y))
|
|
||||||
else:
|
|
||||||
points_co += str(int((contour_textline[0][0] + page_coord[2]) / self.scale_x))
|
|
||||||
points_co += ','
|
|
||||||
points_co += str(int((contour_textline[0][1] + page_coord[0])/self.scale_y))
|
|
||||||
|
|
||||||
points_co += ' '
|
|
||||||
coords.set_points(points_co[:-1])
|
coords.set_points(points_co[:-1])
|
||||||
|
|
||||||
def write_pagexml(self, pcgts):
|
def write_pagexml(self, pcgts):
|
||||||
|
@ -170,7 +87,7 @@ class EynollahXmlWriter():
|
||||||
with open(self.output_filename, 'w') as f:
|
with open(self.output_filename, 'w') as f:
|
||||||
f.write(to_xml(pcgts))
|
f.write(to_xml(pcgts))
|
||||||
|
|
||||||
def build_pagexml_no_full_layout(self, found_polygons_text_region, page_coord, order_of_texts, id_of_texts, all_found_textline_polygons, all_box_coord, found_polygons_text_region_img, found_polygons_marginals_left, found_polygons_marginals_right, all_found_textline_polygons_marginals_left, all_found_textline_polygons_marginals_right, all_box_coord_marginals_left, all_box_coord_marginals_right, slopes, slopes_marginals_left, slopes_marginals_right, cont_page, polygons_lines_to_be_written_in_xml, found_polygons_tables, ocr_all_textlines=None, ocr_all_textlines_marginals_left=None, ocr_all_textlines_marginals_right=None, conf_contours_textregion=None, skip_layout_reading_order=False):
|
def build_pagexml_no_full_layout(self, found_polygons_text_region, page_coord, order_of_texts, id_of_texts, all_found_textline_polygons, all_box_coord, found_polygons_text_region_img, found_polygons_marginals_left, found_polygons_marginals_right, all_found_textline_polygons_marginals_left, all_found_textline_polygons_marginals_right, all_box_coord_marginals_left, all_box_coord_marginals_right, slopes, slopes_marginals_left, slopes_marginals_right, cont_page, polygons_seplines, found_polygons_tables, ocr_all_textlines=None, ocr_all_textlines_marginals_left=None, ocr_all_textlines_marginals_right=None, conf_contours_textregion=None, skip_layout_reading_order=False):
|
||||||
self.logger.debug('enter build_pagexml_no_full_layout')
|
self.logger.debug('enter build_pagexml_no_full_layout')
|
||||||
|
|
||||||
# create the file structure
|
# create the file structure
|
||||||
|
@ -179,90 +96,79 @@ class EynollahXmlWriter():
|
||||||
page.set_Border(BorderType(Coords=CoordsType(points=self.calculate_page_coords(cont_page))))
|
page.set_Border(BorderType(Coords=CoordsType(points=self.calculate_page_coords(cont_page))))
|
||||||
|
|
||||||
counter = EynollahIdCounter()
|
counter = EynollahIdCounter()
|
||||||
if len(found_polygons_text_region) > 0:
|
if len(order_of_texts):
|
||||||
_counter_marginals = EynollahIdCounter(region_idx=len(order_of_texts))
|
_counter_marginals = EynollahIdCounter(region_idx=len(order_of_texts))
|
||||||
id_of_marginalia_left = [_counter_marginals.next_region_id for _ in found_polygons_marginals_left]
|
id_of_marginalia_left = [_counter_marginals.next_region_id
|
||||||
id_of_marginalia_right = [_counter_marginals.next_region_id for _ in found_polygons_marginals_right]
|
for _ in found_polygons_marginals_left]
|
||||||
|
id_of_marginalia_right = [_counter_marginals.next_region_id
|
||||||
|
for _ in found_polygons_marginals_right]
|
||||||
xml_reading_order(page, order_of_texts, id_of_marginalia_left, id_of_marginalia_right)
|
xml_reading_order(page, order_of_texts, id_of_marginalia_left, id_of_marginalia_right)
|
||||||
|
|
||||||
for mm in range(len(found_polygons_text_region)):
|
for mm, region_contour in enumerate(found_polygons_text_region):
|
||||||
textregion = TextRegionType(id=counter.next_region_id, type_='paragraph',
|
textregion = TextRegionType(
|
||||||
Coords=CoordsType(points=self.calculate_polygon_coords(found_polygons_text_region[mm], page_coord, skip_layout_reading_order), conf=conf_contours_textregion[mm]),
|
id=counter.next_region_id, type_='paragraph',
|
||||||
|
Coords=CoordsType(points=self.calculate_polygon_coords(region_contour, page_coord,
|
||||||
|
skip_layout_reading_order),
|
||||||
|
conf=conf_contours_textregion[mm]),
|
||||||
)
|
)
|
||||||
#textregion.set_conf(conf_contours_textregion[mm])
|
|
||||||
page.add_TextRegion(textregion)
|
page.add_TextRegion(textregion)
|
||||||
if ocr_all_textlines:
|
if ocr_all_textlines:
|
||||||
ocr_textlines = ocr_all_textlines[mm]
|
ocr_textlines = ocr_all_textlines[mm]
|
||||||
else:
|
else:
|
||||||
ocr_textlines = None
|
ocr_textlines = None
|
||||||
self.serialize_lines_in_region(textregion, all_found_textline_polygons, mm, page_coord, all_box_coord, slopes, counter, ocr_textlines)
|
self.serialize_lines_in_region(textregion, all_found_textline_polygons, mm, page_coord,
|
||||||
|
all_box_coord, slopes, counter, ocr_textlines)
|
||||||
|
|
||||||
for mm in range(len(found_polygons_marginals_left)):
|
for mm, region_contour in enumerate(found_polygons_marginals_left):
|
||||||
marginal = TextRegionType(id=counter.next_region_id, type_='marginalia',
|
marginal = TextRegionType(
|
||||||
Coords=CoordsType(points=self.calculate_polygon_coords(found_polygons_marginals_left[mm], page_coord)))
|
id=counter.next_region_id, type_='marginalia',
|
||||||
|
Coords=CoordsType(points=self.calculate_polygon_coords(region_contour, page_coord))
|
||||||
|
)
|
||||||
page.add_TextRegion(marginal)
|
page.add_TextRegion(marginal)
|
||||||
if ocr_all_textlines_marginals_left:
|
if ocr_all_textlines_marginals_left:
|
||||||
ocr_textlines = ocr_all_textlines_marginals_left[mm]
|
ocr_textlines = ocr_all_textlines_marginals_left[mm]
|
||||||
else:
|
else:
|
||||||
ocr_textlines = None
|
ocr_textlines = None
|
||||||
|
self.serialize_lines_in_region(marginal, all_found_textline_polygons_marginals_left, mm, page_coord,
|
||||||
|
all_box_coord_marginals_left, slopes_marginals_left, counter, ocr_textlines)
|
||||||
|
|
||||||
#print(ocr_textlines, mm, len(all_found_textline_polygons_marginals_left[mm]) )
|
for mm, region_contour in enumerate(found_polygons_marginals_right):
|
||||||
self.serialize_lines_in_marginal(marginal, all_found_textline_polygons_marginals_left, mm, page_coord, all_box_coord_marginals_left, slopes_marginals_left, counter, ocr_textlines)
|
marginal = TextRegionType(
|
||||||
|
id=counter.next_region_id, type_='marginalia',
|
||||||
for mm in range(len(found_polygons_marginals_right)):
|
Coords=CoordsType(points=self.calculate_polygon_coords(region_contour, page_coord))
|
||||||
marginal = TextRegionType(id=counter.next_region_id, type_='marginalia',
|
)
|
||||||
Coords=CoordsType(points=self.calculate_polygon_coords(found_polygons_marginals_right[mm], page_coord)))
|
|
||||||
page.add_TextRegion(marginal)
|
page.add_TextRegion(marginal)
|
||||||
if ocr_all_textlines_marginals_right:
|
if ocr_all_textlines_marginals_right:
|
||||||
ocr_textlines = ocr_all_textlines_marginals_right[mm]
|
ocr_textlines = ocr_all_textlines_marginals_right[mm]
|
||||||
else:
|
else:
|
||||||
ocr_textlines = None
|
ocr_textlines = None
|
||||||
|
self.serialize_lines_in_region(marginal, all_found_textline_polygons_marginals_right, mm, page_coord,
|
||||||
|
all_box_coord_marginals_right, slopes_marginals_right, counter, ocr_textlines)
|
||||||
|
|
||||||
self.serialize_lines_in_marginal(marginal, all_found_textline_polygons_marginals_right, mm, page_coord, all_box_coord_marginals_right, slopes_marginals_right, counter, ocr_textlines)
|
for region_contour in found_polygons_text_region_img:
|
||||||
|
img_region = ImageRegionType(
|
||||||
for mm in range(len(found_polygons_text_region_img)):
|
id=counter.next_region_id,
|
||||||
img_region = ImageRegionType(id=counter.next_region_id, Coords=CoordsType())
|
Coords=CoordsType(points=self.calculate_polygon_coords(region_contour, page_coord))
|
||||||
|
)
|
||||||
page.add_ImageRegion(img_region)
|
page.add_ImageRegion(img_region)
|
||||||
points_co = ''
|
|
||||||
for lmm in range(len(found_polygons_text_region_img[mm])):
|
|
||||||
try:
|
|
||||||
points_co += str(int((found_polygons_text_region_img[mm][lmm,0,0] + page_coord[2]) / self.scale_x))
|
|
||||||
points_co += ','
|
|
||||||
points_co += str(int((found_polygons_text_region_img[mm][lmm,0,1] + page_coord[0]) / self.scale_y))
|
|
||||||
points_co += ' '
|
|
||||||
except:
|
|
||||||
|
|
||||||
points_co += str(int((found_polygons_text_region_img[mm][lmm][0] + page_coord[2])/ self.scale_x ))
|
for region_contour in polygons_seplines:
|
||||||
points_co += ','
|
sep = SeparatorRegionType(
|
||||||
points_co += str(int((found_polygons_text_region_img[mm][lmm][1] + page_coord[0])/ self.scale_y ))
|
id=counter.next_region_id,
|
||||||
points_co += ' '
|
Coords=CoordsType(points=self.calculate_polygon_coords(region_contour, [0, 0, 0, 0]))
|
||||||
|
)
|
||||||
|
page.add_SeparatorRegion(sep)
|
||||||
|
|
||||||
img_region.get_Coords().set_points(points_co[:-1])
|
for region_contour in found_polygons_tables:
|
||||||
|
tab = TableRegionType(
|
||||||
for mm in range(len(polygons_lines_to_be_written_in_xml)):
|
id=counter.next_region_id,
|
||||||
sep_hor = SeparatorRegionType(id=counter.next_region_id, Coords=CoordsType())
|
Coords=CoordsType(points=self.calculate_polygon_coords(region_contour, page_coord))
|
||||||
page.add_SeparatorRegion(sep_hor)
|
)
|
||||||
points_co = ''
|
page.add_TableRegion(tab)
|
||||||
for lmm in range(len(polygons_lines_to_be_written_in_xml[mm])):
|
|
||||||
points_co += str(int((polygons_lines_to_be_written_in_xml[mm][lmm,0,0] ) / self.scale_x))
|
|
||||||
points_co += ','
|
|
||||||
points_co += str(int((polygons_lines_to_be_written_in_xml[mm][lmm,0,1] ) / self.scale_y))
|
|
||||||
points_co += ' '
|
|
||||||
sep_hor.get_Coords().set_points(points_co[:-1])
|
|
||||||
for mm in range(len(found_polygons_tables)):
|
|
||||||
tab_region = TableRegionType(id=counter.next_region_id, Coords=CoordsType())
|
|
||||||
page.add_TableRegion(tab_region)
|
|
||||||
points_co = ''
|
|
||||||
for lmm in range(len(found_polygons_tables[mm])):
|
|
||||||
points_co += str(int((found_polygons_tables[mm][lmm,0,0] + page_coord[2]) / self.scale_x))
|
|
||||||
points_co += ','
|
|
||||||
points_co += str(int((found_polygons_tables[mm][lmm,0,1] + page_coord[0]) / self.scale_y))
|
|
||||||
points_co += ' '
|
|
||||||
tab_region.get_Coords().set_points(points_co[:-1])
|
|
||||||
|
|
||||||
return pcgts
|
return pcgts
|
||||||
|
|
||||||
def build_pagexml_full_layout(self, found_polygons_text_region, found_polygons_text_region_h, page_coord, order_of_texts, id_of_texts, all_found_textline_polygons, all_found_textline_polygons_h, all_box_coord, all_box_coord_h, found_polygons_text_region_img, found_polygons_tables, found_polygons_drop_capitals, found_polygons_marginals_left,found_polygons_marginals_right, all_found_textline_polygons_marginals_left, all_found_textline_polygons_marginals_right, all_box_coord_marginals_left, all_box_coord_marginals_right, slopes, slopes_h, slopes_marginals_left, slopes_marginals_right, cont_page, polygons_lines_to_be_written_in_xml, ocr_all_textlines=None, ocr_all_textlines_h=None, ocr_all_textlines_marginals_left=None, ocr_all_textlines_marginals_right=None, ocr_all_textlines_drop=None, conf_contours_textregion=None, conf_contours_textregion_h=None):
|
def build_pagexml_full_layout(self, found_polygons_text_region, found_polygons_text_region_h, page_coord, order_of_texts, id_of_texts, all_found_textline_polygons, all_found_textline_polygons_h, all_box_coord, all_box_coord_h, found_polygons_text_region_img, found_polygons_tables, found_polygons_drop_capitals, found_polygons_marginals_left,found_polygons_marginals_right, all_found_textline_polygons_marginals_left, all_found_textline_polygons_marginals_right, all_box_coord_marginals_left, all_box_coord_marginals_right, slopes, slopes_h, slopes_marginals_left, slopes_marginals_right, cont_page, polygons_seplines, ocr_all_textlines=None, ocr_all_textlines_h=None, ocr_all_textlines_marginals_left=None, ocr_all_textlines_marginals_right=None, ocr_all_textlines_drop=None, conf_contours_textregion=None, conf_contours_textregion_h=None):
|
||||||
self.logger.debug('enter build_pagexml_full_layout')
|
self.logger.debug('enter build_pagexml_full_layout')
|
||||||
|
|
||||||
# create the file structure
|
# create the file structure
|
||||||
|
@ -271,99 +177,112 @@ class EynollahXmlWriter():
|
||||||
page.set_Border(BorderType(Coords=CoordsType(points=self.calculate_page_coords(cont_page))))
|
page.set_Border(BorderType(Coords=CoordsType(points=self.calculate_page_coords(cont_page))))
|
||||||
|
|
||||||
counter = EynollahIdCounter()
|
counter = EynollahIdCounter()
|
||||||
|
if len(order_of_texts):
|
||||||
_counter_marginals = EynollahIdCounter(region_idx=len(order_of_texts))
|
_counter_marginals = EynollahIdCounter(region_idx=len(order_of_texts))
|
||||||
id_of_marginalia_left = [_counter_marginals.next_region_id for _ in found_polygons_marginals_left]
|
id_of_marginalia_left = [_counter_marginals.next_region_id
|
||||||
id_of_marginalia_right = [_counter_marginals.next_region_id for _ in found_polygons_marginals_right]
|
for _ in found_polygons_marginals_left]
|
||||||
|
id_of_marginalia_right = [_counter_marginals.next_region_id
|
||||||
|
for _ in found_polygons_marginals_right]
|
||||||
xml_reading_order(page, order_of_texts, id_of_marginalia_left, id_of_marginalia_right)
|
xml_reading_order(page, order_of_texts, id_of_marginalia_left, id_of_marginalia_right)
|
||||||
|
|
||||||
for mm in range(len(found_polygons_text_region)):
|
for mm, region_contour in enumerate(found_polygons_text_region):
|
||||||
textregion = TextRegionType(id=counter.next_region_id, type_='paragraph',
|
textregion = TextRegionType(
|
||||||
Coords=CoordsType(points=self.calculate_polygon_coords(found_polygons_text_region[mm], page_coord), conf=conf_contours_textregion[mm]))
|
id=counter.next_region_id, type_='paragraph',
|
||||||
|
Coords=CoordsType(points=self.calculate_polygon_coords(region_contour, page_coord),
|
||||||
|
conf=conf_contours_textregion[mm])
|
||||||
|
)
|
||||||
page.add_TextRegion(textregion)
|
page.add_TextRegion(textregion)
|
||||||
|
|
||||||
if ocr_all_textlines:
|
if ocr_all_textlines:
|
||||||
ocr_textlines = ocr_all_textlines[mm]
|
ocr_textlines = ocr_all_textlines[mm]
|
||||||
else:
|
else:
|
||||||
ocr_textlines = None
|
ocr_textlines = None
|
||||||
self.serialize_lines_in_region(textregion, all_found_textline_polygons, mm, page_coord, all_box_coord, slopes, counter, ocr_textlines)
|
self.serialize_lines_in_region(textregion, all_found_textline_polygons, mm, page_coord,
|
||||||
|
all_box_coord, slopes, counter, ocr_textlines)
|
||||||
|
|
||||||
self.logger.debug('len(found_polygons_text_region_h) %s', len(found_polygons_text_region_h))
|
self.logger.debug('len(found_polygons_text_region_h) %s', len(found_polygons_text_region_h))
|
||||||
for mm in range(len(found_polygons_text_region_h)):
|
for mm, region_contour in enumerate(found_polygons_text_region_h):
|
||||||
textregion = TextRegionType(id=counter.next_region_id, type_='heading',
|
textregion = TextRegionType(
|
||||||
Coords=CoordsType(points=self.calculate_polygon_coords(found_polygons_text_region_h[mm], page_coord)))
|
id=counter.next_region_id, type_='heading',
|
||||||
|
Coords=CoordsType(points=self.calculate_polygon_coords(region_contour, page_coord))
|
||||||
|
)
|
||||||
page.add_TextRegion(textregion)
|
page.add_TextRegion(textregion)
|
||||||
|
|
||||||
if ocr_all_textlines_h:
|
if ocr_all_textlines_h:
|
||||||
ocr_textlines = ocr_all_textlines_h[mm]
|
ocr_textlines = ocr_all_textlines_h[mm]
|
||||||
else:
|
else:
|
||||||
ocr_textlines = None
|
ocr_textlines = None
|
||||||
self.serialize_lines_in_region(textregion, all_found_textline_polygons_h, mm, page_coord, all_box_coord_h, slopes_h, counter, ocr_textlines)
|
self.serialize_lines_in_region(textregion, all_found_textline_polygons_h, mm, page_coord,
|
||||||
|
all_box_coord_h, slopes_h, counter, ocr_textlines)
|
||||||
|
|
||||||
for mm in range(len(found_polygons_marginals_left)):
|
for mm, region_contour in enumerate(found_polygons_marginals_left):
|
||||||
marginal = TextRegionType(id=counter.next_region_id, type_='marginalia',
|
marginal = TextRegionType(
|
||||||
Coords=CoordsType(points=self.calculate_polygon_coords(found_polygons_marginals_left[mm], page_coord)))
|
id=counter.next_region_id, type_='marginalia',
|
||||||
|
Coords=CoordsType(points=self.calculate_polygon_coords(region_contour, page_coord))
|
||||||
|
)
|
||||||
page.add_TextRegion(marginal)
|
page.add_TextRegion(marginal)
|
||||||
if ocr_all_textlines_marginals_left:
|
if ocr_all_textlines_marginals_left:
|
||||||
ocr_textlines = ocr_all_textlines_marginals_left[mm]
|
ocr_textlines = ocr_all_textlines_marginals_left[mm]
|
||||||
else:
|
else:
|
||||||
ocr_textlines = None
|
ocr_textlines = None
|
||||||
self.serialize_lines_in_marginal(marginal, all_found_textline_polygons_marginals_left, mm, page_coord, all_box_coord_marginals_left, slopes_marginals_left, counter, ocr_textlines)
|
self.serialize_lines_in_region(marginal, all_found_textline_polygons_marginals_left, mm, page_coord, all_box_coord_marginals_left, slopes_marginals_left, counter, ocr_textlines)
|
||||||
|
|
||||||
for mm in range(len(found_polygons_marginals_right)):
|
for mm, region_contour in enumerate(found_polygons_marginals_right):
|
||||||
marginal = TextRegionType(id=counter.next_region_id, type_='marginalia',
|
marginal = TextRegionType(
|
||||||
Coords=CoordsType(points=self.calculate_polygon_coords(found_polygons_marginals_right[mm], page_coord)))
|
id=counter.next_region_id, type_='marginalia',
|
||||||
|
Coords=CoordsType(points=self.calculate_polygon_coords(region_contour, page_coord))
|
||||||
|
)
|
||||||
page.add_TextRegion(marginal)
|
page.add_TextRegion(marginal)
|
||||||
if ocr_all_textlines_marginals_right:
|
if ocr_all_textlines_marginals_right:
|
||||||
ocr_textlines = ocr_all_textlines_marginals_right[mm]
|
ocr_textlines = ocr_all_textlines_marginals_right[mm]
|
||||||
else:
|
else:
|
||||||
ocr_textlines = None
|
ocr_textlines = None
|
||||||
self.serialize_lines_in_marginal(marginal, all_found_textline_polygons_marginals_right, mm, page_coord, all_box_coord_marginals_right, slopes_marginals_right, counter, ocr_textlines)
|
self.serialize_lines_in_region(marginal, all_found_textline_polygons_marginals_right, mm, page_coord,
|
||||||
|
all_box_coord_marginals_right, slopes_marginals_right, counter, ocr_textlines)
|
||||||
|
|
||||||
for mm in range(len(found_polygons_drop_capitals)):
|
for mm, region_contour in enumerate(found_polygons_drop_capitals):
|
||||||
dropcapital = TextRegionType(id=counter.next_region_id, type_='drop-capital',
|
dropcapital = TextRegionType(
|
||||||
Coords=CoordsType(points=self.calculate_polygon_coords(found_polygons_drop_capitals[mm], page_coord)))
|
id=counter.next_region_id, type_='drop-capital',
|
||||||
|
Coords=CoordsType(points=self.calculate_polygon_coords(region_contour, page_coord))
|
||||||
|
)
|
||||||
page.add_TextRegion(dropcapital)
|
page.add_TextRegion(dropcapital)
|
||||||
all_box_coord_drop = None
|
all_box_coord_drop = [[0, 0, 0, 0]]
|
||||||
slopes_drop = None
|
slopes_drop = [0]
|
||||||
if ocr_all_textlines_drop:
|
if ocr_all_textlines_drop:
|
||||||
ocr_textlines = ocr_all_textlines_drop[mm]
|
ocr_textlines = ocr_all_textlines_drop[mm]
|
||||||
else:
|
else:
|
||||||
ocr_textlines = None
|
ocr_textlines = None
|
||||||
self.serialize_lines_in_dropcapital(dropcapital, [found_polygons_drop_capitals[mm]], mm, page_coord, all_box_coord_drop, slopes_drop, counter, ocr_all_textlines_textregion=ocr_textlines)
|
self.serialize_lines_in_region(dropcapital, [[found_polygons_drop_capitals[mm]]], 0, page_coord,
|
||||||
|
all_box_coord_drop, slopes_drop, counter, ocr_textlines)
|
||||||
|
|
||||||
for mm in range(len(found_polygons_text_region_img)):
|
for region_contour in found_polygons_text_region_img:
|
||||||
page.add_ImageRegion(ImageRegionType(id=counter.next_region_id, Coords=CoordsType(points=self.calculate_polygon_coords(found_polygons_text_region_img[mm], page_coord))))
|
page.add_ImageRegion(
|
||||||
|
ImageRegionType(id=counter.next_region_id,
|
||||||
|
Coords=CoordsType(points=self.calculate_polygon_coords(region_contour, page_coord))))
|
||||||
|
|
||||||
for mm in range(len(polygons_lines_to_be_written_in_xml)):
|
for region_contour in polygons_seplines:
|
||||||
page.add_SeparatorRegion(SeparatorRegionType(id=counter.next_region_id, Coords=CoordsType(points=self.calculate_polygon_coords(polygons_lines_to_be_written_in_xml[mm], [0 , 0, 0, 0]))))
|
page.add_SeparatorRegion(
|
||||||
|
SeparatorRegionType(id=counter.next_region_id,
|
||||||
|
Coords=CoordsType(points=self.calculate_polygon_coords(region_contour, [0, 0, 0, 0]))))
|
||||||
|
|
||||||
for mm in range(len(found_polygons_tables)):
|
for region_contour in found_polygons_tables:
|
||||||
page.add_TableRegion(TableRegionType(id=counter.next_region_id, Coords=CoordsType(points=self.calculate_polygon_coords(found_polygons_tables[mm], page_coord))))
|
page.add_TableRegion(
|
||||||
|
TableRegionType(id=counter.next_region_id,
|
||||||
|
Coords=CoordsType(points=self.calculate_polygon_coords(region_contour, page_coord))))
|
||||||
|
|
||||||
return pcgts
|
return pcgts
|
||||||
|
|
||||||
def calculate_polygon_coords(self, contour, page_coord, skip_layout_reading_order=False):
|
def calculate_polygon_coords(self, contour, page_coord, skip_layout_reading_order=False):
|
||||||
self.logger.debug('enter calculate_polygon_coords')
|
self.logger.debug('enter calculate_polygon_coords')
|
||||||
coords = ''
|
coords = ''
|
||||||
for value_bbox in contour:
|
for point in contour:
|
||||||
if skip_layout_reading_order:
|
if len(point) != 2:
|
||||||
if len(value_bbox) == 2:
|
point = point[0]
|
||||||
coords += str(int((value_bbox[0]) / self.scale_x))
|
point_x = point[0]
|
||||||
coords += ','
|
point_y = point[1]
|
||||||
coords += str(int((value_bbox[1]) / self.scale_y))
|
if not skip_layout_reading_order:
|
||||||
else:
|
point_x += page_coord[2]
|
||||||
coords += str(int((value_bbox[0][0]) / self.scale_x))
|
point_y += page_coord[0]
|
||||||
coords += ','
|
point_x = int(point_x / self.scale_x)
|
||||||
coords += str(int((value_bbox[0][1]) / self.scale_y))
|
point_y = int(point_y / self.scale_y)
|
||||||
else:
|
coords += str(point_x) + ',' + str(point_y) + ' '
|
||||||
if len(value_bbox) == 2:
|
|
||||||
coords += str(int((value_bbox[0] + page_coord[2]) / self.scale_x))
|
|
||||||
coords += ','
|
|
||||||
coords += str(int((value_bbox[1] + page_coord[0]) / self.scale_y))
|
|
||||||
else:
|
|
||||||
coords += str(int((value_bbox[0][0] + page_coord[2]) / self.scale_x))
|
|
||||||
coords += ','
|
|
||||||
coords += str(int((value_bbox[0][1] + page_coord[0]) / self.scale_y))
|
|
||||||
coords=coords + ' '
|
|
||||||
return coords[:-1]
|
return coords[:-1]
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue