opencv4.0.0_beta+cuda9.0+vs2015+anaconda3.5_python教程与问题解答

  1. 等了很久终于等到opencv4.0.0的一个相对稳定版,alpha版刚出的时候就想尝试了,但无奈版本不稳定,编译错误太多,导致功能大打折扣。但beta版出来之后,基本上可以零错误全面编译opencv的tbb(多线程加速),cuda(显卡加速与深度学习)以及python接口(直接conda install或者pip install 无法安装contrib或者编译cuda接口,只能用阉割版),因此可以全面体验新版本opencv带来的体验了。虽然说beta是个稳定版,但是在配置的时候还是有一点小坑和一点小BUG。不过好在,猴急的我已经帮你们全踩完了。因此如果你也想从源码编译opencv,体验tbb, cuda和python中各种加速的快感和各种先进的cv,ml和dl库,那就跟我一起,干了这碗热腾腾的opencv全面安装指南吧。
  2. 首先分别从官网和GitHub下载opencv与opencv_contrib源代码。因为opencv_contrib库瞬息万变。谁觉得有idea了都可以挥一锤子改一下,因此在这里我放上我编译时用到的opencv, contrib与tbb的源码供大家下载使用。链接:https://pan.baidu.com/s/16ZoqB9rLzyVX5IWLYvuE1w 提取码:xeqv 。如果使用 tbb,记得把bin目录放进路径.
  3. 然后找地方建立vs2015_build文件夹存放编译结果。打开CMake,在where is the source code一行中browse到opencv根目录,并且在where to build binaries中browse到刚刚建立的vs2015_build文件夹,点击Configure按钮,选择编译器(VS 2015 64位)进行初次配置。配置完成后在Name-Value栏中会出现许多CMake配置变量。
  4. 接着,在Search框中搜索WITH_CUDA,并勾选对应的CheckBox,并搜索OPENCV_EXTRA_MODULES_PATH,并浏览至opencv_contrib中的module文件夹;这时,再次配置就会利用nvcc编译opencv_contrib中形形色色的cuda代码了。如果需要编译tbb进行多线程加速,则在Search框中搜索tbb,勾选WITH_TBB对应的CheckBox,并将TBB_ENV_INCLUDE指向tbb中的include文件夹,TBB_ENV_LIB指向intel64/vc14/tbb.lib文件,TBB_ENV_LIB_DEBUG指向lib/intel64/vc14/tbb_debug.lib文件即可。再次点击Configure,CMake会检查cuda,tbb等附加依赖是否符合要求。确认无误之后再次点击Configure,此时红色错误消失。接着点击Generate生成vs2015解决方案,然后点击Open Project打开解决方案。
  5. 值得注意的是,opencv4.0.0beta有个配置依赖项方面的bug,因此不能直接ALL_Build,否则在编译opencv_cudev.dll时会跑出未定义的引用错误导致编译崩盘。因此我们首先在解决方案资源管理器的modules找到opencv_core模块,右键生成进行编译;在编译完成之后,在vs2015_build\lib\debug(release)下多出opencv_core400d.lib(opencv_core400.lib)静态库文件。接着在解决方案资源管理器中找到opencv_cudev模块,右键属性页,在连接器\常规中将vs2015_build\lib\debug(release)添加为库目录,并且在输入的附加依赖项中添加opencv_core400d.lib(opencv_core400.lib)库文件。至此,整个opencv解决方案配置完成,右键单击ALL_BUILD进行生成,生成完毕后再单击INSTALL进行生成,则默认情况下,所有的头文件与库文件被生成到vs2015_build\install文件夹下。
  6. 可以将install文件夹改名为opencv400_vc14_cuda9以便标识出编译时的环境避免以后使用的时候环境错误。接着将opencv400_vc14_cuda9\x64\vc14\bin添加到环境变量中。打开visual studio在属性页中配置opencv的头文件与静态库之后,编写测试代码看看GUI是否正常(事实上最容易出问题的也就是GUI)。如果在调用namedWindow,imread,以及waitKey的时候发生了中断,并在终端报错说这些函数没有implement,那么打开CMake, 检查WITH_WIN32UI变量是否勾选,如果已经勾选,那么重新Configure, Generate, 并且打开新的Visual Studio解决方案重新编译opencv_highgui模块,在编译完成后,将新生成的.lib与.dll文件拷贝到opencv400_vc14_cuda9\x64\vc14\bin与opencv400_vc14_cuda9\x64\vc14\lib对应位置覆盖掉即可。
  7. 编译出的python库文件为vs2015_build\lib\python\release文件夹下的.pyd文件。注意到该pyd文件并不是opencv库文件的所有,而是在运行时需要链接到opencv编译出的动态链接库使用(因而opencv编译出的dll文件必须要在.pyd文件的搜索路径中),换句话说,如果这个pyd文件找不到编译出的opencv_*.dll,或者编译出opencv_*.dll找不到它们需要的dll,那在import cv2的时候就会抛出一个非常ugly的DLL load failed的错误。
  8. 如果一切正常,在该目录下运行python输入import cv2应该能够正常引入。如果十分不幸引入失败抛出DLL Load Failed异常(在下一篇博客中小姐姐会通俗的解释DLL Load Failed的错误,并给出搜索指定依赖是否在path路径中的代码),首先在cmd中echo %path%确定opencv的bin目录是否包含在环境变量之下。如果是,且依旧抛出DLL Load Failed异常,那么就说明是opencv编译出的dll文件再链接的dll无法找到,这时候返回cmake,将BUILD_SHARED_LIBS取消勾选,以静态库方式编译pyd文件,然后重新Configure, Generate, Open Project, 并且在解决方案资源管理器的binding目录下重新编译opencv_python3。在编译完成之后,打开vs2015开发人员命令提示,cd到.pyd所在的文件夹,输入dumpbin cv2.cp35-win_amd64.pyd /dependents 找到.pyd文件的所有dll依赖库,仔细检查没有包含在path路径中的库,并将其目录包含入path,这时再import cv2即可成功,看看dir(cv2.cuda下有多少cuda加速后的python库供你使用吧)。最后,将.pyd文件放在你的python解释器能找得到的地方,并且给自己买杯咖啡,奖励一下自己吧!

 本文章由本小姐arieslady_csu_zyc原创,拒绝一切形式的转载

你可能感兴趣的:(opencv4.0.0_beta+cuda9.0+vs2015+anaconda3.5_python教程与问题解答)