- added real data footage

- introduced masked detection of corners to reduce jitter
This commit is contained in:
2024-07-05 19:50:19 +02:00
parent a5e447a926
commit a0002d91c0
27 changed files with 55 additions and 9 deletions
+55 -9
View File
@@ -107,6 +107,7 @@ class CornerTracker:
self.matching_tpl_img = None
self.tracking_bb = None
self.tracking_img = None
self.tracking_mask = None
self.tracker = None
self.corner_ref = None
self.corner_matcher_list = []
@@ -130,7 +131,37 @@ class CornerTracker:
tracker_rect = to_rect(bbox_round(self.tracking_bb))
cv2.rectangle(_image_anno, tracker_rect[0], tracker_rect[1], self.color, 1)
@staticmethod
def mask_init(_image: np.array):
# Create mask
_mask = np.zeros((_image.shape[0], _image.shape[1]), dtype=np.uint8)
return _mask
@staticmethod
def mask_draw(_image: np.array, _mask: np.array):
print(f"Draw mask object")
bb = cv2.selectROI("Tracker Reference", _image, False)
cv2.destroyWindow("Tracker Reference")
if bbox_center(bb) == (0, 0):
return False
rect_upper_left = (bb[0], bb[1])
rect_lower_right = (bb[0] + bb[2], bb[1] + bb[3])
cv2.rectangle(_mask, rect_upper_left, rect_lower_right, 255, -1)
return True
@staticmethod
def mask_apply(_image: np.array, _mask: np.array):
_image[_mask == 0] = 0
_image[_mask != 0] = _image[_mask != 0]
def init_reference_frame(self, _image: np.array):
# Draw mask
_mask = CornerTracker.mask_init(image)
CornerTracker.mask_draw(image, _mask)
# Select search area
print(f"Select tracking object")
bb = cv2.selectROI("Tracker Reference", _image, False)
cv2.destroyWindow("Tracker Reference")
@@ -139,14 +170,18 @@ class CornerTracker:
self.tracking_bb = bb
self.tracking_img = image_crop(_image, self.tracking_bb)
self.tracking_mask = image_crop(_mask, self.tracking_bb)
tracking_ref_gray_img = cv2.cvtColor(self.tracking_img, cv2.COLOR_BGR2GRAY)
self.corner_matcher_list = []
masked_tracking_img = self.tracking_img.copy()
CornerTracker.mask_apply(masked_tracking_img, self.tracking_mask)
corner_list = []
count = 1
while True:
print(f"Add Corner {count}")
bb = cv2.selectROI("Matcher Reference", self.tracking_img, fromCenter=True, showCrosshair=True)
bb = cv2.selectROI("Matcher Reference", masked_tracking_img, fromCenter=True, showCrosshair=True)
if bbox_center(bb) == (0, 0):
break
@@ -183,29 +218,38 @@ class CornerTracker:
if not _ok:
return None
tracking_img = image_crop(_image.copy(), self.tracking_bb)
tracking_img = cv2.cvtColor(tracking_img, cv2.COLOR_BGR2GRAY)
_image_local = image_crop(_image.copy(), self.tracking_bb).copy()
CornerTracker.mask_apply(_image_local, self.tracking_mask)
tracking_img = cv2.cvtColor(_image_local, cv2.COLOR_BGR2GRAY)
CornerTracker.mask_apply(tracking_img, self.tracking_mask)
self.tracking_img = cv2.GaussianBlur(tracking_img, (9, 9), 0)
return self._match(_image, _image_anno)
return self._match(_image_local, _image_anno)
def _match(self, _image: np.array, _image_anno: np.array):
tracking_anno = self.tracking_img.copy()
corners_raw = []
for _ct in self.corner_matcher_list:
matcher_bbox_local, matcher = _ct.process(self.tracking_img)
matcher_bbox = bbox_add_position(matcher_bbox_local, self.tracking_bb)
# Draw path
corner = bbox_center(matcher_bbox)
corner = bbox_center(matcher_bbox_local)
corners_raw.append(corner)
self._debug(_image_anno, tracking_anno, matcher_bbox_local)
# refine corners
corners_refined = self._corner_refine(cv2.cvtColor(_image, cv2.COLOR_BGR2GRAY), corners_raw)
corners_refined_local = self._corner_refine(cv2.cvtColor(_image, cv2.COLOR_BGR2GRAY), corners_raw)
# store refined corners
# Transform corners to global
corners_refined = []
for corner_local in corners_refined_local:
corner = (corner_local[0] + self.tracking_bb[0], corner_local[1] + self.tracking_bb[1])
corners_refined.append(corner)
corners_refined = np.array(corners_refined)
# Create path from global refined corners
_i = 0
for corner in corners_refined:
_ct = self.corner_matcher_list[_i]
@@ -264,7 +308,9 @@ class CornerTracker:
if __name__ == '__main__':
colors = [(255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 0, 255), (0, 255, 255), (255, 255, 255)]
video = cv2.VideoCapture('./data/spindle_multi_black/%04d.png')
# video = cv2.VideoCapture('./data/spindle_multi_black/%04d.png')
# video = cv2.VideoCapture('./data/spindle_jet_12/0013/results_20240621_165000/gear_4/Distance_33.7/video/Distance_33.7_5fps.mp4')
video = cv2.VideoCapture('./data/spindle_jet_12/0020/Distance_70/video/Distance_70_5fps.mp4')
tracker_count = 0
tracker_list = []
if video.isOpened():