opencv SIFT、特征点属性、特征描述符计算
本章内容:
1. 初步认识 cv::SIFT 特征点检测
2. 特征点属性
3. 特征描述符计算
4. 特征点检测,特征描述符计算
1. 初步认识 cv::SIFT
输出结果:
2. 特征点属性
输出结果
3. 特征描述符计算
输出结果
4. 特征点以及特征描述子计算
输出结果
源码
#include <ostream>
#include <opencv.hpp>
#include<opencv2/opencv.hpp>
#include "opencv2/xfeatures2d.hpp"int main(int argc, char *argv[])
{
/*
本章内容:
1. 初步认识 cv::SIFT 特征点检测
2. 特征点属性
3. 特征描述符计算
4. 特征点检测,特征描述符计算
*/
cv::String fileName = "/home/wang/dev/Image/heihei.jpeg";
cv::Mat src = cv::imread(fileName);
cv::Mat src1 = src.clone();
if(src.data == NULL){
printf("图像读入失败\n");
return -1;
}
cv::imshow("src",src);
/*1. 初步认识 cv::SIFT
* api接口: CV_WRAP static Ptr<SIFT> create(int nfeatures = 0, int nOctaveLayers = 3,
double contrastThreshold = 0.04, double edgeThreshold = 10,
double sigma = 1.6);
参数分析:
nfeatures: 最优特征数目,得分最高的前n个特征
nOctaveLayers: 金字塔每组Octave成熟
contrastThreshold: 特征阈值: contrastThreshold
sigma: 高斯标准差
*/
cv::Ptr<cv::SIFT> sift = cv::SIFT::create(200);
/* 特征点检测
* api接口:CV_WRAP virtual void detect( InputArray image,
CV_OUT std::vector<KeyPoint>& keypoints,
InputArray mask=noArray() );
*/
std::vector<cv::KeyPoint> kp;
sift->detect(src,kp);
cv::Mat dst;
cv::drawKeypoints(src,kp,dst);
cv::imshow("dst", dst);
// 2.特征点属性
std::cout << "KeyPs.size():= " << kp.size() << std::endl;
std::cout << "KeyPs[0].pt:= " << kp[0].pt << std::endl;
std::cout << "KeyPs[0].size:= " << kp[0].size << std::endl;
std::cout << "KeyPs[0].angle:= " << kp[0].angle << std::endl;
std::cout << "KeyPs[0].octave:= " << kp[0].octave << std::endl;
std::cout << "KeyPs[0].class_id:= " << kp[0].class_id << std::endl;/*3.特征描述符计算
CV_WRAP virtual void compute( InputArrayOfArrays images,
CV_OUT CV_IN_OUT std::vector<std::vector<KeyPoint> >& keypoints,
OutputArrayOfArrays descriptors );
*/
cv::Mat des;
sift->compute(src,kp,des);
cv::normalize(des,des,255,0,cv::NORM_L2);
cv::transpose(des,des);
cv::imshow("des",des);/*4. 特征点以及特征描述子计算
* api接口:CV_WRAP virtual void detectAndCompute( InputArray image, InputArray mask,
CV_OUT std::vector<KeyPoint>& keypoints,
OutputArray descriptors,
bool useProvidedKeypoints=false );*/
std::vector<cv::KeyPoint> kp1;
cv::Mat des1;
sift->detectAndCompute(src1,cv::Mat(),kp1,des1);
cv::Mat dst1;
cv::drawKeypoints(src1, kp1,dst1);
cv::imshow("src1",src1);
cv::imshow("dst1",dst1);
cv::normalize(des1,des1,255,0,cv::NORM_L2);
cv::transpose(des1,des1);
cv::imshow("des1",des1);cv::waitKey(0);
return 1;
}