OpenCV实现中的SIFT方向
问题描述:
在SIFT的OpenCV实现中,关键点具有度数(范围从180到-180)的角度(角度),表示这些关键点的计算方向。由于SIFT使用直方图中的10度分区来分配关键点的主导方向,我们如何能够获得这个角度范围?不应该在10度的步骤?OpenCV实现中的SIFT方向
这是因为直方图平滑吗?
这是keypoint.angle被赋值的代码,你能帮我理解我们如何得到这个值吗?
float omax = calcOrientationHist(gauss_pyr[o*(nOctaveLayers+3) + layer],
Point(c1, r1),
cvRound(SIFT_ORI_RADIUS * scl_octv),
SIFT_ORI_SIG_FCTR * scl_octv,
hist, n);
float mag_thr = (float)(omax * SIFT_ORI_PEAK_RATIO);
for(int j = 0; j < n; j++)
{
int l = j > 0 ? j - 1 : n - 1;
int r2 = j < n-1 ? j + 1 : 0;
if(hist[j] > hist[l] && hist[j] > hist[r2] && hist[j] >= mag_thr)
{
float bin = j + 0.5f * (hist[l]-hist[r2])/(hist[l] - 2*hist[j] + hist[r2]);
bin = bin < 0 ? n + bin : bin >= n ? bin - n : bin;
kpt.angle = 360.f - (float)((360.f/n) * bin);
if(std::abs(kpt.angle - 360.f) < FLT_EPSILON)
kpt.angle = 0.f;
keypoints.push_back(kpt);
}
}
答
我想我找到了我的问题的答案。
抛物线拟合到最接近每个峰值的3个直方图值以插入峰值位置以获得更好的准确性。这就是为什么我们可以获得连续的值范围而不是10个步骤值。
这是我们如何适应抛物线3点链接: Curve fitting
虽然这个问题很有趣它不是严格意义上的编程问题,属于在其他网站上,可能适合针对http:// CS。 stackexchange.com/ – EdChum
我认为你是对的,谢谢你的通知:) –
它可能值得阅读描述描述符的原始文件,我的理解是描述符是规模和方向不变的,但你仍然需要知道角度,以便您可以确定描述符是否描述了相同的特征 – EdChum