diff --git a/data/spindle_jet_12/0013/results_20240621_165000/exception/video/exception_5fps.mp4 b/data/spindle_jet_12/0013/results_20240621_165000/exception/video/exception_5fps.mp4 new file mode 100644 index 0000000..09f90d6 Binary files /dev/null and b/data/spindle_jet_12/0013/results_20240621_165000/exception/video/exception_5fps.mp4 differ diff --git a/data/spindle_jet_12/0013/results_20240621_165000/gear_4/Distance_20.1/video/Distance_20.1_5fps.mp4 b/data/spindle_jet_12/0013/results_20240621_165000/gear_4/Distance_20.1/video/Distance_20.1_5fps.mp4 new file mode 100644 index 0000000..e1d07b0 Binary files /dev/null and b/data/spindle_jet_12/0013/results_20240621_165000/gear_4/Distance_20.1/video/Distance_20.1_5fps.mp4 differ diff --git a/data/spindle_jet_12/0013/results_20240621_165000/gear_4/Distance_33.7/video/Distance_33.7_5fps.mp4 b/data/spindle_jet_12/0013/results_20240621_165000/gear_4/Distance_33.7/video/Distance_33.7_5fps.mp4 new file mode 100644 index 0000000..12f8808 Binary files /dev/null and b/data/spindle_jet_12/0013/results_20240621_165000/gear_4/Distance_33.7/video/Distance_33.7_5fps.mp4 differ diff --git a/data/spindle_jet_12/0013/results_20240621_165000/gear_4/Distance_47.3/video/Distance_47.3_5fps.mp4 b/data/spindle_jet_12/0013/results_20240621_165000/gear_4/Distance_47.3/video/Distance_47.3_5fps.mp4 new file mode 100644 index 0000000..135e2f6 Binary files /dev/null and b/data/spindle_jet_12/0013/results_20240621_165000/gear_4/Distance_47.3/video/Distance_47.3_5fps.mp4 differ diff --git a/data/spindle_jet_12/0013/results_20240621_165000/gear_4/Distance_50/video/Distance_50_5fps.mp4 b/data/spindle_jet_12/0013/results_20240621_165000/gear_4/Distance_50/video/Distance_50_5fps.mp4 new file mode 100644 index 0000000..167dc92 Binary files /dev/null and b/data/spindle_jet_12/0013/results_20240621_165000/gear_4/Distance_50/video/Distance_50_5fps.mp4 differ diff --git a/data/spindle_jet_12/0013/results_20240621_165000/gear_4/Distance_71.9/video/Distance_71.9_5fps.mp4 b/data/spindle_jet_12/0013/results_20240621_165000/gear_4/Distance_71.9/video/Distance_71.9_5fps.mp4 new file mode 100644 index 0000000..66148a9 Binary files /dev/null and b/data/spindle_jet_12/0013/results_20240621_165000/gear_4/Distance_71.9/video/Distance_71.9_5fps.mp4 differ diff --git a/data/spindle_jet_12/0013/results_20240621_165000/gear_4/selector_cal_pos/video/selector_cal_pos_5fps.mp4 b/data/spindle_jet_12/0013/results_20240621_165000/gear_4/selector_cal_pos/video/selector_cal_pos_5fps.mp4 new file mode 100644 index 0000000..d4a6c19 Binary files /dev/null and b/data/spindle_jet_12/0013/results_20240621_165000/gear_4/selector_cal_pos/video/selector_cal_pos_5fps.mp4 differ diff --git a/data/spindle_jet_12/0013/results_20240621_165000/gear_4/sequential/video/sequential_5fps.mp4 b/data/spindle_jet_12/0013/results_20240621_165000/gear_4/sequential/video/sequential_5fps.mp4 new file mode 100644 index 0000000..e6cbbfc Binary files /dev/null and b/data/spindle_jet_12/0013/results_20240621_165000/gear_4/sequential/video/sequential_5fps.mp4 differ diff --git a/data/spindle_jet_12/0013/results_20240621_165000/gear_4/spindle_cal_pos/video/spindle_cal_pos_5fps.mp4 b/data/spindle_jet_12/0013/results_20240621_165000/gear_4/spindle_cal_pos/video/spindle_cal_pos_5fps.mp4 new file mode 100644 index 0000000..be0dc80 Binary files /dev/null and b/data/spindle_jet_12/0013/results_20240621_165000/gear_4/spindle_cal_pos/video/spindle_cal_pos_5fps.mp4 differ diff --git a/data/spindle_jet_12/0013/results_20240621_165000/sequential/video/sequential_5fps.mp4 b/data/spindle_jet_12/0013/results_20240621_165000/sequential/video/sequential_5fps.mp4 new file mode 100644 index 0000000..b0d150e Binary files /dev/null and b/data/spindle_jet_12/0013/results_20240621_165000/sequential/video/sequential_5fps.mp4 differ diff --git a/data/spindle_jet_12/0020/Distance_10/video/Distance_10_5fps.mp4 b/data/spindle_jet_12/0020/Distance_10/video/Distance_10_5fps.mp4 new file mode 100644 index 0000000..7c3998c Binary files /dev/null and b/data/spindle_jet_12/0020/Distance_10/video/Distance_10_5fps.mp4 differ diff --git a/data/spindle_jet_12/0020/Distance_30/video/Distance_30_5fps.mp4 b/data/spindle_jet_12/0020/Distance_30/video/Distance_30_5fps.mp4 new file mode 100644 index 0000000..7ca3cba Binary files /dev/null and b/data/spindle_jet_12/0020/Distance_30/video/Distance_30_5fps.mp4 differ diff --git a/data/spindle_jet_12/0020/Distance_50/video/Distance_50_5fps.mp4 b/data/spindle_jet_12/0020/Distance_50/video/Distance_50_5fps.mp4 new file mode 100644 index 0000000..8bdf789 Binary files /dev/null and b/data/spindle_jet_12/0020/Distance_50/video/Distance_50_5fps.mp4 differ diff --git a/data/spindle_jet_12/0020/Distance_70/video/Distance_70_5fps.mp4 b/data/spindle_jet_12/0020/Distance_70/video/Distance_70_5fps.mp4 new file mode 100644 index 0000000..53e6658 Binary files /dev/null and b/data/spindle_jet_12/0020/Distance_70/video/Distance_70_5fps.mp4 differ diff --git a/data/spindle_jet_12/0030/results_20240620_085047/Distance_10/video/Distance_10_5fps.mp4 b/data/spindle_jet_12/0030/results_20240620_085047/Distance_10/video/Distance_10_5fps.mp4 new file mode 100644 index 0000000..5f7bbf8 Binary files /dev/null and b/data/spindle_jet_12/0030/results_20240620_085047/Distance_10/video/Distance_10_5fps.mp4 differ diff --git a/data/spindle_jet_12/0030/results_20240620_085047/Distance_30/video/Distance_30_5fps.mp4 b/data/spindle_jet_12/0030/results_20240620_085047/Distance_30/video/Distance_30_5fps.mp4 new file mode 100644 index 0000000..119be10 Binary files /dev/null and b/data/spindle_jet_12/0030/results_20240620_085047/Distance_30/video/Distance_30_5fps.mp4 differ diff --git a/data/spindle_jet_12/0030/results_20240620_085047/Distance_50/video/Distance_50_5fps.mp4 b/data/spindle_jet_12/0030/results_20240620_085047/Distance_50/video/Distance_50_5fps.mp4 new file mode 100644 index 0000000..1c522d5 Binary files /dev/null and b/data/spindle_jet_12/0030/results_20240620_085047/Distance_50/video/Distance_50_5fps.mp4 differ diff --git a/data/spindle_jet_12/0030/results_20240620_085047/Distance_70/video/Distance_70_5fps.mp4 b/data/spindle_jet_12/0030/results_20240620_085047/Distance_70/video/Distance_70_5fps.mp4 new file mode 100644 index 0000000..911a027 Binary files /dev/null and b/data/spindle_jet_12/0030/results_20240620_085047/Distance_70/video/Distance_70_5fps.mp4 differ diff --git a/data/spindle_jet_12/0031/results_20240619_160746/Distance_10/video/Distance_10_5fps.mp4 b/data/spindle_jet_12/0031/results_20240619_160746/Distance_10/video/Distance_10_5fps.mp4 new file mode 100644 index 0000000..10a161d Binary files /dev/null and b/data/spindle_jet_12/0031/results_20240619_160746/Distance_10/video/Distance_10_5fps.mp4 differ diff --git a/data/spindle_jet_12/0031/results_20240619_160746/Distance_30/video/Distance_30_5fps.mp4 b/data/spindle_jet_12/0031/results_20240619_160746/Distance_30/video/Distance_30_5fps.mp4 new file mode 100644 index 0000000..3735a89 Binary files /dev/null and b/data/spindle_jet_12/0031/results_20240619_160746/Distance_30/video/Distance_30_5fps.mp4 differ diff --git a/data/spindle_jet_12/0031/results_20240619_160746/Distance_50/video/Distance_50_5fps.mp4 b/data/spindle_jet_12/0031/results_20240619_160746/Distance_50/video/Distance_50_5fps.mp4 new file mode 100644 index 0000000..800a149 Binary files /dev/null and b/data/spindle_jet_12/0031/results_20240619_160746/Distance_50/video/Distance_50_5fps.mp4 differ diff --git a/data/spindle_jet_12/0031/results_20240619_160746/Distance_70/video/Distance_70_5fps.mp4 b/data/spindle_jet_12/0031/results_20240619_160746/Distance_70/video/Distance_70_5fps.mp4 new file mode 100644 index 0000000..83e3cf2 Binary files /dev/null and b/data/spindle_jet_12/0031/results_20240619_160746/Distance_70/video/Distance_70_5fps.mp4 differ diff --git a/data/spindle_jet_12/0033/results_20240619_180105/Distance_10/video/Distance_10_5fps.mp4 b/data/spindle_jet_12/0033/results_20240619_180105/Distance_10/video/Distance_10_5fps.mp4 new file mode 100644 index 0000000..c5a1de2 Binary files /dev/null and b/data/spindle_jet_12/0033/results_20240619_180105/Distance_10/video/Distance_10_5fps.mp4 differ diff --git a/data/spindle_jet_12/0033/results_20240619_180105/Distance_30/video/Distance_30_5fps.mp4 b/data/spindle_jet_12/0033/results_20240619_180105/Distance_30/video/Distance_30_5fps.mp4 new file mode 100644 index 0000000..5c4b2b0 Binary files /dev/null and b/data/spindle_jet_12/0033/results_20240619_180105/Distance_30/video/Distance_30_5fps.mp4 differ diff --git a/data/spindle_jet_12/0033/results_20240619_180105/Distance_50/video/Distance_50_5fps.mp4 b/data/spindle_jet_12/0033/results_20240619_180105/Distance_50/video/Distance_50_5fps.mp4 new file mode 100644 index 0000000..88761af Binary files /dev/null and b/data/spindle_jet_12/0033/results_20240619_180105/Distance_50/video/Distance_50_5fps.mp4 differ diff --git a/data/spindle_jet_12/0033/results_20240619_180105/Distance_70/video/Distance_70_5fps.mp4 b/data/spindle_jet_12/0033/results_20240619_180105/Distance_70/video/Distance_70_5fps.mp4 new file mode 100644 index 0000000..7a5e695 Binary files /dev/null and b/data/spindle_jet_12/0033/results_20240619_180105/Distance_70/video/Distance_70_5fps.mp4 differ diff --git a/ocv_corner_tracker.py b/ocv_corner_tracker.py index ba29e62..f96e7ed 100644 --- a/ocv_corner_tracker.py +++ b/ocv_corner_tracker.py @@ -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():