class TestRectangleMerger(TestCase): rect_a = Rectangle.from_2_pos(1, 1, 10, 5) rect_b = Rectangle.from_2_pos(11, 1.2, 13, 5.2) rect_c = Rectangle.from_2_pos(2, 3, 20, 10) merger = Merger() def test__merge_rectangle_to_pool(self): self.assertTrue( self.merger._is_rectangles_overlapped(self.rect_a, self.rect_c)) self.assertFalse( self.merger._is_rectangles_overlapped(self.rect_a, self.rect_b)) def test__merge_2_rectangles(self): rect = self.merger._merge_2_rectangles(self.rect_a, self.rect_c) expect_rect = Rectangle.from_2_pos(1, 1, 20, 10) self.assertEqual(rect, expect_rect, "%s and %s not equal!" % (rect, expect_rect)) def test__merge_all_rectangles(self): rects = [self.rect_a, self.rect_b, self.rect_c] merged_rects = self.merger.merge_rectangle_list(rects) expect_rects = [ Rectangle.from_2_pos(1, 1, 13, 5.2), Rectangle.from_2_pos(2, 3, 20, 10) ] self.assertListEqual(merged_rects, expect_rects, " ".join([r.__str__() for r in merged_rects]))
def test__merge_all_rectangles(self): rects = [self.rect_a, self.rect_b, self.rect_c] merged_rects = self.merger.merge_rectangle_list(rects) expect_rects = [ Rectangle.from_2_pos(1, 1, 13, 5.2), Rectangle.from_2_pos(2, 3, 20, 10) ] self.assertListEqual(merged_rects, expect_rects, " ".join([r.__str__() for r in merged_rects]))
def _merge_2_rectangles(self, rect_1, rect_2): return Rectangle.from_2_pos( rect_1.x1 < rect_2.x1 and rect_1.x1 or rect_2.x1, rect_1.y1 < rect_2.y1 and rect_1.y1 or rect_2.y1, rect_1.x2 > rect_2.x2 and rect_1.x2 or rect_2.x2, rect_1.y2 > rect_2.y2 and rect_1.y2 or rect_2.y2, rect_1.merged_times + rect_2.merged_times + 1)
def _save_region_of_interest_with_margin(self, index, img, rect): max_x = len(img[0]) - 1 max_y = len(img) - 1 margin_x = int((rect.x2 - rect.x1) * self.width_margin_percent) margin_y = int((rect.y2 - rect.y1) * self.height_margin_percent) r = Rectangle.from_2_pos( rect.x1 - margin_x >= 0 and (rect.x1 - margin_x) or 0, rect.y1 - margin_y >= 0 and (rect.y1 - margin_y) or 0, rect.x2 + margin_x <= max_x and (rect.x2 + margin_x) or max_x, rect.y2 + margin_y <= max_y and (rect.y2 + margin_y) or max_y) roi = img[r.y1:r.y2, r.x1:r.x2] cv2.imwrite("%spart-%02d.jpg" % (self.output_path, index), roi)
def test__merge_2_rectangles(self): rect = self.merger._merge_2_rectangles(self.rect_a, self.rect_c) expect_rect = Rectangle.from_2_pos(1, 1, 20, 10) self.assertEqual(rect, expect_rect, "%s and %s not equal!" % (rect, expect_rect))