我使用openCV做一些密集的特征提取。例如,代码
DenseFeatureDetector detector(12.f, 1, 0.1f, 10);
我真的不明白上面构造函数中的参数。这是什么意思?阅读关于它的opencv文档也没有多大帮助。在文档中,参数是:
DenseFeatureDetector( float initFeatureScale=1.f, int featureScaleLevels=1,
float featureScaleMul=0.1f,
int initXyStep=6, int initImgBound=0,
bool varyXyStepWithScale=true,
bool varyImgBoundWithScale=false );
他们应该做什么?例如,scale, initFeatureScale, featureScaleLevels等的含义是什么?如何知道密集采样的网格或网格间距等
我也使用opencv与密集检测器,我想我可以帮助你的东西。我不知道我该说些什么,但这段经历让我明白了这一点。
当我使用密集检测器时,我通过那里的灰度图像。检测器制作一些阈值过滤器,其中opencv使用灰度最小值来转换图像。píxels那里有一个比阈值更多的灰度级别将像黑点和其他是白点。这个动作在一个循环中重复,其中阈值将越来越大。所以参数initFeatureScale决定了你用来做这个循环的第一个阈值,featureScaleLevels参数表示这个阈值在一个循环迭代和下一个循环迭代之间大多少,featureScaleMul是计算下一个阈值的乘法因子。
无论如何,如果你正在寻找一个你的最佳参数,使用密集检测器来检测任何特定的点,你会提供一个程序,我做的。它在github中被解放。这是一个程序,您可以在其中测试一些检测器(Dense detector是其中之一),并检查它是如何工作的,如果您更改了它们的参数,这要感谢一个允许您在执行程序时更改检测器参数的用户界面。您将看到检测到的点是如何变化的。要尝试它只需点击链接,并下载文件。您可能需要几乎所有的文件来执行程序。
提前道歉,我主要使用Python,所以我将避免引用c++来让自己尴尬。
DenseFeatureDetector用KeyPoints填充一个矢量,传递给计算特征描述符。这些关键点有一个点向量和它们的尺度集。在文档中,scale是关键点的像素半径。
关键点在传递给DenseFeatureVector的图像矩阵的宽度和高度上均匀间隔。
现在是参数:
initFeatureScale 以像素为单位设置初始KeyPoint特征半径(据我所知这没有效果)
featureScaleLevels 我们希望作为关键点的尺度数
featureScaleMuliplier initFeatureScale在featureScaleLevels上的比例调整,这个比例调整也可以应用于边界(inittimgbound)和步长(initxystep)。因此,当我们设置featureScaleLevels>1时,这个乘数将应用于连续的尺度,以调整特征尺度,步长和图像周围的边界。
initXyStep 移动列和行步进像素。我希望不言自明。
initImgBound 因此,一个100x100的图像,inititimgbound为10,将在图像的80x80的中央部分创建关键点。
varyXyStepWithScale 布尔值,如果我们有多个featureScaleLevels,我们是否想使用featurescalemulplier来调整步长
varyImgBoundWithScale 布尔值,与varyXyStepWithScale一样,但应用于边框。
下面是来自OpenCV 2.4.3源代码中的detector .cpp的DenseFeatureDetector源代码,这可能会比我的话解释得更好:
DenseFeatureDetector::DenseFeatureDetector( float _initFeatureScale, int _featureScaleLevels,
float _featureScaleMul, int _initXyStep,
int _initImgBound, bool _varyXyStepWithScale,
bool _varyImgBoundWithScale ) :
initFeatureScale(_initFeatureScale), featureScaleLevels(_featureScaleLevels),
featureScaleMul(_featureScaleMul), initXyStep(_initXyStep), initImgBound(_initImgBound),
varyXyStepWithScale(_varyXyStepWithScale), varyImgBoundWithScale(_varyImgBoundWithScale)
{}
void DenseFeatureDetector::detectImpl( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask ) const
{
float curScale = static_cast<float>(initFeatureScale);
int curStep = initXyStep;
int curBound = initImgBound;
for( int curLevel = 0; curLevel < featureScaleLevels; curLevel++ )
{
for( int x = curBound; x < image.cols - curBound; x += curStep )
{
for( int y = curBound; y < image.rows - curBound; y += curStep )
{
keypoints.push_back( KeyPoint(static_cast<float>(x), static_cast<float>(y), curScale) );
}
}
curScale = static_cast<float>(curScale * featureScaleMul);
if( varyXyStepWithScale ) curStep = static_cast<int>( curStep * featureScaleMul + 0.5f );
if( varyImgBoundWithScale ) curBound = static_cast<int>( curBound * featureScaleMul + 0.5f );
}
KeyPointsFilter::runByPixelsMask( keypoints, mask );
}
你可能期望计算调用将计算额外的关键点特征使用相关的关键点检测算法(例如角度),基于由DenseFeatureDetector生成的关键点。不幸的是,Python下的SIFT不是这样的——我没有研究过其他的特征检测器,也没有研究过c++中的行为。
还请注意,DenseFeatureDetector不在OpenCV 3.2中(不确定它是在哪个版本被删除的)。