又到了编译OpenCV的季节,坑爹的是,这次竟然跳进了那么多坑。
废话少说,现在的OpenCV编译的坑还真多。
这里我只编译了opencv及其contrib模块(比如SIFT这类有版权的算法),并没有加上caffe以及torch的绑定。
------------------------------------------------------------------------------------------------------------------------------------------
0)下载git
直接百度如何安装,或者到github上有个图像化的工具,你去下载也可以。
1)首先下载源代码以及其他包
在opencv目录执行git clone https://github.com/Itseez/opencv.git
在opencv_contrib目录执行git clone https://github.com/Itseez/opencv_contrib.git
其实你也可以直接在github上下载压缩包也可以,不一定要执行git命令,所以第0步骤也可以不做。
-----------------------------------------------------------------------------------------------------------------------------------------
下载好代码到opencv和opencv_contrib这两个目录后:
下载anaconda2(好用的python大包裹),这你可以自己百度或者谷歌搜索直接下载安装即可:
https://www.continuum.io/downloads
下载Eigen(C++矩阵运算库,挺好的),这个你可以自己百度下载然后解压,比如这里解压到eigen这个目录:
http://eigen.tuxfamily.org/index.php?title=Main_Page
下载英伟达的CUDA安装包:
https://developer.nvidia.com/cuda-downloads
下载ant用于编译java绑定
http://ant.apache.org/bindownload.cgi
下载完毕后设置
ANT_EXECUTABLE=E:/apache-ant-1.9.6/bin/ant.bat(你所解压的路径)
------------------------------------------------------------------------------------------------------------------------------------------
2)然后下载cmake的gui版本
https://cmake.org/download/
别下载rc版本,下载稳定版的cmake!!,不然后面会出现bioinspired这个模块没法编译,原因就是cmake在调用cl2cpp.cmake文件的时候会出错自己退出了。然后导致该模块死活编译不起来。我是有多背。
在vs的选项-》项目和解决方法-》生成并运行中的MSBUILD生成详细信息修改为诊断,就可以看到MSBUILD出错的原因了,发现执行到那里,就执行不下去了,然后把那段命令复制到CMD一执行,高潮来了!竟然出错了,回头一看自己下载的cmake版本,竟然是rc版,果断下载稳定版,直接通过。。。。
------------------------------------------------------------------------------------------------------------------------------------------
3)打开cmake,定位到opencv的目录,然后选择configure出现选择编译器选项,注意这里只能选择vs2013/2012/2010,vs2015还不受支持。。。
-----------------------------------------------------------------------------------------------------------------------------------------
4)结束之后会出现若干选项在下面。
将WITH_CUBLAS打钩
将CUDA_FAST_MATH打钩
将OPENCV_EXTRA_MODULES_PATH设置为E:/opencv_contrib/modules(这里请根据你自己的路径设置)
将EIGEN_INCLUDE_PATH设置为E:/eigen(这里根据你自己的情况设置)
将WITH_OPENMP打钩
将WITH_OPENGL打钩
将WITH_NVCUVID打钩
将WITH_CUDA打钩(如果没有勾选的话)
其实你也可以给
ENABLE_SSE
....................
EMABLE_SSSE3
这一系列的选项打钩,以优化CPU上面的代码。
此外还有
OPENCL_FOUND
WITH_OPENCL
WITH_OPENCLAMDBLAS
WITH_OPENCLAMDFFT
WITH_OPENCL_SVM
我建议都不要勾选。如果你勾选了在编译的时候没有出现问题,也可以啊。
注意:BUILD_opencv_world这个千万别选,否则就不能编译python的绑定了,这里我发现会提示找不到python的lib,这个好诡异哦。。。
至于其他选项,我想说的是有个CUDA_SEPARABLE_COMPILATION这个还是别选,分离编译,到时候还是会出问题。像我这种喜欢来事的人,当初选了,就坑爹在这卡了很久。
还有个坑爹的问题是:
错误 6511 error LNK1181: 无法打开输入文件“..\..\lib\Release\opencv_bioinspired310.lib”E:\opencv3\buildtemp\modules\bioinspired\LINKopencv_test_bioinspired
这个所谓的opencv_bioinspired310我始终编译不出来。。。不知道为何(前面给出了原因)
------------------------------------------------------------------------------------------------------------------------------------
参考:
[1]VS2015不能编译,小日本做的实验发现是不能编译,我自己编译也不能。。。。
http://qiita.com/fukushima1981/items/961918db7835160cdde5
[2]无意中搜到的教程,也不错。。
https://putuyuwono.wordpress.com/2015/04/23/building-and-installing-opencv-3-0-on-windows-7-64-bit/
[3]我猜想,你有可能需要编译protobuf
https://developers.google.com/protocol-buffers/
[4]cmake的一些指令也是你可能需要的,特别是在configure的时候cmake到github上下载ffmpeg这个dll,奇慢无比还有一个ipp的压缩包也是很慢,你要是了解了cmake的指令以后在opencv/cmake目录下的OpenCVUtils.cmake文件打开
找到这一段,把message作为打印使用,下面代码的红色部分注释掉就可以看到真实的下载地址,是可以知道下载的地址的,然后用迅雷下载,会很快。
function(ocv_download)
cmake_parse_arguments(DL "" "PACKAGE;HASH;URL;DESTINATION_DIR;DOWNLOAD_DIR" "" ${ARGN})
if(NOT DL_DOWNLOAD_DIR)
set(DL_DOWNLOAD_DIR "${DL_DESTINATION_DIR}/downloads")
endif()
if(DEFINED DL_DESTINATION_DIR)
set(DESTINATION_TARGET "${DL_DESTINATION_DIR}/${DL_PACKAGE}")
if(EXISTS "${DESTINATION_TARGET}")
file(MD5 "${DESTINATION_TARGET}" target_md5)
if(NOT target_md5 STREQUAL DL_HASH)
file(REMOVE "${DESTINATION_TARGET}")
else()
set(DOWNLOAD_PACKAGE_LOCATION "" PARENT_SCOPE)
unset(DOWNLOAD_PACKAGE_LOCATION)
return()
endif()
endif()
endif()
set(DOWNLOAD_TARGET "${DL_DOWNLOAD_DIR}/${DL_HASH}/${DL_PACKAGE}")
get_filename_component(DOWNLOAD_TARGET_DIR "${DOWNLOAD_TARGET}" PATH)
if(EXISTS "${DOWNLOAD_TARGET}")
file(MD5 "${DOWNLOAD_TARGET}" target_md5)
if(NOT target_md5 STREQUAL DL_HASH)
message(WARNING "Download: Local copy of ${DL_PACKAGE} has invalid MD5 hash: ${target_md5} (expected: ${DL_HASH})")
file(REMOVE "${DOWNLOAD_TARGET}")
file(REMOVE_RECURSE "${DOWNLOAD_TARGET_DIR}")
endif()
endif()
if(NOT EXISTS "${DOWNLOAD_TARGET}")
set(__url "")
foreach(__url_i ${DL_URL})
if(NOT ("${__url_i}" STREQUAL ""))
set(__url "${__url_i}")
break()
endif()
endforeach()
if("${__url}" STREQUAL "")
message(FATAL_ERROR "Download URL is not specified for package ${DL_PACKAGE}")
endif()
if(NOT EXISTS "${DOWNLOAD_TARGET_DIR}")
file(MAKE_DIRECTORY ${DOWNLOAD_TARGET_DIR})
endif()
message(STATUS "Downloading ${DL_PACKAGE}...")
#message(STATUS " ${__url}${DL_PACKAGE}")
file(DOWNLOAD "${__url}${DL_PACKAGE}" "${DOWNLOAD_TARGET}"
TIMEOUT 600 STATUS __status
EXPECTED_MD5 ${DL_HASH})
if(NOT __status EQUAL 0)
message(FATAL_ERROR "Failed to download ${DL_PACKAGE}. Status=${__status}")
else()
# Don't remove this code, because EXPECTED_MD5 parameter doesn't fail "file(DOWNLOAD)" step on wrong hash
file(MD5 "${DOWNLOAD_TARGET}" target_md5)
if(NOT target_md5 STREQUAL DL_HASH)
message(FATAL_ERROR "Downloaded copy of ${DL_PACKAGE} has invalid MD5 hash: ${target_md5} (expected: ${DL_HASH})")
endif()
endif()
message(STATUS "Downloading ${DL_PACKAGE}... Done")
endif()
if(DEFINED DL_DESTINATION_DIR)
execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different "${DOWNLOAD_TARGET}" "${DL_DESTINATION_DIR}/"
RESULT_VARIABLE __result)
if(NOT __result EQUAL 0)
message(FATAL_ERROR "Downloader: Failed to copy package from ${DOWNLOAD_TARGET} to ${DL_DESTINATION_DIR} with error ${__result}")
endif()
endif()
set(DOWNLOAD_PACKAGE_LOCATION ${DOWNLOAD_TARGET} PARENT_SCOPE)
endfunction()
https://cmake.org/documentation/
[5]生成文档的工具,这个你安装好后就用cmake的gui工具configure就会编译文档啦
http://www.stack.nl/~dimitri/doxygen/download.html#srcbin
[6]生成文档的时候用到的生成UML的工具
http://zh.plantuml.com/download.html
然后设置环境变量PLANTUML_JAR为E:\plantuml.jar