- added real data footage
- introduced masked detection of corners to reduce jitter
This commit is contained in:
+55
-9
@@ -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():
|
||||
|
||||
Reference in New Issue
Block a user