Source code for formhtr.libs.annotate_ROI.annotate_ROIs_widget
import cv2
[docs]
class AnnotateROIsWidget:
"""
Widget to annotate ROIs on the given template.
"""
def __init__(self, image, config, display_residuals):
self.original_image = image
self.image = self.original_image.copy()
self.config = config
self.num_of_regions = len(self.config.regions)
self.display_residuals = display_residuals
self.selected_index = 0
cv2.namedWindow('Annotate ROIs')
# cv2.setMouseCallback('Annotate ROIs', self.process_events)
self.draw_regions()
cv2.imshow('Annotate ROIs', self.image)
self.config.announce_status(self.selected_index)
[docs]
def process_events(self, event, x, y, *kwargs):
"""
TODO when click inside a rectangle, select it
will require a smarter data structure
"""
pass
[docs]
def draw_regions(self):
"""
Draw regions. Highligh the selected one.
"""
for i, region in enumerate(self.config.regions):
colour = (240,20,20)
if i == self.selected_index:
colour = (0,0,255)
cv2.rectangle(self.image, region.get_start(), region.get_end(), colour, 6)
if self.display_residuals:
for residual in self.config.residuals:
cv2.rectangle(self.image, residual.get_start(), residual.get_end(), (60,166,71), 5)
[docs]
def reset_image(self):
"""
Start again with empty image.
"""
self.image = self.original_image.copy()
self.draw_regions()
cv2.imshow('Annotate ROIs', self.image)
def update_content_type(self, content_type):
self.config.update(self.selected_index, 'content_type', content_type)
self.config.announce_status(self.selected_index)
def next_region(self):
if self.selected_index + 1 < self.num_of_regions:
self.selected_index += 1
self.reset_image()
self.config.announce_status(self.selected_index)
def previous_region(self):
if self.selected_index - 1 >= 0:
self.selected_index -= 1
self.reset_image()
self.config.announce_status(self.selected_index)
def read_varname(self):
varname = input('\nEnter name: ')
self.config.update(self.selected_index, 'varname', varname)
self.config.announce_status(self.selected_index)