Opencv4.7.0+opencv_contrib编译笔记

CMake编译:

Configure

编译问题1:

解决方法:OPENCV_GENERATE_SETUPVARS ,取消勾选

 编译问题2:

方法:通过以下Url,下载ippicv_2020_win_intel64_20191018_general.zip文件

opencv_3rdparty/ippicv at ippicv/master_20191018 · opencv/opencv_3rdparty · GitHub

完成之后,添加该文件到E:\software\opencv_4.7.0\sources\3rdparty\ippicv文件夹中

打开ippicv.cmake,将以下语句注释,可通过  #[[ 注释内容]]  注释掉

再次Configure,不再报错

若还报错,将.zip文件名称修改为 报错的文件名(879741a7946b814455eee6c6ffde2984-ippicv_2020_win_intel64_20191018_general.zip)

再次Configure,done...

继续...

查找OPENCV_EXTRA_MODULES_PATH,将值设置为opencv_contrib-4.7.0下modules路径即:E:\software\opencv_4.7.0\sources\opencv_contrib-4.7.0\modules

再次Configure

编译问题3:以下15个文件加载失败

解决方法:在目标文件夹下新建downloads文件夹

再新建两个文件夹,用于放置准备下载的文件

 准备下载的文件如下:

如何下载呢?

依次将15个的每个https://raw.githubusercontent.com/opencv/opencv_3rdparty/fccf7cd6a4b12079f73bbfb21745f9babcd4eb1d/vgg_generated_120.i添加到GitHub Proxy下载,完成之后,放置到上面所述的文件夹中

再次Configure

继续...

勾选BUILD_opencv_world,为了将所有的lib文件都集成到一个opencv_world450d.lib中方便配置  

勾选OPENCV_ENABLE_NONFREE,为了使用具有专利保护的算法

取消勾选不需要的部分 test ,java,python,BUILD_DOCS,BUILD_PACKAGE,BUILD_EXAMPLES

再次Configure,Generating done

打开项目

 生成,时间较长

生成完成,进入install,添加环境变量

E:\software\opencv_4.7.0\opencv_contrib\install\x64\vc16\bin

重启VS 2019编译器,新建项目

右键---属性 ,设置所有配置、所有平台,VC++中,包含目录、库目录设置如下:

链接器,输入,附加依赖项 添加 opencv_world470d.lib,opencv_world470.lib

代码测试参考:SIFT

#include <opencv2/opencv.hpp>
#include <opencv2/xfeatures2d.hpp>

using namespace std;
using namespace cv;

int main()
{
    Mat imageL = imread("20230523_1.jpg");
    Mat imageR = imread("20230523_2.jpg");
    /*imshow("1", imageL); imshow("2", imageR); waitKey(); return 0;*/

    //提取特征点方法
    //SIFT
    Ptr<SIFT> sift = SIFT::create();
    //ORB
    //Ptr<ORB> orb = ORB::create();
    //SURF
    //Ptr<xfeatures2d::SURF> surf = xfeatures2d::SURF::create();

    //特征点
    std::vector<KeyPoint> keyPointL, keyPointR;
    //单独提取特征点
    sift->detect(imageL, keyPointL);
    sift->detect(imageR, keyPointR);

    //画特征点
    Mat keyPointImageL;
    Mat keyPointImageR;
    drawKeypoints(imageL, keyPointL, keyPointImageL, Scalar::all(-1), 
                  DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
    drawKeypoints(imageR, keyPointR, keyPointImageR, Scalar::all(-1), 
                  DrawMatchesFlags::DRAW_RICH_KEYPOINTS);

    //显示窗口
    namedWindow("KeyPoints of imageL",WINDOW_FREERATIO);
    namedWindow("KeyPoints of imageR",WINDOW_FREERATIO);

    //显示特征点
    imshow("KeyPoints of imageL", keyPointImageL);
    imshow("KeyPoints of imageR", keyPointImageR);

    //特征点匹配
    Mat despL, despR;
    //提取特征点并计算特征描述子
    sift->detectAndCompute(imageL, Mat(), keyPointL, despL);
    sift->detectAndCompute(imageR, Mat(), keyPointR, despR);

    //Struct for DMatch: query descriptor index, train descriptor index, train image index 
    and distance between descriptors.
    //int queryIdx –>是测试图像的特征点描述符( descriptor )的下标,同时也是描述符对应特征点 
   (keypoint)的下标。
    //int trainIdx –> 是样本图像的特征点描述符的下标,同样也是相应的特征点的下标。
    //int imgIdx –>当样本是多张图像的话有用。
    //float distance –>代表这一对匹配的特征点描述符(本质是向量)的欧氏距离,数值越小也就说明两 
    个特征点越相像。
    vector<DMatch> matches;

    //如果采用 flannBased 方法 那么 desp通过orb的到的类型不同需要先转换类型
    if (despL.type() != CV_32F || despR.type() != CV_32F)
    {
        despL.convertTo(despL, CV_32F);
        despR.convertTo(despR, CV_32F);
    }

    Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("FlannBased");
    matcher->match(despL, despR, matches);

    //计算特征点距离的最大值 
    double maxDist = 0;
    for (int i = 0; i < despL.rows; i++)
    {
        double dist = matches[i].distance;
        if (dist > maxDist)
            maxDist = dist;
    }

    //挑选好的匹配点
    vector< DMatch > good_matches;
    for (int i = 0; i < despL.rows; i++)
    {
        if (matches[i].distance < 0.5 * maxDist)
        {
            good_matches.push_back(matches[i]);
        }
    }

    Mat imageOutput;
    drawMatches(imageL, keyPointL, imageR, keyPointR, good_matches, imageOutput);

    namedWindow("picture of matching",WINDOW_FREERATIO);
    imshow("picture of matching", imageOutput);
    waitKey(0);
    return 0;
}

 测试结果: 

约~~

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值