zoukankan      html  css  js  c++  java
  • “SurfFeatureDetector”: 未声明的标识符/不能实例化抽象类

    《OpenCV3编程入门》配套示例程序89:SURF特征点检测示例中,出现的问题及解决方法:


    问题一:

    直接按照原文代码写,报错“SurfFeatureDetector”: 未声明的标识符

    	.......
    //【2】定义需要用到的变量和类 int minHessian = 400;//定义SURF中的hessian阈值特征点检测算子 SurfFeatureDetector detector( minHessian );//定义一个SurfFeatureDetector(SURF) 特征检测类对象 std::vector<KeyPoint> keypoints_1, keypoints_2;//vector模板类是能够存放任意类型的动态数组,能够增加和压缩数据 //【3】调用detect函数检测出SURF特征关键点,保存在vector容器中 detector.detect( srcImage1, keypoints_1 ); detector.detect( srcImage2, keypoints_2 );
    .......

      解决方法:

    头文件加上:(SURF算法在opencv3中是nonfree的)

    //OpenCV
    #include <opencv/cv.hpp>
    #include<xfeatures2d/nonfree.hpp>
    #include "opencv2/core/core.hpp"
    #include "opencv2/features2d/features2d.hpp"
    #include "opencv2/highgui/highgui.hpp"
    

      最重要的是加上:

    using namespace xfeatures2d;
    

      (试了一下,头文件加上各种.hpp后还是报错未声明标识符,加上这句话就OK了)

    问题二:

    进行以上操作后,又会出现新的报错"SurfFeatureDetector”: 不能实例化抽象类",需要将代码改为:

    //SURF特征点检测
    cv::Mat BasicAlgorithm::on_SURF(cv::Mat mat)
    {
        //【1】载入源图片并显示
        Mat srcImage1 = mat;
        Mat srcImage2= imread("C:\Users\asus\Desktop\2.jpg");
        
        //【2】定义需要用到的变量和类
        int minHessian = 400; //定义SUFR中的hessian阈值特征点检测算子
        //SurfFeatureDetector detector( minHessian );//定义一个SurfFeatureDetector(SURF) 特征检测类对象(opencv2中或许可用,opencv3这么写就会报错),改为下边这句
        Ptr<SURF>detector = SURF::create(minHessian);
        vector<KeyPoint> keypoints_1, keypoints_2;//vector模板类是能够存放任意类型的动态数组,能够增加和压缩数据
        
        //【3】调用detect函数检测出SURF特征关键点,保存在vector容器中
        detector->detect(srcImage1, keypoints_1);
        detector->detect(srcImage2, keypoints_2);
        
        
        //【4】绘制特征关键点.
        Mat img_keypoints_1; Mat img_keypoints_2;
        drawKeypoints( srcImage1, keypoints_1, img_keypoints_1, Scalar::all(-1), DrawMatchesFlags::DEFAULT );
        drawKeypoints( srcImage2, keypoints_2, img_keypoints_2, Scalar::all(-1), DrawMatchesFlags::DEFAULT );
        
        //【5】显示效果图
        imshow("特征点检测效果图1", img_keypoints_1 );
        imshow("特征点检测效果图2", img_keypoints_2 );
        return img_keypoints_1;
    }
    

      以上,SURF特征点检测的完整代码。

    总结:

    SURF在3.1.0下的用法如下:

    SurfFeatureDetector detector( minHessian );
    detector.detect(image,keypoints);

      改为:

    Ptr<SURF>detector = SURF::create();
    detector->detect(image,keypoints);

      

  • 相关阅读:
    link标签中的integrity和crossorigin字段
    jquery中的插件EChars的使用
    php函数 截断字符
    子元素脱离文档标准流,父元素没有高度解决办法
    有序无序Ul->Li Ol->Li菜单,默认点击当前弹出下拉,再次点击收起下拉菜单(变形2 ---修饰)
    有序无序ul->li ol->li菜单,默认点击当前弹出下拉,再次点击收起下拉菜单
    bootstrap使用总结(carousel设置大小。item设置大小,img设置大小)
    bootstrap使用总结(导航在carousel居中之上)
    html中设置height=100%无效的问题
    第四次上机课
  • 原文地址:https://www.cnblogs.com/zzzsj/p/14504627.html
Copyright © 2011-2022 走看看