想用QT作为OpenCV的GUI界面,有界面更正式些,但是之前看了几篇博文操作零零碎碎的,这次准备记录下来,靠一段落。记录不是很完整,以后在补充。
OpenCV本身能生成的GUI界面极为简陋,故一般使用MFC或Qt等框架来搭建GUI界面,并将OpenCV嵌入进去,参考【2】。
git config --global http.proxy 'socks5://127.0.0.1:1080'
git config --global https.proxy 'socks5://127.0.0.1:1080'
先 git clone 整个仓库,然后 git checkout tag_name 就可以取得 tag 对应的代码了。
但是这时候 git 可能会提示你当前处于一个“detached HEAD" 状态,因为 tag 相当于是一个快照,是不能更改它的代码的,如果要在 tag 代码的基础上做修改,你需要一个分支:
git checkout -b branch_name tag_name
这样会从 tag 创建一个分支,然后就和普通的 git 操作一样了。
D:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/x86_amd64/cl.exe
message(STATUS "FFMPEG: Package successfully downloaded")
include(${CMAKE_CURRENT_LIST_DIR}/ffmpeg_version.cmake)
其实吧,有些功能性的模块不编译也没事,如果你是应用当然是编译成DLL直接能用最好了,如果是学习算法,关键还是自己理解算法模块,那样子完全可以自己把CPP文件单独放到一个工程里编译运行,而不需要编译整个opencv项目了。
编译OpenCV的时候选择WITH_QT【2】(把WITH_OPENGL【19】也选上吧),至于这个选项的作用,可能是指OpenCV的highgui模块本身是否使用Qt,highg使用QT后higngui本身的窗口界面会变成基于Qt的,比原来的要好看一些,而且自动集成了一些图片缩放、保存等功能【2】。(那么原来的highgui使用的是什么GUI技术?)
勾选如上图后,点击Configure,得到如下图路径或者通过输入QT搜索得到勾选WITH_QT后重新配置产生的关于QT的项目。
但是上图有一个问题,就是QT相关的路径都是Anaconda下的,而我自己安装了是最新的QT5.9.2版本,我不清楚这几个选项的具体作用,不过改成QT5.9.2应该是没错的,于是把Anaconda相关的路径都替换成自己安装的QT5.9.2的路径,如下图所示,因为OpenCV3.3.0当初用CMAKE编译选择的Generator就是Visual Studio 14 2015 win64,所以QT的预编译版本也选择对应版本,感觉用Anaconda的话应该也可以?不可以,后面发现没有生成opencv_highgui模块,后来把路径修改后,生成这个模块了,但是我还不能确定是不是这个原因导致的。
再Configure一下,然后再Generate,之后Open Project,其实可以不用Open Project,直接在命令行用cmake直接编译Release和Debug版本的代码,如果没有产生install文件夹,说明编译失败,勾掉不必要的选项,好像还是要用VS2015图形界面编译更可靠。
Open Windows Command Prompt (cmd).
Go to OPENCV_PATH/build directory and run this command
E:\OpenCV\tool\cmake-3.10.1-win64-x64\bin\cmake.exe --build . --config Release --target INSTALL 这里INSTALL是解决方案里的目标项目,即生成INSTALL
Open CMake GUI again
Search “python” in search box
Uncheck INSTALL_PYTHON_EXAMPLES, BUILD_opencv_python3 and BUILD_opencv_python2,经测试若勾选会编译失败?会吗?反正勾掉吧。好像3.4.0取消了
实际上我的opencv3.4.0的情况如下图,我把generator也uncheck了,我的理解是python只要Release版本,调试版本用不到,毕竟python也是调用的编译后的opencv项目,它不能进行调试C++的代码,我是这么理解的。
python2支持,没有发现BUILD_opencv_python2选项,自然也没有pyhon的项目,但是有pyhon3的项目。
Click configure
Click generate
Now in windows command prompt, Go to OPENCV_PATH/build directory and run this command
E:\OpenCV\tool\cmake-3.10.1-win64-x64\bin\cmake.exe --build . --config Debug --target INSTALL
Now that we have compiled OpenCV we will find out how to test a OpenCV project using CMake.
点击Open Project按钮打开生成的VS工程,待其完全载入后即可编译了,需要注意的是,不要使用默认的生成解决方案(F7)进行编译,这样最终得到的install文件夹中的内容是不全的。正确方法是在INSTALL工程上点右键,选择生成,还是选择重新生成吧,单独编译生成此工程【3】。
最后Open Project打开就能回到熟悉的VS环境中了,直接右键解决方案等它Build完就好了(ps: 生成的文件放在 build\lib\ 和 build\bin\ 目录下,最后通过INSTALL这个项目把相关文件(.h、.dll、.lib等)拷贝到CMAKE_INSTALL_PREFIX目录下面,如果你没有Build INSTALL这个项目是不会拷贝的,跟make之后没执行make install情况一样),参考【32】,我是看了【32】才知道解决方案和INSTALL项目的关系的,好像其他博客都说的不太对。To collect the header and the binary files, that you will use during your own projects, into a separate directory (simillary to how the pre-built binaries ship) you need to explicitely build the Install project【31】.你可以理解为OpenCV库本身就是一个solution,里面有好多projects,之前的编译都是面向solution的,而install则是面向客户的,客户需要是现成能用的成品,这就是INSTALL的作用,通过build INSTALL实现。This will create an Install directory inside the Build one collecting all the built binaries into a single place. Use this only after you built both the Release and Debug versions.其实的话生成的install文件夹也是提供给cmake调用的,因为install目录下生成了
我感觉还是通过下面的两个步骤编译,生成的文件更全面,就是先编译再安装,不过应该效果一样吧。
也就是说我们队解决方案的操作也是通过解决方案中的项目来实现的,并不是通过什么外部的工具来实现的。
生成的动态库,如下图
配置系统变量,添加系统变量是添加第3方库设置的常用的便利方法,可以简化改动的地方
install目录可以理解为一种绿色软件的目录,我们可以任意搬动,只要修改OPENCV_DIR就可以了。
此外install目录在不同的操作系统在别人的电脑上也都是可能不同的。
更新!!!根据研究重新配置系统变量如下
If you built static libraries then you are done. Otherwise, you need to add the bin folders path to the systems path. This is cause you will use the OpenCV library in form of “Dynamic-link libraries” (also known as DLL). Inside these are stored all the algorithms and information the OpenCV library contains. The operating system will load them only on demand, during runtime. However, to do this he needs to know where they are. The systems PATH contains a list of folders where DLLs can be found. Add the OpenCV library path to this and the OS will know where to look if he ever needs the OpenCV binaries. Otherwise, you will need to copy the used DLLs right beside the applications executable file (exe) for the OS to find it, which is highly unpleasent if you work on many projects. To do this start up again the Path Editor and add the following new entry (right click in the application to bring up the menu):
%OPENCV_DIR%\bin 【31】
下载测试代码redEyeRemover code,参考【29】。
运行C++代码可以利用cmake的纯命令行形式,或者通过CLion配合cmake,这里利用CLion。
首先利用CLion+命令行的形式,然后只利用CLion编译运行。
Working with Embedded Local Terminal
在RedEyeRemover文件下新建CLion工程,然后创建一个CMakeLists.txt文件,在文件中输入:
cmake_minimum_required(VERSION 2.8)
project( redEyeRemover )
find_package( OpenCV REQUIRED ) 这个地方注意了,cmake是根据系统变量OPENCV_DIR来找到cmake文件的,所以OPENCV_DIR我们设置为install路径,而新建一个变量OPENCV_VC设置为%OPENCV_DIR%\x64\vc14
include_directories( ${OpenCV_INCLUDE_DIRS} )
add_executable( removeRedEyes removeRedEyes.cpp )
target_link_libraries( removeRedEyes ${OpenCV_LIBS} )
其中包含了之前生成OpenCV的头文件路径和DLL动态库路径。
在CLion下面的终端里运行如下命令来编译我们的removeRedEyes.cpp源代码:
# create build directory
mkdir build
cd build
# create Visual Studio project files using cmake,可以理解为之前的configure和generate
cmake -G "Visual Studio 14 2015 Win64" ..
下面构建(编译+链接)我们的应用程序:
# build our application,可以理解为生成目标项目了
cmake --build . --config Release
# once the build is complete, it will generate exe file in build\Release directory
下面在主目录装载应用程序,应用程序会查询调用目录下的图片文件:
cd ..
.\build\Release\removeRedEyes.exe
.\build\Release\main.exe .\opencv-logo.png
应用程序执行结果
没有出现图片!!!折腾了一天居然没有出现图片,比较打击,考虑到我使用的QT,所以想先测试下图片读取功能是否正常,打算先测试最简单的图片显示【2】。还是官方文档齐全,QT显示图片的例子早就在官方文档里了。用我那个Example1里的示例吧。
Visual Studio Quick Tutorial on Configuring CLion on Windows
MinGW
不过如果想对OpenCV源码进行Debug跟踪,是不能选用.\install文件夹中的库文件的,因为此处缺少.pdb调试文件,无法正常Debug。此时需要使用.\lib文件夹中的库文件,这时可以正常的跟踪到源代码中,且使用profiler分析代码性能时也可以正确定位到OpenCV内部函数上【3】。
关于库、DLL、lib、pdb概念的理解,我理解库是相对的,如果拿游戏类比,库就好比是武器装备库,而每件武器可能又有自己的配件库,库的内容不同大小不同,但是调用方式是相同的【4】。参考资料【4】给出的最小原型动态链接库可以和QT库、OpenCV库在调用配置上等价。
这里只说下对OpenCV的DLL的理解,更准确的参考资料【5】。
OpenCV其实是一个一个的功能模块,每个模块对应一些CPP文件和H文件,CPP文件经过编译就生成DLL(而普通软件生成EXE)和LIB(这是用于LINK的,可以理解为一个DLL的伪静态LIB占位符,否则的话就是静态LIB了)、以及include里的头文件。
而头文件H文件就被搬运到一个专门的INCLUDE目录。
使用库的人叫做客户端Client或者应用程序Application,他们要使用库的功能,其实就是使用那些模块函数了,就要配置项目。配置的话也无非3个方面,其中第3个方面又分为2个,所以一共4个地方需要配置:
新建solution时,选择空项目,这样一来项目文件夹都是空的没有预备的文件在里面,更加灵活。
测试OpenCV的QT安装效果
参考资料【6】
最后显示图像的highgui界面确实是调用的QT库测试VS插件的QT安装效果【7】
参考资料【7】操作后可以实现一个空白GUI框
不过QT有一个官方版本的VS插件,所以重新下载使用官方的插件,但是安装后使用出现问题【12】,所以还是用qt package插件吧,插件也只是项目组织功能,官方不官方也无所谓了。
几个概念:
moc 元对象编译器
uic 用户接口编译器
rcc 资源编译器
.pro Qt工程文件
.pri 工程包含文件
插件的使用参考资料【14】测试OpenCV和QT联合编程效果
参考资料【13】
其中.pro文件不需要配置,因为那是给QT Creator用的,只要把项目属性里关于OpenCV库和QT库的部分配置一下(这两个库的配置项目几乎是一样的),QT其他部分的配置由QT插件完成了。
术语
build directory
runtime argument
compiler
linker
Anaconda是一种python的发布版本,我理解就是类似Ubuntu是Linux的一种发布版本一样,就是说强化了python核心,虽然我也说不清楚pyhon核心是什么。
conda create --name opencv-env python=3.6
activate opencv-env
pip install numpy scipy matplotlib scikit-learn jupyter
pip install opencv_python-3.3.1+contrib-cp36-cp36m-win_amd64.whl
pip install dlib
import cv2
cv2.__version__
import dlib
dlib.__version__
使用win10的bash模式
opencv_(The Name of the module)(The version Number of the library you use)d.lib
opencv_world340.lib 因为考虑到生成1个lib文件可能减慢速度我就没弄这个
过滤*.lib
过滤*d.lib
框架和库的区别可以参考【50】,工具的话,我的理解就是系统方面的,和计算机视觉没什么关系的东西,比如生成 OpenCV documentation 的工具。
框架的我感觉就是解决一类问题的一个模式架构,随便说的。比如QT框架,要显式图片,你把图片数据填充到框架的API中,然后调用显式图片的API,QT框架就帮你把图片显式出来。而中间图片的处理我们可以调用OpenCV库里的各种算法来处理。
库的话好比工具箱,解决一类问题的各种方法的实现集合。
setx -m QTDIR D:/OpenCV/dep/qt/qt-everywhere-opensource-src-4.7.3
The -m should be added if you wish to make the settings computer wise, instead of user wise.
Path一般用来配置bin目录的路径。
make常用在具体事物,e.g. make a conversation, make a reservation
build可以用在抽象事物上,e.g. build an empire, build a relationship
关于Intellij IDEA菜单项中Compile、Make和Build的区别
库按的安装时提供DLL(内存运行时调用),QQ的安装时提供一个QQ.exe给我们登录,都是安装,只是对象不同。
应用程序-->代码层面: solution-->building blocks: multiple projects-->a main project(组
织所有的项目拼图到一起,所有项目就好比拼图solution的一部分)
我们平时练习小应用程序的时候可以每个应用程序都建立一个solution,也可以都放到一个solution里面,然后通过main project屏蔽不需要的building blocks: projects,和solution同名的那一个project作为main project。
其实,我理解solution平时可能也叫做项目,这是对于外部而言,而项目内部而言,我们可能划分为多个building blocks,此时那个所谓的项目就变成了solution了,当然了这是就应用程序组织而言的。
事实上一个solution可以是一个很大的应用程序,比如QQ所有代码就是一个solution,然后分成多个模块进行分工。
视图菜单下
【1】VS2015搭建Qt 5.7开发环境
【2】OpenCV与Qt结合使用
【3】VS2015下编译OpenCV 3.1
【4】Walkthrough: Creating and Using a Dynamic Link Library (C++)
【5】DLLs in Visual C++
【6】How to build applications with OpenCV inside the "Microsoft Visual Studio" 该官方文档对如何调用INSTALL后的OpenCV的原理讲解十分清楚,有很多中文博客几乎没有人提到的细节,其他博文都可以看做该文档的注释版本,很多人都在网上搜各种教程却不愿意阅读官方文档,确实很奇怪。其实任意博文都是官方文档额注释和应用罢了
【7】将 Qt 5.6 集成至 VS2015
【8】详解 QT 框架中快速应用OpenCV 基于图片 上篇
【9】详解 QT 框架中快速应用OpenCV 基于视频播放 下篇
【10】《Qt 学习之路 2》
【11】Qt Visual Studio Tools
【12】Run Qt5.6 on VS2015 & “无法迁移项目文件” & "Cannot instantiate QtProjectEngine object"错误的解决方法
【13】How to setup Qt and openCV on Windows
【14】Qt VS Tools Manual
【15】[OPENCV QT TUTORIAL] OPENGL WIDGET TO SHOW OPENCV IMAGES IN A QT GUI (FIRST PART)
【16】[OPENCV QT TUTORIAL] OPENGL WIDGET TO SHOW OPENCV IMAGES IN A QT GUI (SECOND PART)
【17】[TUTORIAL OPENCV QT] HOW TO COMPRESS AN IMAGE IN MEMORY
【18】OpenCV 与 OpenGL 的关系是什么?
【19】OpenCV 为啥勾搭上 OpenGL?
【29】Install OpenCV 3 on Windows
【30】Install OpenCV 3 and Dlib on Windows ( Python only )
【31】Installation in Windows
【32】使用 CMake + VS2017 ( + Python 3) 配置和编译 OpenCV 3.3
【33】【OpenCV3.3】编译源码并搭建VS2017+Windows开发环境 - 菜鸟小筑 - CSDN博客 这个博客对编译和VS项目属性设置方面也讲得很好
【34】python3下opencv的编译过程
【35】Deep Learning with OpenCV
【36】errors on build opencv with cvv module and qt5
【37】Windows环境下最新OpenCV和Contribute代码的联合编译
【38】git支持socks5和HTTP代理
【39】Windows 7 and TortoiseGit contribution guide
【40】Load and Display an Image
【50】库,框架,架构,平台,有什么明确的区别?
【51】Write and Manage Code using Visual Studio Documentation
【52】CMake:How To Find Libraries
【53】CMake find_package for OpenCV
【54】Python Extension Packages for Windows - Christoph Gohlke
【55】How to: Change the Build Output Directory