Opencv 如何选择好的冲浪功能关键点?

Opencv 如何选择好的冲浪功能关键点?,opencv,neural-network,pca,feature-extraction,surf,Opencv,Neural Network,Pca,Feature Extraction,Surf,我目前正在研究对象分类问题。我的目标是使用SURF描述符在opencv中训练基于MLP的人工神经网络,并生成用于对象分类的模型。到目前为止,我取得了以下成就: 我正在使用以下代码计算SURF关键点: vector<KeyPoint> computeSURFKeypoints(Mat image) { SurfFeatureDetector surfdetector(400, 4, 2, true, false); vector<KeyPoint> keyp

我目前正在研究对象分类问题。我的目标是使用SURF描述符在opencv中训练基于MLP的人工神经网络,并生成用于对象分类的模型。到目前为止,我取得了以下成就:

我正在使用以下代码计算SURF关键点:

vector<KeyPoint> computeSURFKeypoints(Mat image) {
    SurfFeatureDetector surfdetector(400, 4, 2, true, false);
    vector<KeyPoint> keypoints;
    surfdetector.detect(image, keypoints);
    return keypoints;
}
Mat computeSURFDescriptors(Mat image, vector<KeyPoint> keypoints) {
    SurfDescriptorExtractor extractor;
    Mat descriptors;
    extractor.compute(image, keypoints, descriptors);
    return descriptors;
}

通过这样做,我能够减少描述符的维数,但所选的特征点不能代表图像,它们会导致较差的匹配结果。如何通过保留好的特征点来降低描述符的维数?任何帮助都将不胜感激

我在寻找完全不同的东西,所以没有专家,但我碰巧知道Matlab有一个功能“points.selectstrong(x)”,如果x是你想要的点数。该功能将拾取具有最强度量的点


度量是Matlab函数“detectSURFFeatures”赋予SURFpoints的属性。I度量由OpenCV函数“vision.internal.buildable.Fasthessian和DetectorBuildable.Fasthessian和Detector_uint8”在“detectSURFFeatures”中给出。

您可以使用特征检测中返回的每个关键点的响应值。根据响应值对关键点进行排序应该是一种方法,但是我从未测试过这一点


请参阅:

假设您正在讨论每个图像中不同数量的关键点(而不是不同的描述符长度)。关键点的数量相同没有多大意义,这不是一对一的连接。所以,我不知道PCA背后的想法是什么,在每幅图像中,你会得到不同的结果

还有一些其他常用的方法来检查特征对应关系,请参见。基本上,他们检查描述符和向量之间的距离


我认为您正在尝试做一些与功能匹配稍有不同的事情,因此我建议您查看一下

对不起,但这与Matlab无关。此外,opencv没有一个名为vision.internal.buildable.fasthessian和detector buildable.fasthessian和detector_uint8的函数“…描述符的大小因图像而异。描述符包含每个要素点的64个元素,这是没有意义的。SURF描述符是64或128个元素。您将扩展标志标记为True,因此应该得到128个元素。我猜您谈论的是不同数量的要素?描述符计数因图像而异(而不是大小)。为了克服这一问题,通常会采用一袋词聚类法(最终,你会将一个固定的N维向量(包含到字典的距离)输入到你的ml中)@berak:请你详细说明一下好吗?也许会用你的想法发布一个答案?例如,看一看
Mat projection_result;
PCA pca(descriptors, Mat(), CV_PCA_DATA_AS_COL, 64);
pca.project(descriptors,projection_result);
return projection_result;