Keypoint数据结构
转载自:https://www.cnblogs.com/penuel/p/13251941.html
公有属性
(float)angle
:角度,表示关键点的方向,-1为初值。
(int)class_id
:当要对图片进行分类时,我们可以用class_id对每个特征点进行区分,未设定时为-1,需要靠自己设定
(int)octave
:代表是从金字塔哪一层提取的得到的数据。
(Point2f)pt
:关键点的点坐标
(float)response
:响应程度,代表该点强壮大小—response代表着该关键点how good,更确切的说,是该点角点的程度。
(float)size
:该点直径的大小
公有成员函数
三个构造函数
KeyPoint () : 默认构造函数
KeyPoint (Point2f _pt,
float _size,
float _angle=-1,
float _response=0,
int _octave=0,
int _class_id=-1)
参数
_pt : 关键点的x和y坐标
_size : 关键点直径
_angle : 关键点方向
_response:关键点上的关键点检测器响应(即关键点的强度)
_octave : 已检测到关键点的pyramid octave
_class_id: 关键点ID
KeyPoint (float x,
float y,
float _size,
float _angle=-1,
float _response=0,
int _octave=0,
int _class_id=-1)
参数
x : 关键点的x坐标
y : 关键点的y坐标
_size : 关键点直径
_angle : 关键点方向
_response:关键点上的关键点检测器响应(即关键点的强度)
_octave : 已检测到关键点的pyramid octave
_class_id: 关键点ID
size_t hash () const
静态公有成员函数
static void convert (const std::vector< KeyPoint> &keypoints,
std::vector< Point2f > &points2f,
const std::vector< int > &keypointIndexes=std::vector< int >())
此方法将关键点的矢量转换为点矢量或反向,其中每个关键点被指定相同的大小和相同的方向。
参数
keypoints : 从任何特征检测算法(如SIFT / SURF / ORB)获得的关键点 points2f :
每个关键点的(x,y)坐标数组 keypointIndexes : 要转换为点的关键点的索引数组。(像掩码一样只转换指定的关键点)
static void convert (const std::vector< Point2f> &points2f,
std::vector< KeyPoint > &keypoints, float size=1, float response=1,
int octave=0, int class_id=-1)
这是一个重载的成员函数,为方便起见而提供。它与上述函数的不同之处仅在于它接受的参数。
参数
points2f : 每个关键点的(x,y)坐标数组 keypoints : 从任何特征检测算法(如SIFT / SURF /
ORB)获得的关键点 size : 关键点直径 response : 关键点上的关键点检测器响应(即关键点的强度) octave
: 已检测到关键点的pyramid octave class_id : 关键点 id static float overlap
static float overlap(const KeyPoint &kp1, const KeyPoint &kp2)
此方法计算关键点对的重叠。重叠是关键点区域交叉区域与关键点区域联合区域之间的比率(将关键点区域视为圆圈)。如果它们不重叠,我们就会得到零。如果它们在相同大小的相同位置重合,我们得到 1。
参数
kp1 : First keypoint
kp2 : Second keypoint
OpenCV Mat数据类型指针ptr的使用
转载自:https://blog.csdn.net/kupar/article/details/79823054
常用形式:
mat.ptr<type>(row)[col]
对于Mat的ptr
函数,返回的是<>
中的模板类型指针,指向的是()
中的第row行的起点
通常<>
中的类型和Mat的元素类型应该一致
然后再用该指针去访问对应col列位置的元素
直接看下面的例子:
单通道
cv::Mat image = cv::Mat(400, 600, CV_8UC1); //定义了一个Mat变量image。
uchar * data00 = image.ptr<uchar>(0); //data00是指向image第一行第一个元素的指针。
uchar * data10 = image.ptr<uchar>(1); //data10是指向image第二行第一个元素的指针。
uchar * data01 = image.ptr<uchar>(0)[1];//data01是指向image第一行第二个元素的指针。
多通道
cv::Mat image = cv::Mat(400, 600, CV_8UC3); //宽400,长600,3通道彩色图片
cv::Vec3b * data000 = image.ptr<cv::Vec3b>(0);
cv::Vec3b * data100 = image.ptr<cv::Vec3b>(1);
cv::Vec3b * data001 = image.ptr<cv::Vec3b>(0)[1];
cv::Vec3b * data
看完了这些,就能解释
ushort d = d1.ptr<unsigned short>(int(keypoints_1[m.queryIdx].pt.y))[int(keypoints_1[m.queryIdx].pt.x)];
表示取出keypoints_1
中第[匹配id]
个特征点的y坐标和keypoints_1
中第[匹配id]
个特征点的x坐标对应的点的数值。
d1
是深度图,这个数值表示深度。
※另外,Mat中横纵坐标如下: