vs2015下Cmake3.16编译Opencv3.3.0及opencv_contrib3.3.0在Windows10

0、为何需要自行编译opencv3.3与opencv_contrib3.3

因为在3.0之后版本的Opencv对Sift、Sufer等新算法没有提供直接编译好的动态库来加载使用,因此必须自己编译。这是因为Sift、Sufer算法专利现在是属于哥伦比亚大学,因此opencv对这部分内容及“所谓的”不稳定模块全都放到opencv_contrib中。且只在它的Github中能够找到,opencv的官网上是没有的。因此对于想使用Sift、Sufer、双目立体匹配算法、结构光等新的算法及有专利权算法的同学需要自行编译。

1、下载opencv3.3与opencv_contrib3.3相对应的版本

下载需要的Opencv3.3版本源码 https://github.com/opencv/opencv/releases

 

下载需要的opencv_contrib3.3版本源码 (本文.zip文件)

https://github.com/opencv/opencv_contrib/releases

PS:这里说一下,Opencv尽量使用对应版本的Contrib模块,不然在Cmake的时候容易出错。

 

2、Cmake3.16编译Opencv3.3

下载完三个工具之后,全部解压,推荐opencv_contrib3.3放在opencv源包source下的modules目录下,不然有可能出错。。

在Opencv文件夹下建立一个newbuild文件夹(名字随意),比如我的OPencv装在G:\Software\OpenCV3.3\opencv。则可以新建一个文件夹,这样就有了G:\Software\OpenCV3.3\opencv\newbuild。

下载完Cmake的zip文件之后解压ZIP,打开文件夹,进入bin文件夹下,打开Cmake_gui.exe。

(当然第一次弄一开始是全白,Name和Value底下什么东西都没有)

 点击Tools-Configure进入VS选择,或者单击“configure”;选择如下图设置,单击“Finish”即可开始编译。

(我的cmake还有一个Optional platform for generator 选项,如果没选,默认是Win32,之前忽略了这个,导致重新来过……)

这个过程会出现很多错误需耐心反复编译,主要原因是他要从国外网站下载文件,若下载失败就编译不通过,以红色显示

若失败,可在编译输出路径  G:\Software\OpenCV3.3\opencv\newbuild 中打开CMakeDownloadLog.txt文件里面有下载失败文件的连接及下载文件要保存到本地的路径。之后你自己可手动打开链接自己下载并放到指定的文件夹中最常下载失败的:opencv_ffmpeg.dll  opencv_ffmpeg_64.dll  ffmpeg_version.cmake及ippicv_2017u3_win_intel64_general_20170822.zip

下图(D:\Nyy\image\Opencv_Sourse\Opencv34Build  中的CMakeDownloadLog.txt)是别人本次编译时下载失败文件的连接及要保存文件的路径,需要每个都自行下载并放到指定位置即可。

(我的图没取……)

