特征点的提取与匹配

来源:互联网 发布:淘宝推广收费标准 编辑:程序博客网 时间:2024/06/05 14:33
void AgastFeatureDetectorTest::AgastFeature_Test(Mat src, Mat modle,Mat &dst){Mat _src;cvtColor(src, _src, CV_BGR2GRAY);Ptr<Feature2D> feature = AgastFeatureDetector::create();std::vector<KeyPoint> keypoints1, keypoints2;feature->detect(_src, keypoints1);Mat indexMat;Mat sortMat(keypoints1.size(), 1, CV_32F);for (int i = 0; i < keypoints1.size(); i++){sortMat.at<float>(i, 0) = keypoints1[i].response;}sortIdx(sortMat, indexMat, SORT_EVERY_COLUMN + SORT_ASCENDING);std::vector<KeyPoint>goodMatch;for (int i = 0; i < 100; i++){goodMatch.push_back(keypoints1[indexMat.at<int>(i, 0)]);}drawKeypoints(src, goodMatch, dst, Scalar(rand() & 255, rand() & 255, rand() & 255));imwrite("dst.jpg", dst);}void AgastFeatureDetectorTest::FastFeature_Test(Mat src, Mat modle, Mat &dst){Mat _src;cvtColor(src, _src, CV_BGR2GRAY);Ptr<Feature2D> feature = FastFeatureDetector::create();std::vector<KeyPoint> keypoints1, keypoints2;feature->detect(_src, keypoints1);Mat indexMat;Mat sortMat(keypoints1.size(), 1, CV_32F);for (int i = 0; i < keypoints1.size(); i++){sortMat.at<float>(i, 0) = keypoints1[i].response;}sortIdx(sortMat, indexMat, SORT_EVERY_COLUMN + SORT_ASCENDING);std::vector<KeyPoint>goodMatch;for (int i = 0; i < 100; i++){goodMatch.push_back(keypoints1[indexMat.at<int>(i, 0)]);}drawKeypoints(src, goodMatch, dst, Scalar(rand() & 255, rand() & 255, rand() & 255));imwrite("fast.jpg", dst);}void AgastFeatureDetectorTest::AKAZE_Test(Mat src, Mat modle, Mat &dst){Mat _src;cvtColor(src, _src, CV_BGR2GRAY);Ptr<Feature2D> feature = AKAZE::create();std::vector<KeyPoint> keypoints1, keypoints2;Mat des1, des2;feature->detect(_src, keypoints1);feature->compute(_src, keypoints1, des1);feature->detect(modle, keypoints2);feature->compute(modle, keypoints2, des2);Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("BruteForce");std::vector<DMatch> dm;matcher->match(des1,des2,dm,Mat());for (int i=0; i < keypoints2.size(); i++){}Mat indexMat;Mat sortMat(dm.size(), 1, CV_32F);for (int i = 0; i < dm.size(); i++){sortMat.at<float>(i, 0) = dm[i].distance;//printf("%f", dm[i].distance);//getchar();}sortIdx(sortMat, indexMat, SORT_EVERY_COLUMN + SORT_ASCENDING);std::vector<DMatch>goodMatch;for (int i = 0; i < 50; i++){goodMatch.push_back(dm[indexMat.at<int>(i, 0)]);}drawMatches(src, keypoints1, modle, keypoints2, goodMatch, dst);imwrite("AKAZE.jpg", dst);}void AgastFeatureDetectorTest::BRISK_Test(Mat src, Mat modle, Mat &dst){Mat _src;cvtColor(src, _src, CV_BGR2GRAY);Ptr<Feature2D> feature = BRISK::create();std::vector<KeyPoint> keypoints1, keypoints2;Mat des1, des2;feature->detect(_src, keypoints1);feature->compute(_src, keypoints1, des1);feature->detect(modle, keypoints2);feature->compute(modle, keypoints2, des2);Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("BruteForce");std::vector<DMatch> dm;matcher->match(des1, des2, dm, Mat());for (int i = 0; i < keypoints2.size(); i++){}Mat indexMat;Mat sortMat(dm.size(), 1, CV_32F);for (int i = 0; i < dm.size(); i++){sortMat.at<float>(i, 0) = dm[i].distance;//printf("%f", dm[i].distance);//getchar();}sortIdx(sortMat, indexMat, SORT_EVERY_COLUMN + SORT_ASCENDING);std::vector<DMatch>goodMatch;for (int i = 0; i < 50; i++){goodMatch.push_back(dm[indexMat.at<int>(i, 0)]);}drawMatches(src, keypoints1, modle, keypoints2, goodMatch, dst);imwrite("BRISK.jpg", dst);}void AgastFeatureDetectorTest::GFTTDetector_Test(Mat src, Mat modle, Mat &dst){Mat _src;cvtColor(src, _src, CV_BGR2GRAY);Ptr<Feature2D> feature = GFTTDetector::create();std::vector<KeyPoint> keypoints1, keypoints2;feature->detect(_src, keypoints1);Mat indexMat;Mat sortMat(keypoints1.size(), 1, CV_32F);for (int i = 0; i < keypoints1.size(); i++){sortMat.at<float>(i, 0) = keypoints1[i].response;}sortIdx(sortMat, indexMat, SORT_EVERY_COLUMN + SORT_ASCENDING);std::vector<KeyPoint>goodMatch;for (int i = 0; i < 100; i++){goodMatch.push_back(keypoints1[indexMat.at<int>(i, 0)]);}drawKeypoints(src, goodMatch, dst, Scalar(rand() & 255, rand() & 255, rand() & 255));imwrite("GFTTDetector.jpg", dst);}void AgastFeatureDetectorTest::KAZE_Test(Mat src, Mat modle, Mat &dst){Mat _src;cvtColor(src, _src, CV_BGR2GRAY);Ptr<Feature2D> feature = KAZE::create();std::vector<KeyPoint> keypoints1, keypoints2;Mat des1, des2;feature->detect(_src, keypoints1);feature->compute(_src, keypoints1, des1);feature->detect(modle, keypoints2);feature->compute(modle, keypoints2, des2);Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("BruteForce");std::vector<DMatch> dm;matcher->match(des1, des2, dm, Mat());for (int i = 0; i < keypoints2.size(); i++){}Mat indexMat;Mat sortMat(dm.size(), 1, CV_32F);for (int i = 0; i < dm.size(); i++){sortMat.at<float>(i, 0) = dm[i].distance;//printf("%f", dm[i].distance);//getchar();}sortIdx(sortMat, indexMat, SORT_EVERY_COLUMN + SORT_ASCENDING);std::vector<DMatch>goodMatch;for (int i = 0; i < 50; i++){goodMatch.push_back(dm[indexMat.at<int>(i, 0)]);}drawMatches(src, keypoints1, modle, keypoints2, goodMatch, dst);imwrite("KAZE.jpg", dst);}void AgastFeatureDetectorTest::ORB_Test(Mat src, Mat modle, Mat &dst){Mat _src;cvtColor(src, _src, CV_BGR2GRAY);Ptr<Feature2D> feature = ORB::create();std::vector<KeyPoint> keypoints1, keypoints2;Mat des1, des2;feature->detect(_src, keypoints1);feature->compute(_src, keypoints1, des1);feature->detect(modle, keypoints2);feature->compute(modle, keypoints2, des2);Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("BruteForce-Hamming(2)");std::vector<DMatch> dm;matcher->match(des1, des2, dm, Mat());Mat indexMat;Mat sortMat(dm.size(), 1, CV_32F);for (int i = 0; i < dm.size(); i++){sortMat.at<float>(i, 0) = dm[i].distance;//printf("%f", dm[i].distance);//getchar();}sortIdx(sortMat, indexMat, SORT_EVERY_COLUMN + SORT_ASCENDING);std::vector<DMatch>goodMatch;for (int i = 0; i < 50; i++){goodMatch.push_back(dm[indexMat.at<int>(i, 0)]);}// localize the object  std::vector<Point2f> objSrc;std::vector<Point2f> sceneModle;for (size_t i = 0; i < goodMatch.size(); ++i){// 从已找到的特征点中选择较好的特征点 objSrc.push_back(keypoints1[goodMatch[i].queryIdx].pt);sceneModle.push_back(keypoints2[goodMatch[i].trainIdx].pt);}// 将 模板 的场景进行透射变换到 目标 图像上Mat H = findHomography(sceneModle, objSrc,CV_RANSAC);// 获取模板的四个顶点std::vector<Point2f> obj_corners(4);obj_corners[0] = cvPoint(0, 0);obj_corners[1] = cvPoint(modle.cols, 0);obj_corners[2] = cvPoint(modle.cols, modle.rows);obj_corners[3] = cvPoint(0, modle.rows);RotatedRect rotateRect1 = minAreaRect(obj_corners);std::vector<Point2f> scene_corners(4);// 对输入的四个顶点进行透射变换,映射到目标场景perspectiveTransform(obj_corners, scene_corners, H);// 在目标场景绘制跟模板size一样的矩形 RotatedRect rotateRect2 = minAreaRect(scene_corners);for (int i=0; i < scene_corners.size(); i++){printf("X: %f,Y: %f", scene_corners[i].x, scene_corners[i].y);line(src, scene_corners[i],scene_corners[(i + 1)%4], Scalar(0, 255, 0));}imwrite("srcORB.jpg", src);drawMatches(src, keypoints1, modle, keypoints2, goodMatch, dst);imwrite("ORB.jpg", dst);getchar();}

原创粉丝点击