我目前正在处理对象分类问题。我的目标是使用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;
}
我使用以下代码计算这些关键点上的SURF描述符:
Mat computeSURFDescriptors(Mat image, vector<KeyPoint> keypoints) {
SurfDescriptorExtractor extractor;
Mat descriptors;
extractor.compute(image, keypoints, descriptors);
return descriptors;
}
我面临的问题是描述符的大小因图像而异。描述符包含64个元素FOR EACH FEATURE POINT。为了训练神经网络,我希望修改描述符的大小。为此,我使用PCA来减少描述符大小,如下所示:
Mat projection_result;
PCA pca(descriptors, Mat(), CV_PCA_DATA_AS_COL, 64);
pca.project(descriptors,projection_result);
return projection_result;
这样做,我可以减少描述符的尺寸,但是所选择的特征点不能代表图像,并且会导致匹配结果不佳。如何通过保留好的特征点来减少描述符的维度?任何帮助将不胜感激。
答案 0 :(得分:0)
我正在寻找其他东西,所以没有专家,但我碰巧知道Matlab有一个功能'points.selectstrongest(x)',x是你想要的点数。该功能选择具有最强度量的点。
度量是Matlab函数'detectSURFFeatures'赋予SURFpoints的属性。我通过OpenCV函数'vision.internal.buildable.fastHessianDetectorBuildable.fastHessianDetector_uint8'在'detectSURFFeatures'中给出度量标准
答案 1 :(得分:0)
您可以使用特征检测中返回的每个关键点的响应值。根据响应值对关键点进行排序应该是可行的方法,但我从未对此进行过测试。
请参阅:https://github.com/Itseez/opencv/blob/master/modules/core/include/opencv2/core/types.hpp#L697
答案 2 :(得分:0)
假设您在谈论每个图像中不同数量的关键点(而不是不同的描述符长度)。关键点的数量是相同的,它不是一对一的连接,这没有多大意义。所以,我不知道做PCA背后的想法是什么,在每张图片中你会得到不同的结果。
还有一些其他常用方法可以检查功能对应关系,请参阅Feature matching。基本上,他们检查描述符向量之间的距离。
我认为您尝试做的事情与功能匹配有点不同,所以我建议您查看object detection