本文主要是介绍OpenCV入门12.2:SURF与SIFT比较及SURF示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
SIFT (Scale-Invariant Feature Transform):
- 提出时间: 1999年,由David Lowe提出。
- 关键特点: 能够检测和描述图像中的关键点,这些关键点对旋转、缩放和部分亮度变化具有不变性。
- 计算复杂度: 相对较高,因为SIFT使用了高斯差分核来检测关键点,并且需要在多个尺度空间进行操作。
- 应用: 广泛用于图像匹配、物体识别和3D重建。
SURF (Speeded-Up Robust Features):
- 提出时间: 2006年,由Hervé Bay等人提出。
- 关键特点: 作为SIFT的改进版本,SURF在保持特征点不变性的同时,显著提高了计算速度。
- 计算复杂度: 较低,SUR2算法通过使用积分图像和快速Hessian矩阵来加速关键点的检测。
- 应用: 类似于SIFT,SURF也用于图像匹配、物体识别等,但更适合实时或资源受限的应用场景。
特征点检测:积分图像和快速Hessian矩阵计算
积分图像:
- 积分图像是一种数据结构,用于快速计算图像的局部区域的像素和。
- 它通过预先计算并存储每个像素点的邻域像素和,从而加速了特征点检测过程中的积分操作。
快速Hessian矩阵:
- Hessian矩阵是一个二阶导数矩阵,用于衡量图像亮度变化的局部曲率。
- 在SURF中,快速Hessian矩阵的计算是通过积分图像来实现的,从而避免了在每个尺度空间中重复计算梯度。
SURF的关键点检测步骤:
- 使用高斯滤波器对原始图像进行平滑处理。
- 计算每个像素点的积分图像,以便快速获取局部区域的像素和。
- 使用快速Hessian矩阵在不同尺度和方向上检测关键点。
- 对检测到的关键点进行非极大值抑制,以选择最显著的关键点。
特征描述:特征点的方向赋值和描述子生成
方向赋值:
- 特征点的方向赋值是指为每个关键点分配一个主方向,这有助于描述子的旋转不变性。
- 在SURF中,通过计算关键点邻域内的梯度方向直方图来确定主方向。
- 主方向是直方图中具有最高响应的方向。
描述子生成:
- 描述子是关键点的局部特征的量化表示,用于图像匹配和识别。
- SURF描述子是通过在关键点周围的邻域内计算梯度的幅度和方向的直方图来生成的。
- 描述子通常是一个固定长度的向量,包含了关键点邻域内不同方向和尺度上的特征信息。
SURF描述子的特点:
- 旋转不变性:由于关键点的方向赋值,描述子对图像的旋转具有不变性。
- 尺度不变性:描述子在关键点检测时已经考虑了尺度变化。
- 部分亮度不变性:描述子对图像的亮度变化具有一定的鲁棒性。
SURF算法通过这些步骤提供了一种快速且鲁棒的特征点检测和描述方法,使其在许多计算机视觉任务中得到广泛应用。
opencv中SURF的应用示例如下:
#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main(int argc, char** argv) {// 检查图像路径是否已作为参数传递if (argc < 2) {cout << "Usage: DisplaySURFFeatures <Image_Path>" << endl;return -1;}Mat image;// 读取图像,使用cv::IMREAD_GRAYSCALE读取灰度图像image = imread(argv[1], IMREAD_GRAYSCALE);if(!image.data) {cout << "Could not open or find the image" << std::endl ;return -1;}// 创建SURF检测器,hessianThreshold参数可以根据需要调整double hessianThreshold = 100;Ptr<xfeatures2d::SURF> surf = xfeatures2d::SURF::create(hessianThreshold);// 检测关键点vector<KeyPoint> keypoints;Mat descriptors;surf->detectAndCompute(image, noArray(), keypoints, descriptors);// 绘制关键点Mat imageWithKeypoints;drawKeypoints(image, keypoints, imageWithKeypoints, Scalar::all(-1), DrawMatchesFlags::DRAW_RICH_KEYPOINTS);// 显示带有关键点的图像namedWindow("SURF Keypoints", WINDOW_NORMAL);imshow("SURF Keypoints", imageWithKeypoints);waitKey(0); // 等待用户按键return 0;
}
说明:
main
函数首先检查命令行参数中是否包含了图像路径。- 使用
imread
函数读取图像,这里使用cv::IMREAD_GRAYSCALE
标志来读取灰度图像。 - 创建一个
SURF
检测器对象,并使用create
方法设置Hessian阈值。 - 调用
detectAndCompute
方法来检测关键点并计算描述子。 - 使用
drawKeypoints
函数在图像上绘制关键点。 - 最后,使用
namedWindow
和imshow
函数显示带有关键点的图像。
这篇关于OpenCV入门12.2:SURF与SIFT比较及SURF示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!