diff --git a/modules/video/src/tracking/tracker_vit.cpp b/modules/video/src/tracking/tracker_vit.cpp index a1c71053fc..e0a51df0d0 100644 --- a/modules/video/src/tracking/tracker_vit.cpp +++ b/modules/video/src/tracking/tracker_vit.cpp @@ -107,12 +107,13 @@ static int crop_image(const Mat& src, Mat& dst, Rect box, int factor) int x1_pad = std::max(0, -x1); int y1_pad = std::max(0, -y1); - int x2_pad = std::max(x2 - src.size[1] + 1, 0); - int y2_pad = std::max(y2 - src.size[0] + 1, 0); + int x2_pad = std::max(x2 - src.size[1], 0); + int y2_pad = std::max(y2 - src.size[0], 0); Rect roi(x1 + x1_pad, y1 + y1_pad, x2 - x2_pad - x1 - x1_pad, y2 - y2_pad - y1 - y1_pad); Mat im_crop = src(roi); - copyMakeBorder(im_crop, dst, y1_pad, y2_pad, x1_pad, x2_pad, BORDER_CONSTANT); + // Keep padding inside src when src is itself an ROI of a larger image. + copyMakeBorder(im_crop, dst, y1_pad, y2_pad, x1_pad, x2_pad, BORDER_CONSTANT | BORDER_ISOLATED); return crop_sz; } diff --git a/modules/video/test/test_trackers.cpp b/modules/video/test/test_trackers.cpp index 235a4ff4a1..ff3d0c9e5f 100644 --- a/modules/video/test/test_trackers.cpp +++ b/modules/video/test/test_trackers.cpp @@ -224,4 +224,29 @@ TEST(vittrack, bbox_inside_tiny_image) ASSERT_EQ(roi & imgRect, roi); } +TEST(vittrack, roi_image_matches_clone) +{ + std::string model = cvtest::findDataFile("dnn/onnx/models/vitTracker.onnx"); + cv::TrackerVit::Params params; + params.net = model; + params.tracking_score_threshold = 0.f; + + Mat parent(160, 160, CV_8UC3, Scalar(255, 0, 0)); + Mat image = parent(Rect(16, 16, 128, 128)); + image.setTo(Scalar::all(0)); + Mat clone = image.clone(); + Rect initial(100, 100, 20, 20); + + Ptr roiTracker = TrackerVit::create(params); + Ptr cloneTracker = TrackerVit::create(params); + roiTracker->init(image, initial); + cloneTracker->init(clone, initial); + + Rect roiResult, cloneResult; + ASSERT_TRUE(roiTracker->update(image, roiResult)); + ASSERT_TRUE(cloneTracker->update(clone, cloneResult)); + EXPECT_EQ(roiResult, cloneResult); + EXPECT_NEAR(roiTracker->getTrackingScore(), cloneTracker->getTrackingScore(), 1e-6f); +} + }} // namespace opencv_test::