opencv4+contrib 编译

先看看opencv4的新特性吧!

1.OpenCV 最开始开发时的语言是 C,许多模块无法利用 C++ 11 的良好特性,所以自OpenCV1.x以来许多C风格的API就被干掉啦。历史好像就是这样,前浪总归是要···所以,学习OpenCV,最佳就是从最新的版本开始会比较好。

2.在 core 模块中的持久化(在 XML,YAML 或 JSON 中存储和加载结构化数据)已完全用 C ++ 重新实现,也就是说C风格API拜拜了。目前,base64 支持尚未完成(仅支持加载 base64 编码的 XML 和 YAML,还未支持编码),用过OpenCV中ML模块吗?以后,加载与存储会快许多!

3.编译新版 OpenCV 现在需要支持 C++ 11 的编译器。

4.C++11的标准库扩展,以后没有cv::String与cv::Ptr了。现在,存储在 FileNode 中的序列的随机访问是 O(N) 操作; 使用 cv :: FileNodeIterator 能够更快地进行顺序访问。

最为重要的就是 OpenCV  更新的 DNN (深度神经网络)模块啦!

1. 增加支持 Mask-RCNN 模型的预测。

使用指南:https://github.com/opencv/opencv/wiki/TensorFlow-Object-Detection-APIPython例子:https://github.com/opencv/opencv/blob/master/samples/dnn/mask_rcnn.py

2.集成  ONNX  解析器。 支持多个流行的分类网络。 部分支持 YOLO 对象检测网络(YOLO 的 ONNX 版本缺少一些提供矩形列表的最终图层)。

3.通过引入 Intel DLDT 改进 DNN 模块速度。不过,这个对一般的开发者没有太大的影响。

Intel DLDT 近期已经开源,详见:

https://software.intel.com/openvino-toolkit

4.这一条就和开发者相关性比较大了,DNN模块输入tensor数据的API更改。默认情况下,blobFromImage 方法不会交换 R 和 B 通道,也不会对输入图像进行裁剪。 而且,此 API 更改也已添加到 OpenCV 3.4 分支。

5.如果OpenCL不支持,可以通过Vulkan backend。(开发中···)

6.为 OpenCV 支持的最流行的深度学习网络添加了快捷方式。 可以通过指定模型的别名,跳过预处理参数甚至模型的路径。

以前:python object_detection.py --model opencv_face_detector.caffemodel --config opencv_face_detector.prototxt --mean 104 177 123 --width 300 --height 300you can type just现在:python object_detection.py opencv_fd

7. 修复了  AMD  和  NVIDIA GPU  上的  OpenCL  加速。就是一个提醒,不需要配置太多,不过,不用 Intel GPU 是不是不太好。

这儿得提一句,新模块 G-API 模块

opencv_gapi 是全新添加的模块,它是非常有效的图像处理引擎。开发者可以在程序中定义多个图像处理步骤组成的图,执行的时候进行优化,使得 fast and portable。

gapi使用示例:

#include 
#include 
#include 
#include 
#include 

int main(int argc, char *argv[])
{
    cv::VideoCapture cap;
    if (argc > 1) cap.open(argv[1]);
    else cap.open(0);
    CV_Assert(cap.isOpened());

    cv::GMat in;
    cv::GMat vga      = cv::gapi::resize(in, cv::Size(), 0.5, 0.5);
    cv::GMat gray     = cv::gapi::BGR2Gray(vga);
    cv::GMat blurred  = cv::gapi::blur(gray, cv::Size(5,5));
    cv::GMat edges    = cv::gapi::Canny(blurred, 32, 128, 3);
    cv::GMat b,g,r;
    std::tie(b,g,r)   = cv::gapi::split3(vga);
    cv::GMat out      = cv::gapi::merge3(b, g | edges, r);
    cv::GComputation ac(in, out);

    cv::Mat input_frame;
    cv::Mat output_frame;
    CV_Assert(cap.read(input_frame));
    do
    {
        ac.apply(input_frame, output_frame);
        cv::imshow("output", output_frame);
    } while (cap.read(input_frame) && cv::waitKey(30) < 0);

    return 0;
}

性能全部提升,各种优化,跟开发者关系比较大的是这条,自己编译OpenCV源码时候,添加CPU_BASELINE=AVX2可以获得比原来15~30%的速度提升,请收藏此技能。

同时,objdetect 模块中新增 二维码的检测和解码,这年代的移动App这个技能只能说是标配吧。

参照:https://github.com/opencv/opencv/blob/master/samples/cpp/qrcode.cpp

3D对象扫描与模型创建流行算法Kinect Fusion algorithm已经被实现,被集成到了rgbd模块中。

