我正在使用OpenCV 2.4.3 c ++接口来查找两个图像之间的匹配点.第一次尝试是使用SURF.唯一的问题是消耗时间,所以我尝试了新的FREAK提取器.使用SURF进行检测和FREAK进行描述,我意识到FREAK将关键点的数量减少到几乎检测到的一半,并且得到的匹配不够.这就是原因,我尝试了FAST以获得更多关键点.结果:
之后,我使用了ORBFeatureDetector,它获得了与FAST相同数量的关键点,但在FREAK提取器之后,每个图像的结果关键点为0.难道我做错了什么?ORB关键点是否与从FAST获得的关键点不同?也许我可以为此开另一个问题,但我有最后一个问题.检测器/提取器的最佳组合是什么才能获得与使用SURF的第一次实验相同的结果,但缩短处理时间?因为虽然我使用了FREAK,但是当我获得更多关键点时,提取器部分也更耗时.
我试图使用Opencv在Python中实现FREAK描述符.这是我正在使用的代码:
def surf_freak_detect(image,hessianThreshold):
surfDetector = cv2.SURF(hessianThreshold)
surfDetector=cv2.GridAdaptedFeatureDetector(surfDetector,50)
keypoints = surfDetector.detect(image,None)
freakExtractor = cv2.DescriptorExtractor_create('FREAK')
keypoints,descriptors= freakExtractor.compute(image,keypoints)
del freakExtractor
return keypoints,descriptors
Run Code Online (Sandbox Code Playgroud)
这是初始化怪胎描述符的正确方法吗?通过一些调试,我发现解释器需要花费很长时间来计算描述符然后最终崩溃.正确检测关键点.奇怪的是,它有时有效,有时只是崩溃!
我正在尝试从freak_demo.cpp 示例之后的最新版本的OpenCV中获取全新的描述符FREAK .而不是使用SURF我使用FAST.我的基本代码是这样的:
std::vector<KeyPoint> keypointsA, keypointsB;
Mat descriptorsA, descriptorsB;
std::vector<DMatch> matches;
FREAK extractor;
BruteForceMatcher<Hamming> matcher;
FAST(imgA,keypointsA,100);
FAST(imgB,keypointsB,20);
extractor.compute( imgA, keypointsA, descriptorsA );
extractor.compute( imgB, keypointsB, descriptorsB );
matcher.match(descriptorsA, descriptorsB, matches);
Run Code Online (Sandbox Code Playgroud)
我正在使用MATLAB 2014a来提取BRISK和FREAK描述符.我找不到任何将位串大小减小到128或256的选项,它们都生成为512位.我认为FREAK不允许这种算法,但BRISK应该允许.有谁知道我是否可以减少BRISK描述符的维度?如果是,我该怎么办?
谢谢
我有一个来自FREAK描述提取的描述符矩阵,其中每一行是64个元素的描述符.
vector <int*>由于系统要求,我需要从这个矩阵创建一个.到目前为止我试过这个:
Mat _descriptors;
std::vector<int*> descriptors;
int row;
for (int i=0; i<_descriptors.rows;i++)
{
row =(int) _descriptors.row(i).data;
descriptors.push_back( & row );
}
Run Code Online (Sandbox Code Playgroud)
这是正确的还是有更好的方法?
我正在OpenCV 2.4中开发一些代码,我想测试FREAK检测器,但是我得到了编译错误.我包含feature2d.h,我该怎么做才能解决这个问题?