opencv SIFT、特征点属性、特征描述符计算

本章内容:


        1. 初步认识 cv::SIFT 特征点检测
        2. 特征点属性
        3. 特征描述符计算
        4. 特征点检测,特征描述符计算

1. 初步认识 cv::SIFT

opencv SIFT、特征点属性、特征描述符计算_第1张图片

输出结果:

 

2. 特征点属性

 

opencv SIFT、特征点属性、特征描述符计算_第2张图片

输出结果

opencv SIFT、特征点属性、特征描述符计算_第3张图片

3. 特征描述符计算

opencv SIFT、特征点属性、特征描述符计算_第4张图片

输出结果

opencv SIFT、特征点属性、特征描述符计算_第5张图片

4. 特征点以及特征描述子计算

opencv SIFT、特征点属性、特征描述符计算_第6张图片

输出结果

opencv SIFT、特征点属性、特征描述符计算_第7张图片

 

源码

#include
#include
#include
#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 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 sift = cv::SIFT::create(200);
    /* 特征点检测
     * api接口:CV_WRAP virtual void detect( InputArray image,
                                 CV_OUT std::vector& keypoints,
                                 InputArray mask=noArray() );
    */
    std::vector 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 >& 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& keypoints,
                                           OutputArray descriptors,
                                           bool useProvidedKeypoints=false );

    */
    std::vector 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;
}

 

 

 

 

 

 

 

你可能感兴趣的:(opencv计算机视觉,opencv,计算机视觉)