Use of newly added orb features in the latest opencv version

Source: Internet
Author: User

We can see that the orb feature extraction algorithm is also in opencv2.3.1, and the SURF feature example Program Applied to is changed to orb feature, which always prompts an error. The type does not match Shenma, because the sample program is not found, you can only find the answer by yourself.

(ORB feature paper: orb: an efficient alternative to sift or surf. Click to download the paper)

Found:

Descriptor data types include float, such as sift, surf, and uchar, such as ORB and brief.

Float matching methods include:

Flannbased

Bruteforce <L2 <float>

Bruteforce <sl2 <float>

Bruteforce <L1 <float>

For uchar:

Bruteforce

Bruteforce

Bruteforcematcher <L2 <float> matcher; // changed location

The complete code is as follows:

#include <iostream>#include "opencv2/core/core.hpp"#include "opencv2/features2d/features2d.hpp"#include "opencv2/highgui/highgui.hpp"#include <iostream>#include <vector>using namespace cv;using namespace std;int main(){Mat img_1 = imread("D:\\image\\img1.jpg");Mat img_2 = imread("D:\\image\\img2.jpg");if (!img_1.data || !img_2.data){cout << "error reading images " << endl;return -1;}ORB orb;vector<KeyPoint> keyPoints_1, keyPoints_2;Mat descriptors_1, descriptors_2;orb(img_1, Mat(), keyPoints_1, descriptors_1);orb(img_2, Mat(), keyPoints_2, descriptors_2);BruteForceMatcher<HammingLUT> matcher;vector<DMatch> matches;matcher.match(descriptors_1, descriptors_2, matches);double max_dist = 0; double min_dist = 100;//-- Quick calculation of max and min distances between keypointsfor( int i = 0; i < descriptors_1.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 0.6*max_dist )//-- PS.- radiusMatch can also be used here.std::vector< DMatch > good_matches;for( int i = 0; i < descriptors_1.rows; i++ ){ if( matches[i].distance < 0.6*max_dist ){ good_matches.push_back( matches[i]); }}Mat img_matches;drawMatches(img_1, keyPoints_1, img_2, keyPoints_2,good_matches, img_matches, Scalar::all(-1), Scalar::all(-1),vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);imshow( "Match", img_matches);cvWaitKey();return 0;}

Also: surf Sift

/*
Sift sift;
Sift (img_1, MAT (), keypoints_1, descriptors_1 );
Sift (img_2, MAT (), keypoints_2, descriptors_2 );
Bruteforcematcher <L2 <float> matcher;
*/

/*
Surf surf;
Surf (img_1, MAT (), keypoints_1 );
Surf (img_2, MAT (), keypoints_2 );
Surfdescriptorextractor extrator;
Extrator. Compute (img_1, keypoints_1, descriptors_1 );
Extrator. Compute (img_2, keypoints_2, descriptors_2 );
Bruteforcematcher <L2 <float> matcher;
*/

Effect:

The other is to search for target matching.

Search for the Starbucks icon in the left-side scene chart.

The effect is as follows:

You need to add the following code before the previous imshow to complete a simple function display:

// localize the objectstd::vector<Point2f> obj;std::vector<Point2f> scene;for (size_t i = 0; i < good_matches.size(); ++i){// get the keypoints from the good matchesobj.push_back(keyPoints_1[ good_matches[i].queryIdx ].pt);scene.push_back(keyPoints_2[ good_matches[i].trainIdx ].pt);}Mat H = findHomography( obj, scene, CV_RANSAC );// get the corners from the image_1std::vector<Point2f> obj_corners(4);obj_corners[0] = cvPoint(0,0);obj_corners[1] = cvPoint( img_1.cols, 0);obj_corners[2] = cvPoint( img_1.cols, img_1.rows);obj_corners[3] = cvPoint( 0, img_1.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_1.cols, 0), scene_corners[1] + Point2f( img_1.cols, 0),Scalar(0,255,0));line( img_matches, scene_corners[1] + Point2f( img_1.cols, 0), scene_corners[2] + Point2f( img_1.cols, 0),Scalar(0,255,0));line( img_matches, scene_corners[2] + Point2f( img_1.cols, 0), scene_corners[3] + Point2f( img_1.cols, 0),Scalar(0,255,0));line( img_matches, scene_corners[3] + Point2f( img_1.cols, 0), scene_corners[0] + Point2f( img_1.cols, 0),Scalar(0,255,0));

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.