def test_fundamentals(): """ Tests basic funtionality to identify if the behavior of the class corresponds to the expected given the inializing data. """ shape = (100, 100, 3) image = np.zeros(shape, dtype=np.uint8) # Initilized with a box b = bounding_region.BoundingRegion(shape, box=np.array([10, 20, 15, 45])) b.draw_box(image, (255, 255, 0)) assert (np.allclose(image[20, 10], np.array([255, 255, 0]))) assert (np.allclose(image[20, 25], np.array([255, 255, 0]))) assert (np.allclose(image[65, 25], np.array([255, 255, 0]))) assert (np.allclose(image[65, 10], np.array([255, 255, 0]))) # Initilized with a contour image = np.zeros(shape, dtype=np.uint8) b = bounding_region.BoundingRegion(shape, contour=np.array([[[10, 20]], [[25, 20]], [[25, 65]], [[10, 65]]])) b.draw_box(image, (255, 255, 0)) assert (np.allclose(image[20, 10], np.array([255, 255, 0]))) assert (np.allclose(image[20, 25], np.array([255, 255, 0]))) assert (np.allclose(image[65, 25], np.array([255, 255, 0]))) assert (np.allclose(image[65, 10], np.array([255, 255, 0])))
def test_area(): """ Tests if the contour being drawn on the picture has the same area as the one used to initialize the class. """ shape = (100, 100, 3) image = np.zeros(shape, dtype=np.uint8) # Initilized with a box b = bounding_region.BoundingRegion(shape, box=np.array([10, 20, 15, 45])) b.draw_box(image, (255, 255, 255), thickness=-1) imgray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) contours, hierarchy = cv2.findContours(imgray, mode=cv2.RETR_TREE, method=cv2.CHAIN_APPROX_SIMPLE) assert (len(contours) == 1) area = cv2.contourArea(contours[0]) assert (area == b.get_area_pixels()) # Initilized with a contour image = np.zeros(shape, dtype=np.uint8) b = bounding_region.BoundingRegion(shape, contour=np.array([[[10, 20]], [[25, 20]], [[25, 65]], [[10, 65]]])) b.draw_box(image, (255, 255, 255), thickness=-1) imgray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) contours, hierarchy = cv2.findContours(imgray, mode=cv2.RETR_TREE, method=cv2.CHAIN_APPROX_SIMPLE) assert (len(contours) == 1) area = cv2.contourArea(contours[0]) assert (area == b.get_area_pixels())
def test_scaling(): """ Tests if the scaling functionality result in correct behavior """ shape = (100, 100, 3) # Initilized with a box image = np.zeros(shape) b = bounding_region.BoundingRegion(shape, box=np.array([40, 40, 20, 20])) b.scale(0.5) b.draw_box(image, (255, 255, 0)) assert (np.allclose(image[45, 45], np.array([255, 255, 0]))) assert (np.allclose(image[45, 55], np.array([255, 255, 0]))) assert (np.allclose(image[55, 55], np.array([255, 255, 0]))) assert (np.allclose(image[55, 45], np.array([255, 255, 0]))) b.scale(2.0) b.draw_box(image, (0, 255, 0)) assert (np.allclose(image[40, 40], np.array([0, 255, 0]))) assert (np.allclose(image[40, 60], np.array([0, 255, 0]))) assert (np.allclose(image[60, 40], np.array([0, 255, 0]))) assert (np.allclose(image[60, 60], np.array([0, 255, 0]))) b.scale(2.0) b.draw_box(image, (0, 255, 255)) assert (np.allclose(image[30, 30], np.array([0, 255, 255]))) assert (np.allclose(image[30, 70], np.array([0, 255, 255]))) assert (np.allclose(image[70, 30], np.array([0, 255, 255]))) assert (np.allclose(image[70, 70], np.array([0, 255, 255]))) image = np.zeros(shape) # Initilized with a contour b = bounding_region.BoundingRegion(shape, contour=np.array([[[40, 40]], [[40, 60]], [[60, 60]], [[60, 40]]])) b.scale(0.5) b.draw_box(image, (255, 255, 0)) assert (np.allclose(image[45, 45], np.array([255, 255, 0]))) assert (np.allclose(image[45, 55], np.array([255, 255, 0]))) assert (np.allclose(image[55, 55], np.array([255, 255, 0]))) assert (np.allclose(image[55, 45], np.array([255, 255, 0]))) b.scale(2.0) b.draw_box(image, (0, 255, 0)) assert (np.allclose(image[40, 40], np.array([0, 255, 0]))) assert (np.allclose(image[40, 60], np.array([0, 255, 0]))) assert (np.allclose(image[60, 40], np.array([0, 255, 0]))) assert (np.allclose(image[60, 60], np.array([0, 255, 0]))) b.scale(2.0) b.draw_box(image, (0, 255, 255)) assert (np.allclose(image[30, 30], np.array([0, 255, 255]))) assert (np.allclose(image[30, 70], np.array([0, 255, 255]))) assert (np.allclose(image[70, 30], np.array([0, 255, 255]))) assert (np.allclose(image[70, 70], np.array([0, 255, 255])))
def test_box_intersection_randomized(): """ Deeper test runs 1000 times to verify that the intersection is right each time. """ for i in xrange(1000): shape = (100, 100, 3) # Initilized with a box box1 = np.random.randint(low=10, high=30, size=(4, 1)) box2 = np.random.randint(low=10, high=30, size=(4, 1)) b1 = bounding_region.BoundingRegion(image_shape=shape, box=box1) b2 = bounding_region.BoundingRegion(image_shape=shape, box=box2) mask1 = b1.get_mask() mask2 = b2.get_mask() b3 = b1.get_box_intersection(b2) b3.set_image_shape(shape=shape) mask3 = b3.get_mask() mask4 = cv2.bitwise_and(mask1, mask2) assert (np.allclose(mask3, mask4))
def test_box_intersection(): """ Simple static test to verify the intersection is indeed an intersection """ shape = (100, 100, 3) image = np.zeros(shape, dtype=np.uint8) # Initilized with a box b1 = bounding_region.BoundingRegion(image_shape=shape, box=np.array([10, 20, 15, 45])) b2 = bounding_region.BoundingRegion(image_shape=shape, box=np.array([20, 60, 15, 25])) mask1 = b1.get_mask() mask2 = b2.get_mask() b3 = b1.get_box_intersection(b2) b3.set_image_shape(shape=shape) mask3 = b3.get_mask() mask4 = cv2.bitwise_and(mask1, mask2) assert (np.allclose(mask3, mask4))
def test_initialization(): """ Test if the bounding regions initialized with a box and a corresponding contour are exactly the same in every possible aspect """ shape = (100, 100, 3) b = bounding_region.BoundingRegion(shape, box=np.array([10, 20, 15, 45])) c = bounding_region.BoundingRegion(shape, contour=np.array([[[10, 20]], [[25, 20]], [[25, 65]], [[10, 65]]])) assert (np.allclose(b.get_box_pixels(), c.get_box_pixels())) assert (np.allclose(b.get_contour_pixels(), c.get_contour_pixels())) assert (np.allclose(b.get_contour_relative(), c.get_contour_relative())) assert (b.get_box_center_pixels() == c.get_box_center_pixels()) assert (b.get_box_center_relative() == c.get_box_center_relative()) assert (b.get_centroid_pixels() == c.get_centroid_pixels()) assert (b.get_centroid_relative() == c.get_centroid_relative()) assert (b.get_area_pixels() == c.get_area_pixels()) assert (b.get_area_relative() == c.get_area_relative()) assert (b.get_perimeter_pixels() == c.get_perimeter_pixels())
def test_mask_randomized(): """ Tests that the mask generation from the box work right. """ for i in xrange(1000): shape = (100, 100) image = np.zeros(shape, dtype=np.uint8) # Initilized with a box box1 = np.random.randint(low=10, high=30, size=(4, 1)) cv2.rectangle(image, (box1[0], box1[1]), (box1[0] + box1[2], box1[1] + box1[3]), color=255, thickness=-1) b1 = bounding_region.BoundingRegion(image_shape=shape, box=box1) mask1 = b1.get_mask() assert (np.allclose(image, mask1))