Problems with feature detection and Homography [closed]

asked 2017-01-12 07:46:58 -0500

stan123 gravatar image

updated 2017-01-12 23:53:54 -0500

Hey there,

I found the example for feature detection and homography here:

So I copied the code and tried it with my own pictures. But it don't want to work. So I get suitable features in my object image, but in the scene image there are quite to less features for the matching I guess...

int main(int argc, char** argv)
{

Mat img_object = imread("/data/Images/HappyLittleFish_teil.png", CV_LOAD_IMAGE_GRAYSCALE);
Mat img_scene = imread("/data/Images/HappyLittleFish.png", CV_LOAD_IMAGE_GRAYSCALE);

if (!img_object.data || !img_scene.data)
{
    std::cout << " --(!) Error reading images " << std::endl; return -1;
}

//-- Step 1: Detect the keypoints using SURF Detector
Ptr<FeatureDetector> detector = FeatureDetector::create("ORB");

std::vector<KeyPoint> keypoints_object, keypoints_scene;

detector->detect(img_object, keypoints_object);
detector->detect(img_scene, keypoints_scene);

//-- Step 2: Calculate descriptors (feature vectors)
Ptr<DescriptorExtractor> extractor = DescriptorExtractor::create("ORB");

Mat descriptors_object, descriptors_scene;

extractor->compute(img_object, keypoints_object, descriptors_object);
extractor->compute(img_scene, keypoints_scene, descriptors_scene);

//-- Step 3: Matching descriptor vectors
Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("BruteForce-Hamming");
std::vector< DMatch > matches;
matcher->match(descriptors_object, descriptors_scene, matches);

double max_dist = 0; double min_dist = 100;

//-- Quick calculation of max and min distances between keypoints
for (int i = 0; i < descriptors_object.rows; i++)
{
    double dist = matches[i].distance;
    if (dist < min_dist) min_dist = dist;
    if (dist > max_dist) max_dist = dist;
}

printf("-- Max dist : %f \n", max_dist);
printf("-- Min dist : %f \n", min_dist);

//-- Draw only "good" matches (i.e. whose distance is less than 3*min_dist )
std::vector< DMatch > good_matches;

for (int i = 0; i < descriptors_object.rows; i++)
{
    if (matches[i].distance < 8 * min_dist)
    {
        good_matches.push_back(matches[i]);
    }
}

Mat img_matches;
drawMatches(img_object, keypoints_object, img_scene, keypoints_scene,
    good_matches, img_matches, Scalar::all(-1), Scalar::all(-1),
    vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);

//-- Localize the object
std::vector<Point2f> obj;
std::vector<Point2f> scene;

for (int i = 0; i < good_matches.size(); i++)
{
    //-- Get the keypoints from the good matches
    obj.push_back(keypoints_object[good_matches[i].queryIdx].pt);
    scene.push_back(keypoints_scene[good_matches[i].trainIdx].pt);
}

Mat H = findHomography(obj, scene, CV_RANSAC);

//-- Get the corners from the image_1 ( the object to be "detected" )
std::vector<Point2f> obj_corners(4);
obj_corners[0] = cvPoint(0, 0);
obj_corners[1] = cvPoint(img_object.cols, 0);
obj_corners[2] = cvPoint(img_object.cols, img_object.rows);
obj_corners[3] = cvPoint(0, 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);

//-- Show detected matches
namedWindow( "img", WINDOW_NORMAL );
imshow("img", img_matches);

waitKey(0);
return 0;
}

My scene image is HappyLittleFish.png image description

The object image is just a part from the scene image like the fin of the fish. image description

So does anyone knows were the problem is??

edit retag flag offensive reopen merge delete

Closed for the following reason question is not relevant or outdated by stan123
close date 2017-03-28 07:50:51.571858

Comments

The images are not attached , please add it again

essamzaky gravatar imageessamzaky ( 2017-01-12 11:41:49 -0500 )edit

I'm sory yesterday I wasn't able to attach the files. Today I could ^^

stan123 gravatar imagestan123 ( 2017-01-12 23:54:30 -0500 )edit

Image are in png with transparency. I think with orb there is no keypoint on tail

LBerger gravatar imageLBerger ( 2017-01-13 15:10:07 -0500 )edit

have you tried something with more features

lmackey gravatar imagelmackey ( 2017-01-14 22:48:50 -0500 )edit