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();
}
特征点的提取与匹配
最新推荐文章于 2022-06-19 09:52:06 发布