编译OpenCV3.1简略教程

来源:互联网 发布:mp3铃声截取软件 编辑:程序博客网 时间:2024/05/12 15:05

又到了编译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











0 2