本章内容:
* 1. 单张图像的特征点计算 cv::xfeatures2d::SURF->detect
* 2. 图像集合的特征点计算 cv::xfeatures2d::SURF->detect
* 3. 单张图像特征描述子计算 cv::xfeatures2d::SURF->compute
* 4. 图像集特征描述子计算 cv::xfeatures2d::SURF->compute
* 5. 一步计算特征点以及特征描述符 cv::xfeatures2d::SURF->detectAndCompute
1. 单张图像的特征点计算
输出结果:
2. 图像集合的特征点计算
输出结果:
3. 单张图像特征描述符计算
输出结果
4. 图像集合计算特征描述符
输出结果
5.直接计算特征点与特征描述符
输出结果
源码
#include <ostream>
#include <opencv.hpp>
#include<opencv2/opencv.hpp>
#include "opencv2/xfeatures2d.hpp"int main(int argc, char *argv[])
{
/*
本章内容:
* 1. 单张图像的特征点计算 cv::xfeatures2d::SURF->detect
* 2. 图像集合的特征点计算 cv::xfeatures2d::SURF->detect
* 3. 单张图像特征描述子计算 cv::xfeatures2d::SURF->compute
* 4. 图像集特征描述子计算 cv::xfeatures2d::SURF->compute
* 5. 一步计算特征点以及特征描述符 detectAndCompute
*/
cv::String fileName = "/home/wang/dev/Image/pingpang.jpeg";
cv::String fileName1 = "/home/wang/dev/Image/taohua.jpeg";
cv::Mat src = cv::imread(fileName);
cv::Mat src1 = cv::imread(fileName1);if(src.data == NULL){
printf("图像读入失败\n");
return -1;
}
/*
* API接口: CV_WRAP static Ptr<SURF> create(double hessianThreshold=100,
int nOctaves = 4, int nOctaveLayers = 3,
bool extended = false, bool upright = false);*/
cv::imshow("src",src);
cv::imshow("src1",src1);
cv::Ptr<cv::xfeatures2d::SURF> surf= cv::xfeatures2d::SURF::create();
/* 1. 单张图像的特征点计算 detect
api接口:CV_WRAP virtual void detect( InputArray image,
CV_OUT std::vector<KeyPoint>& keypoints,
InputArray mask=noArray() );
*/
std::vector<cv::KeyPoint> kp1;
surf->detect(src,kp1);
cv::Mat dst1;
cv::drawKeypoints(src,kp1,dst1);
cv::imshow("dst1",dst1);
/* 2. 图像集合的特征点计算 detect
api接口:CV_WRAP virtual void compute( InputArray image,
CV_OUT CV_IN_OUT std::vector<KeyPoint>& keypoints,
OutputArray descriptors );*/
std::vector<cv::Mat> srcs= {src,src1}; // 图像集合构造
std::vector<cv::Mat> dsts1; // 图像集合构造
std::vector<std::vector<cv::KeyPoint>> kps1;
surf->detect(srcs,kps1);
cv::String file;
cv::Mat tem;
for(int i=0; i < kps1.size();i++){
cv::drawKeypoints(srcs[i],kps1[i],tem);
dsts1.push_back(tem);
file = "dsts1 -> " + std::to_string(i);
cv::imshow(file,tem);
}/* 3. 单张图像特征描述子计算 compute
api接口:CV_WRAP virtual void compute( InputArray image,
CV_OUT CV_IN_OUT std::vector<KeyPoint>& keypoints,
OutputArray descriptors );
参数分析: keypoints :输入输出型特征点,*/
cv::Mat des1;
surf->compute(src,kp1,des1);
std::cout << "des1.size():" << des1.size() <<std::endl;
cv::normalize(des1,des1,255,0,cv::NORM_L2);
cv::transpose(des1,des1);
cv::imshow("des1", des1);
/* 4. 图像集特征描述子计算 compute
api接口:CV_WRAP virtual void compute( InputArrayOfArrays images,
CV_OUT CV_IN_OUT std::vector<std::vector<KeyPoint> >& keypoints,
OutputArrayOfArrays descriptors );*/
std::vector<cv::Mat> dess;
cv::Mat desNorm;
surf->compute(srcs,kps1,dess);
for(int i=0; i < dess.size();i++){
std::cout << "des ->[" << i << "] size= " << kps1[i].size() << std::endl;
file = "des -> " + std::to_string(i);
cv::normalize(dess[i],desNorm,255,0,cv::NORM_L2);
cv::transpose(desNorm,desNorm);
cv::imshow(file,desNorm);
}
/* 5. 一步计算特征点以及特征描述符 detectAndCompute
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> kp2;
cv::Mat des2;
surf->detectAndCompute(src,cv::Mat(),kp2,des2);
cv::normalize(des2,des2,255,0,cv::NORM_L2);
cv::transpose(des2,des2);
cv::Mat dst2;
cv::drawKeypoints(src,kp2,dst2);
cv::imshow("dst2",dst2);
cv::imshow("des",des2);cv::waitKey(0);
return 1;
}