冲浪特征提取
问题描述:
目标:通过使用Surf descriptors
和opencv 2.4.9
库匹配斑点。冲浪特征提取
算法:基于以下链接:Steps
#include <stdio.h>
#include <iostream>
#include "opencv2/core/core.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/nonfree/features2d.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/nonfree/nonfree.hpp"
using namespace cv;
void readme();
/** @function main */
int main(int argc, char** argv)
{
if(argc != 3)
{ readme(); return -1; }
Mat img_1 = imread(argv[1], CV_LOAD_IMAGE_GRAYSCALE);
Mat img_2 = imread(argv[2], CV_LOAD_IMAGE_GRAYSCALE);
if(!img_1.data || !img_2.data)
{ std::cout<< " --(!) Error reading images " << std::endl; return -1; }
//-- Step 1: Detect the keypoints using SURF Detector
int minHessian = 400;
SurfFeatureDetector detector(minHessian);
std::vector<KeyPoint> keypoints_1, keypoints_2;
detector.detect(img_1, keypoints_1);
detector.detect(img_2, keypoints_2);
//-- Draw keypoints
Mat img_keypoints_1; Mat img_keypoints_2;
drawKeypoints(img_1, keypoints_1, img_keypoints_1, Scalar::all(-1), DrawMatchesFlags::DEFAULT);
drawKeypoints(img_2, keypoints_2, img_keypoints_2, Scalar::all(-1), DrawMatchesFlags::DEFAULT);
//-- Show detected (drawn) keypoints
imshow("Keypoints 1", img_keypoints_1);
imshow("Keypoints 2", img_keypoints_2);
waitKey(0);
return 0;
}
/** @function readme */
void readme()
{ std::cout << " Usage: ./SURF_detector <img1> <img2>" << std::endl; }
结果关键点检测:在下面的图像的关键点的数目是非常高的,而不是许多是重要。如何选择最能描述blob的关键点的最佳子集。除Surf之外还有更好的方法吗?这些斑点是二进制
答
较高minHessian
将产生较少的关键点。
很难从图像中分辨出你试图匹配的两个输入图像是什么,你的目标究竟是什么(将“Vos ..”的“Vo”与“Votre ...” “是成功还是失败?
目前我不想加工这些图像我想知道如何选择最佳的keyPoints子集,你认为可以得到相同结果的关键点越少TY – 2014-12-03 11:45:24
这取决于图像,但较弱的关键点通常不太可靠,关键点较少会使模型选择更加可靠/可靠。其他启发式方法可能会将图像分割为平铺并选择每个平铺N个关键点(以及可能来自整个图像的剩余K个最强关键点)。您也可以放弃接近相同的关键点,因为它们通常表示有纹理的区域并且难以匹配。 – 2014-12-04 12:26:14