特征点与角点在宏观定义上相同,都是能够表现图像中局部特征的像素点,但是特征点区别于角点的是其具有能够唯一描述像素点特征的描述子,例如该点左侧像素比右侧像素的像素值大、该点是局部最低点等.通常特征点由关键点和描述子组成。例如SIFT
特征点、 O
RB
特征点等,都需要
先计算关键点坐标
之后再计算描述子.
1.关键点
![](https://i-blog.csdnimg.cn/blog_migrate/5e8e554682916a32a85d4e2e6323f4d2.png)
2.描述子
描述子是用来唯一描述关键点的一串数字,与每个人的个人信息类似。
通过描述子可以区分两个不同的关键点,也可以在不同的图像中寻找同一个关键点.描述子的构
建方
式多种多样。
例如统计关键点周围每个像素点的梯度、随机比较周围 128
对像素点像素值的大小组成描述向量等.
Features
2D类
同样提供了用于计算每种特征
点描述子的co
mpute()函
数,
该函数的原型如下:
![](https://i-blog.csdnimg.cn/blog_migrate/0ab0d55c0d82620287b55202ad45b493.png)
3.SIFT特征点检测
SIFT
特征点之所以备受欢迎是因
为其在
光照、噪声、视角、缩放和旋转等干扰下仍然具有良好的稳定性.
![](https://i-blog.csdnimg.cn/blog_migrate/6fd3a6b7b09c1df0c721bfdfbbbec009.png)
4.SURF特征点检测
void visionagin::MySURF()
{
Mat img = imread("C:\\Users\\86176\\Downloads\\visionimage\\women.jfif");
if (img.empty() == true)
{
cout << "读取失败!" << endl;
}
imshow("原图", img);
Ptr <SURF> surf = SURF::create(500, 4, 3, true, false);//128维,创建SURF类
Mat imgcopy;
img.copyTo(imgcopy);
vector<KeyPoint> keypoints;
//计算关键点
surf->detect(img, keypoints);
//计算特征点
Mat descriptions;
surf->compute(img, keypoints, descriptions);
drawKeypoints(img, keypoints, img, Scalar(255, 255, 255));
drawKeypoints(img, keypoints, imgcopy, Scalar(255, 255, 255),DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
imshow("无方向", img);
imshow("带方向", imgcopy);
}
5.ORB特征点检测
即使
SURF
特征点已经对
SIFT
进行改进,提高了计算速度,但是应用在没有
GPU
的环境中时仍然很难保证算法的实行性。
ORB
特征点以计算速度快著称,计算速度可以达到
SURF
特征点
10
倍、
SIFT
特征点的
100倍,
因此近些年在计算机视觉领域受到广泛关注。
![](https://i-blog.csdnimg.cn/blog_migrate/85485cbbe0b1145e5db1a23f945fbef9.png)
void visionagin:: MyORB()
{
Mat img = imread("C:\\Users\\86176\\Downloads\\visionimage\\women.jfif");
if (img.empty() == true)
{
cout << "读取失败!" << endl;
}
imshow("原图", img);
Ptr<ORB> orb = ORB::create(
500,//特征点数目
1.2,//金字塔层级间缩放比例
8,//金字塔层数系数
31,//边缘阈值
0,//原图在金字塔的层级
2,//生成描述子需要的像素点数目
ORB::HARRIS_SCORE,//使用HARRIS方法评价特征点
31,// 生成描述子时关键点周围邻域的尺寸
20);//计算 FAST 角点时像素值差值的阈值
vector<KeyPoint> keypoints;
orb->detect(img, keypoints);
Mat descriptions;
orb->compute(img, keypoints, descriptions);
Mat imgcopy;
img.copyTo(imgcopy);
drawKeypoints(img, keypoints, img, Scalar(255, 255, 255));
drawKeypoints(img, keypoints, imgcopy, Scalar(255, 255, 255),DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
imshow("不带方向", img);
imshow("带方向", imgcopy);
}