- added real data footage
- introduced masked detection of corners to reduce jitter
This commit is contained in:
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
+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