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):
注意上面两个箭头指向的地方,重点关注“opencv”与“opencv_contrib”
点击箭头“1”的"opencv"标签,进入下一页,如图(图2):
注意箭头指向的地方,进页面后默认是"master"版本,我们要的是"opencv4.0",
点击小三角后如图(图3):
点击“Tags”标签,选中“4.0” 后,如下图(图4):
现在当前的源码就是“opencv4.0”的了,点击“Clone or download”开始下载(opencv4.0的主版本源码)
接着再回到opencv主页https://github.com/opencv,见上图(图1),点击箭头2指向的标签“opencv_contrib”,
见下图(图5):
同样,按照上面箭头顺序选择“4.0.0"后,点击“Clone or download”下载“opencv4.0.0”的扩展模块
到此,所有源码下载完毕,分别解压两个压缩包。
另外,编译CV400,建议cmake软件版本选择3.12以上,版本低了可能会有问题。我用的是cmake3.12.4版本。
在Cmake之前,先关闭Visual Studio(如果正在运行)
1.选择源码路径及生成路径,如图,点击"Configure"
a.这里注意生成路径,确保这个路径所在盘的剩余空间在18G以上,
因为cmake生成的工程后再在VS中编译最后总文件有17个多G,踩过这坑。。。
b.路径不能有中文
2.选择编译器,如图
最后生成的库是32位还是64位,这里开始选择:
32位的程序兼容性好,64位的速度快。考虑兼容性,大多数人选择32位。点击“Finish”开始配置。
第一次Configure一般几分钟,出现"Configure down"后,如图:
如需编译扩展模块,为“OPENCV_EXTRA_MODULES_PATH”添加扩展模块源码的路径“......../modules”
如项目中要用到SURF,勾选“OPENCV_ENABLE_NONFREE”选项
如果选中"BUILD_opencv_world",这样最后的库是一个文件,如"opencv_world400.dll”
第一次Configure如果不成功,一般是网络不好,一些东西没下载下来,特别是在单位网络过代理的情况下。
可以看窗口中飘红文字提示去看日志文件,根据它提示去下载复制(不容易成功!!!首选好网络)。
第二次点击“Configure”,几分钟。又出现"Configure down"后,点击“Generate”生成工程。
一般到这里都没问题,几分钟后出现“Generate down”就成功了。
去之前cmake时生成目录,找到"Opencv.sln",如图
打开工程后,点击菜单栏“生成”-》“批生成”,如图
如图中4个复选框都勾上,点击“生成”一次全部生成
大概半小时左右,如下图,就成功了
去目录下看看
“include” "lib" "bin"这3个目录下的东东就是我们编程需要的文件了
总结一下:
1.两个源码下载后,cmake选好源码路径和生成路径,
两次Configure(第一次configure后,选好扩展模块源码路径),
一次Generate
2.打开工程后,选中“CMake Targets”下“INSTALL”-》“生成”
大部分朋友编译不成功的原因主要有3点:
1.扩展模块与主源码不匹配
2.cmake时不要有中文路径。
这里说一点:作为程序员,开发时本能地不要用中文,哪怕用拼音都行,不然会有很多意想不到的bug。
3.网络不好,cmake时连不上服务器导致一些文件没下载下来