- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在深入研究 OpenCV's implementation of SIFT descriptor extraction .我遇到了一些令人费解的代码来获取兴趣点邻域的半径。下面是带注释的代码,变量名更改为更具描述性:
// keep octave below 256 (255 is 1111 1111)
int octave = kpt.octave & 255;
// if octave is >= 128, ...????
octave = octave < 128 ? octave : (-128 | octave);
// 1/2^absval(octave)
float scale = octave >= 0 ? 1.0f/(1 << octave) : (float)(1 << -octave);
// multiply the point's radius by the calculated scale
float scl = kpt.size * 0.5f * scale;
// the constant sclFactor is 3 and has the following comment:
// determines the size of a single descriptor orientation histogram
float histWidth = sclFactor * scl;
// descWidth is the number of histograms on one side of the descriptor
// the long float is sqrt(2)
int radius = (int)(histWidth * 1.4142135623730951f * (descWidth + 1) * 0.5f);
我知道这与转换为获取兴趣点的比例有关(我已阅读 Lowe 的论文),但我无法将这些点与代码联系起来。具体来说,我不明白前 3 行和最后一行。
我需要理解这一点才能为运动创建类似的局部点描述符。
最佳答案
I don't understand the first 3 lines
事实上,这个 SIFT 实现编码 KeyPoint
中的几个值octave
属性。如果您引用 line 439你可以看到:
kpt.octave = octv + (layer << 8) + (cvRound((xi + 0.5)*255) << 16);
这意味着 Octave 音阶存储在第一个字节 block 中,层存储在第二个字节 block 中,依此类推。
所以 kpt.octave & 255
(可以在 unpackOctave
方法中找到)只是屏蔽关键点 Octave 以检索有效 Octave 值。
此外:此 SIFT 实现使用负的第一个 Octave 音阶 (int firstOctave = -1
) 来处理更高分辨率的图像。由于 Octave 索引从 0 开始,因此计算映射:
octave index = 0 => 255
octave index = 1 => 0
octave index = 2 => 1
...
此映射是在 line 790 处计算的:
kpt.octave = (kpt.octave & ~255) | ((kpt.octave + firstOctave) & 255);
因此上面的第二行只是映射回这些值的一种方式:
octave = 255 => -1
octave = 0 => 0
octave = 1 => 1
..
第三行只是一种计算音阶的方法,考虑到负 Octave 音阶给出的音阶 > 1,例如 1 << -octave
为 octave = -1
给出 2这意味着它的大小增加了一倍。
[I don't understand] last line.
基本上它对应于包裹尺寸为 D
的方形 block 的圆的半径,因此 sqrt(2)
和除以 2。D
通过乘法计算:
您确实可以在vlfeat's SIFT implementation 中找到详细说明。 :
The support of each spatial bin has an extension of SBP = 3sigma pixels, where sigma is the scale of the keypoint. Thus all the bins together have a support SBP x NBP pixels wide. Since weighting and interpolation of pixel is used, the support extends by another half bin. Therefore, the support is a square window of SBP x (NBP + 1) pixels. Finally, since the patch can be arbitrarily rotated, we need to consider a window 2W += sqrt(2) x SBP x (NBP + 1) pixels wide.
最后强烈推荐大家引用这个vlfeat SIFT documentation .
关于c++ - OpenCV SIFT 描述符关键点半径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17015995/
我正在检测图像中的 SURF 特征,然后将它们写入 yml 文件。然后我想再次从 yml 文件加载特征以尝试检测对象,但目前我无法加载关键点以将它们绘制在图像上。 我是这样写要点的: cv::File
我正在学习 OpenCV,目前我正在尝试了解存储在 KeyPoint 中的基础数据,以便我可以更好地将这些数据用于我正在处理的应用程序。 到目前为止,我已经浏览了这两个页面: http://docs.
我想了解更多关于KeyPoints的知识,谁能告诉我什么是 关键点::角度 在 OpenCV 文档中提到角度是计算关键点的方向(如果不适用则为 -1)。我无法想象那是什么。那么谁能告诉我这是什么意思或
我有 3D 多边形:实体(第一种情况)和平面(第二种情况)。如何确定主控点(key point)?例如:圆柱体的主点是其盖子的中心。 我不能使用凸包算法,因为主点可以是船体的一部分,而且我不能用平面
我想在opencv中实现一揽子单词。在检测器之后-> detect(img,keypoint);当我想使用keypoint.clear()清理关键点时,会检测到关键点;或者当函数想要返回时,将出现以下
我在 python 中有以下代码 import cv2 import numpy as np def save_keypoints(image_path, type_image): img =
我想要代码根据 SIFT 关键点匹配两张图片。? 我有以下用于 SIFT 的代码 public static Image siftFunction(Bitmap sourceBitmap) {
我正在处理生物信息学的任务,需要从一些细胞图像中提取一些特征。 我使用 SIFT 算法提取图像内部的关键点,如图所示。 正如您在图片中也看到的(红色圈出),一些关键点是异常值,我不想计算它们的任何特征
在搜索了这个(1、2、3、4)的答案后,我仍然对两者感到困惑 如果可能的话 如果是,怎么做 我希望能够从一个 .xml 文件中读取,该文件有一个包含 cv::Mat 的 Point2f keypoin
我尝试比较两个不同图像中的两个点,所以我想将坐标转换为关键点,以便稍后用它们计算描述和匹配结果。 我找到了方法: keypoint = cv2.KeyPoint(x, y, 0) vec = [k
我是一名 Asp.net 开发人员,但对 Asp.net Identity 框架非常陌生。我一直在研究示例应用程序并遵循了一些关于身份的教程,但我仍然无法完全掌握这个概念。我对 Asp.net 成员(
我是一名优秀的程序员,十分优秀!