OpenCV提供的视觉处理算法非常丰富,并且她部分以C语言编写,加上其开源的特性,处理得当,不需要添加新的外部支持也可以完整的编译连接生成执行程序。
SIFT算法的特点有:
1. SIFT特征是图像的局部特征,其对旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也保持一定程度的稳定性;
2. 独特性(Distinctiveness)好,信息量丰富,适用于在海量特征数据库中进行快速、准确的匹配;
3. 多量性,即使少数的几个物体也可以产生大量的SIFT特征向量;
4. 高速性,经优化的SIFT匹配算法甚至可以达到实时的要求;
5. 可扩展性,可以很方便的与其他形式的特征向量进行联合。
BF算法:
即暴风(Brute Force)算法,是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符;若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果。BF算法是一种蛮力算法。
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/nonfree/features2d.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, const char *argv[]){
Mat I1 = imread("添加图片地址", 0);// 载入灰度图像 ,0表示灰度图像
Mat I2 = imread("添加图片地址", 0);
SiftFeatureDetector detector; //sift特征提取
vector<KeyPoint> keypoints1, keypoints2; // 定义关键点
detector.detect(car1, keypoints1); //检测关键点
detector.detect(car2, keypoints2);
cout << "# keypoints of I1 :" << keypoints1.size() << endl; //输出关键点的数量
cout << "# keypoints of I2 :" << keypoints2.size() << endl;
Mat descriptors1,descriptors2; //定义描述符
Ptr<DescriptorExtractor> extractor = DescriptorExtractor::create("SIFT"); //描述符提取
extractor->compute(I1,keypoints1,descriptors1);
extractor->compute(I2,keypoints2,descriptors2); //提取关键点的和描述关键点
BFMatcher bfmatcher(NORM_L2, true); // 暴风匹配
vector<DMatch> matches;
bfmatcher.match(descriptors1, descriptors2, matches);
cout << "# matches : " << matches.size() << endl;
// 显示图像
Mat output;
drawMatches(I1, keypoints1, I2, keypoints2, matches, output); //对两幅图上的关键点进行连线
imshow("匹配结果",output);
imshow("载入原始图像地址",I1);
imshow("载入原始图像地址",I2);
waitKey(0);
return 0;
}
实验结果:
参考:
Common Interfaces of Descriptor Matchers