非常高效且高质量的 DIS 密集光流算法已经从 opencv_contrib 转移到 opencv/video 模块。 

示例:https://github.com/opencv/opencv/blob/master/samples/cpp/dis_opticalflow.cpp

 

一、源码下载

  可能有人会说:源码下载还有什么要说的?事实上,有很多朋友在第一步源码下载就错了:扩展模块与主版本不匹配。

   访问opencv在github上的主页:https://github.com/opencv

   如下图(图1):

opencv4+contrib 编译_第1张图片

注意上面两个箭头指向的地方,重点关注“opencv”与“opencv_contrib”

点击箭头“1”的"opencv"标签,进入下一页,如图(图2):

opencv4+contrib 编译_第2张图片

 注意箭头指向的地方,进页面后默认是"master"版本,我们要的是"opencv4.0",

点击小三角后如图(图3):

opencv4+contrib 编译_第3张图片

 点击“Tags”标签,选中“4.0” 后,如下图(图4):

opencv4+contrib 编译_第4张图片

 现在当前的源码就是“opencv4.0”的了,点击“Clone or download”开始下载(opencv4.0的主版本源码)

接着再回到opencv主页https://github.com/opencv,见上图(图1),点击箭头2指向的标签“opencv_contrib”,
见下图(图5):

opencv4+contrib 编译_第5张图片

 同样,按照上面箭头顺序选择“4.0.0"后,点击“Clone or download”下载“opencv4.0.0”的扩展模块

到此,所有源码下载完毕,分别解压两个压缩包。

另外,编译CV400,建议cmake软件版本选择3.12以上,版本低了可能会有问题。我用的是cmake3.12.4版本。

 

二,使用cmake生成OpenCV源代码工程

在Cmake之前,先关闭Visual Studio(如果正在运行)

1.选择源码路径及生成路径,如图,点击"Configure"

a.这里注意生成路径,确保这个路径所在盘的剩余空间在18G以上,

因为cmake生成的工程后再在VS中编译最后总文件有17个多G,踩过这坑。。。

b.路径不能有中文

 

opencv4+contrib 编译_第6张图片

2.选择编译器,如图

opencv4+contrib 编译_第7张图片

最后生成的库是32位还是64位,这里开始选择:

32位的程序兼容性好,64位的速度快。考虑兼容性,大多数人选择32位。点击“Finish”开始配置。

第一次Configure一般几分钟,出现"Configure down"后,如图:

opencv4+contrib 编译_第8张图片

如需编译扩展模块,为“OPENCV_EXTRA_MODULES_PATH”添加扩展模块源码的路径“......../modules”

如项目中要用到SURF,勾选“OPENCV_ENABLE_NONFREE”选项

如果选中"BUILD_opencv_world",这样最后的库是一个文件,如"opencv_world400.dll”

第一次Configure如果不成功,一般是网络不好,一些东西没下载下来,特别是在单位网络过代理的情况下。

可以看窗口中飘红文字提示去看日志文件,根据它提示去下载复制(不容易成功!!!首选好网络)。

 

第二次点击“Configure”,几分钟。又出现"Configure down"后,点击“Generate”生成工程。

一般到这里都没问题,几分钟后出现“Generate down”就成功了。

 

三,编译Opencv工程,生成头文件与库

去之前cmake时生成目录,找到"Opencv.sln",如图

opencv4+contrib 编译_第9张图片

打开工程后,点击菜单栏“生成”-》“批生成”,如图

opencv4+contrib 编译_第10张图片

如图中4个复选框都勾上,点击“生成”一次全部生成

 

opencv4+contrib 编译_第11张图片

大概半小时左右,如下图,就成功了

opencv4+contrib 编译_第12张图片

去目录下看看

opencv4+contrib 编译_第13张图片

opencv4+contrib 编译_第14张图片

opencv4+contrib 编译_第15张图片

“include”  "lib"  "bin"这3个目录下的东东就是我们编程需要的文件了

 

总结一下:

1.两个源码下载后,cmake选好源码路径和生成路径,

  两次Configure(第一次configure后,选好扩展模块源码路径),

 一次Generate

2.打开工程后,选中“CMake Targets”下“INSTALL”-》“生成”

 

大部分朋友编译不成功的原因主要有3点:

1.扩展模块与主源码不匹配

2.cmake时不要有中文路径。

  这里说一点:作为程序员,开发时本能地不要用中文,哪怕用拼音都行,不然会有很多意想不到的bug。

3.网络不好,cmake时连不上服务器导致一些文件没下载下来

 

 

你可能感兴趣的:(图像处理)