(此处可参考以下两个网址:https://www.cnblogs.com/ilym/p/8626763.html和https://blog.csdn.net/niuyuanye/article/details/79607770,里面有文件链接)

 在下载完后放到指定文件夹时需把名字修改名字,首先找到指定存储路径“D:\Nyy\image\Opencv_Sourse\opencv34\.cache\ffmpeg”(此路径可对应上面的截图看,我的路径是G:\Software\OpenCV3.3\opencv\sources\.cache\ffmpeg)

如下图。对照着CMakeDownloadLog.txt把下载的opencv_ffmpeg.dll名字修改为。

所有下载失败的的文件都可以这样操作。

我看别的博客说可选择勾选 BUILD_opemcv_world;主要是把所有的lib文件都弄到一个opencv_world340d.lib中方便配置,若不勾选在最后会产生大概38个.lib文件,导致最后配置Opencv3.4到vs2015会太麻烦,有过Opencv2.x配置经验的都知道。

但是我没选BUILD_opemcv_world,因为我觉得之后有个别lib或dll文件出问题的话,这样可能不好办。

勾选 BUILD_EXAMPLES;就是编译OPencv自带的例程。

完成后再次单击“Configure”即可

3、Cmake3.10编译opencv_contrib3.4

选择OPENCV_EXTRA_MODULES_PATH 把路径选择为解压的opencv_contrib3.4文件中的“modules”即G:\Software\OpenCV3.3\opencv\sources\modules\opencv_contrib-3.3.0\modules。如下图:

单击“Configure”在这部分编译中同样会出现下载失败的情况,

同样需要到 G:\Software\OpenCV3.3\opencv\newbuild中的CMakeDownloadLog.txt中找到下载链接自行下载,并放到指定的位置。此部分下载失败常有:boostdesc_bgm.i   boostdesc_bgm_bi.i  boostdesc_bgm_hd.i  boostdesc_binboost_064.i  及face_landmark_model.dat  同样找到下载并替换。(这里可能需要多次的反复才能完成,需要耐心!!!)

再次单击“Configure”。直到Cmake3.10没有红色显示为止。如下图

(这部分可能出现的问题:将自行下载的文件放到指定位置之后,点击“Configure”,会把自行下载的文件删除,然后又提示下载失败。

   亲测有效的做法:提示下载失败后,再把自行下载的文件复制过去,再点击“Configure”,重复试两三次后,在Cmake3.10上部分框里已经没有红色显示的前提下,要是还不行,就再把自行下载的文件复制过去,然后直接点击“Generate”,就会显示“Generate done”)

 最后点击  “Generate”  ,然后出现 Generate done, 这时候我们就编译好了opencv-3.3 + opencv_contrib-3.3的源码了

4、vs2015的最后编译

打来编译输出文件G:\Software\OpenCV3.3\opencv\newbuild 找到 Opencv.sln打开工程文件

 因为我要编译为Debug X64 因此选择如下图。

 此时即可开始编译即:生成->生成解决方案,随后漫长的等待。最后输出如下图所示:

(PS.我之前的生成结果是:成功288个,失败167个,跳过7个。因为好多显示无法打开文件opencv_stitching330d.lib,这时候我打开这个lib所在的文件夹发现确实有问题,网上也找不到这方面问题的解决,按照下面的步骤再往下走,会发现还是失败。

如果遇到与这相似的情况,把newbuild文件删除,然后回到开头重新来过就行了)

 选择 CMakeTargets下的INSTALL右键选择仅用于项目->仅生成INSTALL即可,

然后显示

之后会在G:\Software\OpenCV3.3\opencv\newbuild找到一个install文件夹即为最后编译生成的Opencv3.3配置需要文件。

5、Opencv3.3与VS2015的配置与测试

    a、将G:\Software\OpenCV3.3\opencv\newbuild\install\x64\vc14\bin添加到环境变量

    b、将G:\Software\OpenCV3.3\opencv\newbuild\install\include     G:\Software\OpenCV3.3\opencv\newbuild\install\include\opencv     G:\Software\OpenCV3.3\opencv\newbuild\install\include\opencv2  添加到“包含目录中”

    c、将G:\Software\OpenCV3.3\opencv\newbuild\install\x64\vc14\lib添加到 “库目录中”

    d 、将以下添加到“附加依赖库中”,dubug就添加debug模式的, release就添加 release模式的

      debug模式:

opencv_aruco330d.lib
opencv_bgsegm330d.lib
opencv_bioinspired330d.lib
opencv_calib3d330d.lib
opencv_ccalib330d.lib
opencv_core330d.lib
opencv_datasets330d.lib
opencv_dnn330d.lib
opencv_dpm330d.lib
opencv_face330d.lib
opencv_features2d330d.lib
opencv_flann330d.lib
opencv_fuzzy330d.lib
opencv_highgui330d.lib
opencv_img_hash330d.lib
opencv_imgcodecs330d.lib
opencv_imgproc330d.lib
opencv_line_descriptor330d.lib
opencv_ml330d.lib
opencv_objdetect330d.lib
opencv_optflow330d.lib
opencv_phase_unwrapping330d.lib
opencv_photo330d.lib
opencv_plot330d.lib
opencv_reg330d.lib
opencv_rgbd330d.lib
opencv_saliency330d.lib
opencv_shape330d.lib
opencv_stereo330d.lib
opencv_stitching330d.lib
opencv_structured_light330d.lib
opencv_superres330d.lib
opencv_surface_matching330d.lib
opencv_text330d.lib
opencv_tracking330d.lib
opencv_video330d.lib
opencv_videoio330d.lib
opencv_videostab330d.lib
opencv_xfeatures2d330d.lib
opencv_ximgproc330d.lib
opencv_xobjdetect330d.lib
opencv_xphoto330d.lib

          release模式:

opencv_aruco330.lib
opencv_bgsegm330.lib
opencv_bioinspired330.lib
opencv_calib3d330.lib
opencv_ccalib330.lib
opencv_core330.lib
opencv_datasets330.lib
opencv_dnn330.lib
opencv_dpm330.lib
opencv_face330.lib
opencv_features2d330.lib
opencv_flann330.lib
opencv_fuzzy330.lib
opencv_highgui330.lib
opencv_img_hash330.lib
opencv_imgcodecs330.lib
opencv_imgproc330.lib
opencv_line_descriptor330.lib
opencv_ml330.lib
opencv_objdetect330.lib
opencv_optflow330.lib
opencv_phase_unwrapping330.lib
opencv_photo330.lib
opencv_plot330.lib
opencv_reg330.lib
opencv_rgbd330.lib
opencv_saliency330.lib
opencv_shape330.lib
opencv_stereo330.lib
opencv_stitching330.lib
opencv_structured_light330.lib
opencv_superres330.lib
opencv_surface_matching330.lib
opencv_text330.lib
opencv_tracking330.lib
opencv_video330.lib
opencv_videoio330.lib
opencv_videostab330.lib
opencv_xfeatures2d330.lib
opencv_ximgproc330.lib
opencv_xobjdetect330.lib
opencv_xphoto330.lib

测试代码:

#include <stdio.h>
#include <iostream>
#include "opencv2/opencv.hpp"  
#include"opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include"opencv2/xfeatures2d.hpp"

using namespace cv;

using namespace std;

int main()
{    
    Mat img_1 = imread("D:/Nyy/image/Images_Data/sift1.jpg", CV_LOAD_IMAGE_COLOR);
    Mat img_2 = imread("D:/Nyy/image/Images_Data/sift2.jpg", CV_LOAD_IMAGE_COLOR);

    Ptr<Feature2D> sift = xfeatures2d::SIFT::create();

    vector<KeyPoint> keypoints_1, keypoints_2;
    Mat descriptors_1, descriptors_2;    

    sift->detectAndCompute(img_1, noArray(), keypoints_1, descriptors_1);
    sift->detectAndCompute(img_2, noArray(), keypoints_2, descriptors_2);

    //绘制特征点(关键点)
    drawKeypoints(img_1, keypoints_1, descriptors_1, Scalar(0, 0, 255));
    drawKeypoints(img_2, keypoints_2, descriptors_2, Scalar::all(-1), DrawMatchesFlags::DRAW_RICH_KEYPOINTS);

    imshow("img_1", descriptors_1);
    imshow("img_2", descriptors_2);
    waitKey(0);

    return 0;

}

这里会出现的问题:运行可能会出现以下报错:

 

 

 

 

 

 

 

 解决办法:把自己opencv文件目录下的G:\Software\OpenCV3.3\opencv\newbuild\install\x64\vc14\bin(本人的路径)中的上面这些报错的dll文件,拷贝到C:\\window\\System32

如果拷过去之后同样的dll运行还报错,再把报错的dll文件拷贝到C:\\window\\SysWOW64 中,之后就好了

测试结果:

 

 

 

posted @ 2020-10-28 11:23  Fionaa  阅读(583)  评论(0)    收藏  举报