我想了解更多关于KeyPoints的信息,所以有人能告诉我什么是KeyPoints吗?
KeyPoint::angle
在OpenCV文档中提到角度是关键点的计算方向(如果不适用则为-1)。我无法想象这是什么意思。请问有人能够解释一下或者提供一个小例子吗?
KeyPoint::octave
在OpenCV文档中提到octave是从中提取关键点的金字塔层。我无法想象这是什么意思。请问有人能够解释一下或者提供一个小例子吗?
我想了解更多关于KeyPoints的信息,所以有人能告诉我什么是KeyPoints吗?
在OpenCV文档中提到角度是关键点的计算方向(如果不适用则为-1)。我无法想象这是什么意思。请问有人能够解释一下或者提供一个小例子吗?
在OpenCV文档中提到octave是从中提取关键点的金字塔层。我无法想象这是什么意思。请问有人能够解释一下或者提供一个小例子吗?
如果有人不想阅读@sammy提到的Lowe的论文,这里是一些简短的摘要:
keypoint.octave
的值会是一个奇怪的数字(例如16253184),那是因为它实际上携带了以下信息:
octave
layer
unpackOctave
(参见OpenCV实现)将keypoint.octave
解压成变量octave
、layer
和scale
(其中scale
只是1/2 ^ octave
)。octave
和layer
,下面的图片可能会有所帮助:虽然我对角度和八度音符的概念有所了解,但我想知道float angle
表示什么意思,于是我查看了OpenCV2.3.1的源代码,在sift.cpp
中找到了答案。
inline KeyPoint featureToKeyPoint( const feature& feat )
{
float size = (float)(feat.scl * SIFT::DescriptorParams::GET_DEFAULT_MAGNIFICATION() * 4); // 4==NBP
float angle = (float)(feat.ori * a_180divPI);
return KeyPoint( (float)feat.x, (float)feat.y, size, angle, feat.response, feat.feature_data->octv, feat.class_id );
}
好的,我理解了角度定义,但是feat.ori
和a_180divPI
是什么?
后者很容易找到。
const double a_180divPI = 180./CV_PI;
前者需要一些努力,在浏览了几种方法之后,我得到了以下结果
struct feature
{
double x; /**< x coord */
double y; /**< y coord */
double scl; /**< scale of a Lowe-style feature */
double ori; /**< orientation of a Lowe-style feature */
...
};
需要计算的feat.ori
根据Lowe的论文(http://www.cs.ubc.ca/~lowe/papers/ijcv04.pdf)通过几个步骤来计算,包括计算ori_hist、平滑直方图和添加好的ori特征。
我不确定ori
的确切含义,但我强烈怀疑OpenCV已将ori
转换为适当的弧度表示法,最终结果angle
是正常意义上范围从-180度到180度的角度。证据如下:
1) ori = arctan2( dy, dx)
2) bin = cvRound( n * ( ori * CV_PI ) / PI_2 )
3) new_feat->ori = ( ( PI2 * bin ) / n ) - CV_PI;
希望能对您有所帮助。
SIFT
,角度在**-180到180度之间。然而,对于SURF
,角度在0到360**度之间。我不知道为什么。还要注意,在新文档中,它说如果不适用,则为_-1_ [链接](http://docs.opencv.org/modules/features2d/doc/common_interfaces_of_feature_detectors.html#float angle)。 - vancexu