Hello everyone, I'm trying to draw a rectangle around a detected object from an image to a scene (that's actually the first frame of a video), by using SIFT features and the homography matrix. First of all to get features and matching I'm using the following code:
cv::Ptr<Feature2D> f2d = xfeatures2d::SIFT::create();
Ptr<DescriptorExtractor> extractor = xfeatures2d::SIFT::create();
//part of the code not relevant...
Ptr<BFMatcher> matcher = BFMatcher::create(NORM_L2);
vector<DMatch> matches;
matcher->match(descriptors_object, descriptors_scene, matches);
//-- Localize the object
std::vector<Point2f> obj;
std::vector<Point2f> scene;
for (size_t i = 0; i < matches.size(); i++)
{
//-- Get the keypoints from the matches
obj.push_back(keypoints_object[matches[i].queryIdx].pt);
scene.push_back(keypoints_scene[matches[i].trainIdx].pt);
}
Mat mask;
Mat H = findHomography(obj, scene, RANSAC, 3.0, mask);
vector<DMatch> good_matches;
for (int r = 0; r < matches.size(); r++)
{
if ((int)mask.at<uchar>(r, 0) != 0)
{
good_matches.push_back(matches[r]);
}
}
//-- Draw matches
Mat img_matches;
drawMatches(img_object, keypoints_object, img_scene, keypoints_scene, good_matches, img_matches,
Scalar::all(-1), Scalar::all(-1), std::vector<char>());
I'm getting this result:
Now I'd like to draw a rectangle around THAT detected book. I wrote the following code:
//-- Get the corners from the image_1 ( the object to be "detected" )
std::vector<Point2f> obj_corners(4);
obj_corners[0] = Point2f(0, 0);
obj_corners[1] = Point2f((float)img_object.cols, 0);
obj_corners[2] = Point2f((float)img_object.cols, (float)img_object.rows);
obj_corners[3] = Point2f(0, (float)img_object.rows);
std::vector<Point2f> scene_corners(4);
perspectiveTransform(obj_corners, scene_corners, H);
//-- Draw lines between the corners (the mapped object in the scene - image_2 )
line(img_matches, scene_corners[0] + Point2f(img_object.cols, 0), scene_corners[1] + Point2f(img_object.cols, 0), Scalar(0, 255, 0), 4);
line(img_matches, scene_corners[1] + Point2f(img_object.cols, 0), scene_corners[2] + Point2f(img_object.cols, 0), Scalar(0, 255, 0), 4);
line(img_matches, scene_corners[2] + Point2f(img_object.cols, 0), scene_corners[3] + Point2f(img_object.cols, 0), Scalar(0, 255, 0), 4);
line(img_matches, scene_corners[3] + Point2f(img_object.cols, 0), scene_corners[0] + Point2f(img_object.cols, 0), Scalar(0, 255, 0), 4);
But I'm getting the same result as before, without the rectangle. Whatìs wrong with the code?