特征点的提取与匹配

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();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值