Visual Studio 2019 从依赖包开始手动编译opencv

2023-11-11

windows opencv compile document

本文主要是教你如何从源码编译软件包,建议你通过vcpkg安装完整版本的OpenCV4(含gpu功能)来安装使用。

1 依赖项目编译安装

在开始之前必须先安装vcpkg

1.1 准备工具

  • 安装Visual Studio 2019比;较简单,不再说明。要注意的是安装时必须包含C++模块。

  • 安装vcpkg

  • 安装CMake

1.2 安装CUDA工具包

下载安装包,下载Latest Release版本,可能需要注册后才能下载。

1.3 安装Intel® Integrated Performance Primitives(IPP)

英特尔集成性能基元可用于提高OpenCV库的颜色转换、Haar训练和DFT函数的性能。请注意这不是一项免费服务。

在名称[Name (Click to initiate download)]后带号的表示在线安装包,不带的表示离线安装包,请下载离线安装包。

下载安装包

下载后的文件直接解压,然后再安装.

1.4 安装Intel® Fortran Compiler Classic and Intel® Fortran Compiler(Fortran)

英特尔Fortran编译器。

重点:该Fortran编译器可以集成到Visual Studio

在名称[Name (Click to initiate download)]后带号的表示在线安装包,不带的表示离线安装包,请下载离线安装包。

下载安装包

下载后的文件直接解压,然后再安装.

1.5 编译Intel Threading Building Blocks (TBB)

英特尔线程构建模块 (TBB) 在 OpenCV 内部用于并行代码片段。使用此功能将确保 OpenCV 库将利用系统 CPU 中的所有内核。
下载源码

cd D:\build\opencv\DEPENDENTS

7z x oneTBB-master.zip
cd oneTBB-master
或者
git clone https://github.com/oneapi-src/oneTBB
cd oneTBB


#pthread是必须的依赖包,因此设置vcpkg,以便于找到pthread
vcpkg search pthread
vcpkg install pthread --triplet=x64-windows

rd /S /Q build
cmake -B build -S . ^
	-DCMAKE_TOOLCHAIN_FILE=E:/vcpkg/scripts/buildsystems/vcpkg.cmake -Wno-dev ^
	-DTBB_TEST=OFF ^
	-DCMAKE_INSTALL_PREFIX=D:\build\opencv\dep\tbb
	
cmake --build build --config Release
cmake --install build
cd .. 
rd /S /Q oneTBB-master

1.6 安装boost

Boost是C++的后备库,它包含非常多的库,比较稳定的库会选择一些纳入C++标准,但是它非常庞大,全部安装需要的时间较长且比较占用磁盘空间,因此我们使用vcpkg按需要安装,以后抽空单独写一篇boost编译的文章。
只要你用C++开发,那么boost

vcpkg search Boost
vcpkg install boost-core boost-filesystem --triplet=x64-windows

1.7 安装Eigen

Eigen是线性代数的C++模板库。Eigen的源码都是写在头文件中的,因此可以不编译.
这里还是编译一下,学习一下编译知识

下载源码

cd D:\build\opencv\DEPENDENTS

#	-DCMAKE_CXX_STANDARD=11 ^
#	-DCMAKE_CXX_STANDARD_REQUIRED:BOOL="1" ^
#	-DCMAKE_CXX_EXTENSIONS:BOOL="0" ^

7z x eigen-3.4.0.zip
cd eigen-3.4.0

rd /S /Q build
cmake -B build -S . ^
	-DCMAKE_TOOLCHAIN_FILE=E:/vcpkg/scripts/buildsystems/vcpkg.cmake -Wno-dev ^
	-DCMAKE_INSTALL_PREFIX=D:\build\opencv\dep\eigen
#默认情况下出了警告,主要是c++标准相关的,因此我们用cmake-gui看一下依赖包和相关的编译参数	
cmake-gui -B build -S . ^
	-DCMAKE_TOOLCHAIN_FILE=E:/vcpkg/scripts/buildsystems/vcpkg.cmake -Wno-dev ^
	-DCMAKE_INSTALL_PREFIX=D:\build\opencv\dep\eigen

cmake -B build -S . ^
	-DCMAKE_TOOLCHAIN_FILE=E:/vcpkg/scripts/buildsystems/vcpkg.cmake -Wno-dev ^
	-DCMAKE_INSTALL_PREFIX=D:\build\opencv\dep\eigen ^
	-DEIGEN_COMPILER_SUPPORT_CPP11:BOOL="1" ^
	-DEIGEN_TEST_CXX11:BOOL="1" ^
	-DEIGEN_TEST_CUDA:BOOL="1" ^
	-DEIGEN_TEST_CUDA_CLANG="1"
	
cmake --build build --config Release
cmake --install build
cd .. 
rd /S /Q eigen-3.4.0

1.8 编译Imath

cd D:\build\opencv\DEPENDENTS
git clone https://github.com/AcademySoftwareFoundation/Imath.git
cd Imath
rd /S /Q build
cmake -B build -S . ^
	-DCMAKE_TOOLCHAIN_FILE=E:/vcpkg/scripts/buildsystems/vcpkg.cmake -Wno-dev ^
	-DCMAKE_INSTALL_PREFIX=D:\build\opencv\dep\imath
cmake --build build --config Release
cmake --install build
cd .. 
rd /S /Q Imath

1.9 编译OpenEXR

下载源码

cd D:\build\opencv\DEPENDENTS
7z x openexr-3.1.5.zip
cd openexr-3.1.5
rd /S /Q build
cmake -B build -S . ^
    -DCMAKE_TOOLCHAIN_FILE=E:/vcpkg/scripts/buildsystems/vcpkg.cmake -Wno-dev ^
    -DImath_DIR=D:\build\opencv\dep\imath\lib\cmake\Imath ^
    -DCMAKE_INSTALL_PREFIX=D:\build\opencv\dep\openexr
cmake --build build --config Release
cmake --install build
cd .. 
rd /S /Q openexr-3.1.5

1.10 安装python 2.7

下载

截止发稿Python2的最新版本为2.7.18.下载Windows x86-64 MSI installer,然后运行安装包。

因为可能存在多个python版本的情况,因此不要将python2.7添加至环境变量PATH,后面使用Python完整路径运行Python 2.7。

在本例中安装位置为C:\Python27.

1.11 安装numpy

#更新pip:
C:\Python27\python -m pip install -U pip
#安装numpy
C:\Python27\Scripts\pip install numpy flake8 pywin32

在命令行中输入开始测试

C:\Python27\python

进入python2.7后输出现面的py代码

import numpy as np 
print np.random.rand(4,4)

如果numpy正确安装后将输出一个4*4的矩阵。注意值是随机的,和本文档中不一致

>>> import numpy as np
>>> print np.random.rand(4,4)
[[0.87818158 0.1910759  0.12547178 0.89111631]
 [0.20264498 0.5511512  0.08455059 0.88867172]
 [0.75875045 0.96903478 0.90276493 0.13222076]
 [0.99473011 0.02529853 0.29949838 0.52184444]]
>>> exit();

1.12 安装lapack

LAPACK是用Fortran编写的,它提供了用于求解联立线性方程组,线性方程组的最小二乘解,特征值问题和奇异值问题的例程。

  • 在编译前需要安装Intel® Fortran编译器

下载源码

cd D:\build\opencv\DEPENDENTS
tar -xf lapack-3.10.1.tar.gz
cd lapack-3.10.1
rd /S /Q build
cmake -B build -S . ^
    -DCMAKE_TOOLCHAIN_FILE=E:/vcpkg/scripts/buildsystems/vcpkg.cmake -Wno-dev ^
    -DCMAKE_INSTALL_PREFIX=D:\build\opencv\dep\lapack
cmake --build build --config Release
cmake --install build
cd .. 
rd /S /Q lapack-3.10.1

2 编译OpenCV

2.1 安装依赖包

这里为了简化操作,OpenCV的依赖包全部采用vcpkg安装,编译OpenCV不使用依赖包源码。

vcpkg search VTK
vcpkg search OpenBLAS
vcpkg search LAPACK
vcpkg search openjpeg
vcpkg search OpenEXR
vcpkg search BLAS
vcpkg search gstreamer
vcpkg search harfbuzz
vcpkg search gflags
vcpkg search leptonica

vcpkg install tbb eigen3 Imath openexr blas VTK openjpeg openblas gstreamer pthread harfbuzz gflags zlib  protobuf leptonica tesseract --triplet=x64-windows

2.2 编译OpenCV

2.2.1 可能会出现的异常

2.2.1.1 vcpkg异常
Error: while loading libhpdf:
The port directory (E:\vcpkg\ports\libhpdf) does not exist
Error: failed to load port from E:\vcpkg\ports\libhpdf
note: updating vcpkg by rerunning bootstrap-vcpkg may resolve this failure.

解决方案

重新运行下列命令

bootstrap-vcpkg
2.2.1.2 OpenCV requires enabled ‘cudev’ module from ‘opencv_contrib’

如果构建时不指定-DOPENCV_EXTRA_MODULES_PATH=./modules参数,则构建时会报异常如下:

CMake Error at modules/core/CMakeLists.txt:40 (message):
  CUDA: OpenCV requires enabled 'cudev' module from 'opencv_contrib'
  repository: https://github.com/opencv/opencv_contrib

解决方案

添加OPENCV_EXTRA_MODULES_PATH

cd D:\build\opencv\DEPENDENTS\opencv-4.5.5
git clone https://github.com/opencv/opencv_contrib
cmake -B build -DOPENCV_EXTRA_MODULES_PATH=./opencv_contrib -S .
#或者不构建模块
cmake -B build -DOPENCV_EXTRA_MODULES_PATH=./opencv_contrib -DBUILD_opencv_legacy=OFF -S .
2.2.1.3 Cannot determine shared/static library type

异常信息如下,报错的信息为“无法确定共享/静态库类型”

CMake Warning at E:/vcpkg/installed/x64-windows/share/vtk/vtkDetectLibraryType.cmake:54 (message):
  Failed to run `dumpbin` on E:/vcpkg/installed/x64-windows/lib/jsoncpp.lib.
  Cannot determine shared/static library type:
Call Stack (most recent call first):
  E:/vcpkg/installed/x64-windows/share/vtk/FindJsonCpp.cmake:35 (vtk_detect_library_type)
  E:/vcpkg/scripts/buildsystems/vcpkg.cmake:824 (_find_package)
  E:/vcpkg/installed/x64-windows/share/vtk/VTK-vtk-module-find-packages.cmake:209 (find_package)
  E:/vcpkg/installed/x64-windows/share/vtk/vtk-config.cmake:136 (include)
  E:/vcpkg/scripts/buildsystems/vcpkg.cmake:824 (_find_package)
  cmake/OpenCVDetectVTK.cmake:2 (find_package)
  CMakeLists.txt:815 (include)

解决方案

本案例使用VS 2019,默认安装位置。

从开始菜单->"Visual Studio 2019"->“x64 Native Tools Command Prompt for VS 2019”中运行
或者
将“C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30133\bin\Hostx64\x64”设置至环境变量PATH

2.2.2 opencv_contrib

opencv_contrib旨在用于开发“额外”的模块和功能。
opencv_contrib模块通常没有稳定的API,而且它们没有经过很好的测试。因此,它不作为官方OpenCV发行版的一部分发布。
opencv所有新模块都单独开发,并首先在opencv_contrib中发布。当模块成熟并流行起来时,它被移动到中央OpenCV存储库,opencv_contrib开发团队为该模块提供生产质量支持。

2.2.3 构建OpenCV

  • 本章节要从“x64 Native Tools Command Prompt for VS 2019”中运行
  • cmake中的路径千万不要使用"\“,应该使用”/"
cd D:\build\opencv\DEPENDENTS
7z x opencv-4.5.5.zip
cd opencv-4.5.5
#opencv额外的模块。
git clone https://github.com/opencv/opencv_contrib
#删除不需要的模块,因为模块还有非常多的依赖包,手动安装非常麻烦,请使用vcpkg安装opencv
rd /S /Q "opencv_contrib\modules\text"  #tesseract 文字识别

rd /S /Q build
cmake -B build -S . ^
    -DCMAKE_BUILD_TYPE=Release ^
    -DOPENCV_EXTRA_MODULES_PATH="./opencv_contrib/modules" ^
    -DCMAKE_INSTALL_PREFIX="E:/library/opencvgpu" ^
    -DBUILD_EXAMPLES:BOOL="1" ^
    -DWITH_CUDA:BOOL="1" ^
    -DPYTHON_INCLUDE_DIR="C:/Python27/include" ^
    -DPYTHON_LIBRARY="C:/Python27/libs/python27.lib" ^
    -DPYTHON_EXECUTABLE="C:/Python27/python.exe" ^
    -DLAPACK_LIBRARIES="D:/build/opencv/dep/lapack/lib" ^
    -DWITH_TBB:BOOL="1" ^
    -DTBB_DIR="D:/build/opencv/dep/tbb/lib/cmake/TBB" ^
    -DWITH_EIGEN:BOOL="1" ^
    -DEigen3_DIR="D:/build/opencv/dep/eigen" ^
    -DWITH_OPENEXR:BOOL="1" ^
    -DOpenEXR_DIR="D:/build/opencv/dep/openexr"



cmake --build build --config Release
cmake --install build
cd .. 
rd /S /Q opencv-4.5.5
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Visual Studio 2019 从依赖包开始手动编译opencv 的相关文章

  • 如何在 cv2.VideoWriter 中使用 FPS 参数?

    好的 所以我正在制作视频 我想确切地知道如何使用 FPS 参数 它是一个浮点数 所以我假设这是我想要的每帧之间的间隔 你能给个例子吗 我只想知道视频会如何随着 FPS 参数值的变化而变化 因为我制作的视频现在太快了 谢谢 确实只是这样 fr
  • OpenCV 2.2 和多 CPU - opencv_haartraining.exe 是多线程的吗?

    我在 VS 2010 上构建了 OpenCV 2 2 启用了 TBB 3 支持 我确保所有项目都有正确的 tbb lib 目录 并将 tbb lib 列为依赖项 通过隐藏 tbb dll 进行验证 果然 haartraining exe 抱
  • 使用 NDK 构建具有适用于 Android 的 cmake 构建文件的 C++ 项目

    我必须构建 2 个独立的 C 项目 它们具有针对不同平台的 Cmake 构建文件设置 我想使用 NDK 为 Android 构建它们 以便我可以将它们用作 Android Studio 中的预构建库 如何使用 NDK 为 Android 构
  • 如果 CMAKE_RUNTIME_OUTPUT_DIRECTORY 更改,CMake 无法找到测试

    我正在使用 CMake 构建我的项目 并且尝试为每个模块创建一堆测试套件 显然如果我修改变量CMAKE RUNTIME OUTPUT DIRECTORY那么 ctest 找不到要运行的测试并失败 我做了一个最小的例子来展示我正在谈论的内容
  • OpenCv读/写视频色差

    我试图简单地使用 openCV 打开视频 处理帧并将处理后的帧写入新的视频文件 我的问题是 即使我根本不处理帧 只是打开视频 使用 VideoCapture 读取帧并使用 VideoWriter 将它们写入新文件 输出文件看起来比输入更 绿
  • 如何将多行文本插入到框架/图像中

    我使用 C 和 OpenCV 创建了一个框架 并想在其中插入几行文本 使用以下代码 putText frame My text here cvPoint 30 30 FONT HERSHEY COMPLEX SMALL 0 8 cvScal
  • opencv水印周围的轮廓

    我想在图像中的水印周围画一个框 我已经提取了水印并找到了轮廓 但是 不会在水印周围绘制轮廓 轮廓是在我的整个图像上绘制的 请帮我提供正确的代码 轮廓坐标的输出为 array 0 0 0 634 450 634 450 0 dtype int
  • 从扫描文档中提取行表 opencv python

    我想从扫描的表中提取信息并将其存储为 csv 现在我的表提取算法执行以下步骤 应用倾斜校正 应用高斯滤波器进行去噪 使用 Otsu 阈值进行二值化 进行形态学开局 Canny 边缘检测 进行霍夫变换以获得表格行 去除重复行 10像素范围内相
  • 如何检测斑点并将其裁剪成 png 文件?

    我一直在开发一个网络应用程序 我陷入了一个有问题的问题 我会尝试解释我想要做什么 在这里您看到第一个大图像 其中有绿色形状 我想要做的是将这些形状裁剪成不同的 png 文件 并使它们的背景透明 就像大图像下面的示例裁剪图像一样 第一张图像将
  • 使用卡尔曼滤波器跟踪位置和速度

    我正在使用卡尔曼滤波器 恒定速度模型 来跟踪物体的位置和速度 我测量对象的 x y 并跟踪 x y vx vy 这是有效的 但是如果在传感器读数 x y vx vy 上添加 20 mm 的高斯噪声 即使该点没有移动 只是噪声也会发生波动 对
  • 在cmake中,什么是“项目”?

    这个问题是关于project命令 推而广之 是什么concept of a project意思是cmake中的 我真的不明白什么是project是 以及它与target 我想我确实理解 我看了一下cmake 文档project http w
  • CMake:连续编译程序两次

    为了能够进行许多自动优化 我希望能够使用标志编译我的程序 fprofile generate首先 然后运行它生成配置文件 然后使用以下命令重新编译程序 fprofile use反而 这意味着我想连续编译我的程序两次 使用两个不同的CMAKE
  • 通过ExternalProject_Add 使用 pybind11 进行 CMake 项目的智能方法

    我正在使用编写一个 python 模块pybind11 with CMake3 9 4 因为方便所以想下载pybind11源文件使用ExternalProject Add in my CMakeLists txt 当我跑步时cmake 它不
  • 在Python中从整个图像中检测表格部分

    我有一张尺寸为 3500x5000 的图像 现在我只想检测整个图像中的表格部分 如果不能直接进行 OCR 处理 则对其进行裁剪和旋转 经过所有搜索后 我想到了使用裁剪图像中的每个单元格的想法https medium com coinmonk
  • 我的 Opencv 应用程序处理速度非常慢

    我正在构建一个 OpenCV 应用程序 它从相机捕获视频 并在删除背景后将其覆盖在另一个视频上 我无法达到合理的速度 因为它以大约 1 fps 的速度播放输出 而我的背景去除以 3 fps 的速度工作 有没有办法以正常速度显示背景视频并以
  • cmake 包括其他目录中的 h 文件

    我在 cmake 项目下进行测试时遇到问题 我的项目是这样安排的 TerrainMap PointAccumulator heightQuadGrid Test 在 TerrainMap 目录中 CMakeLists txt 文件简单地概述
  • 针对 dll/lib 的 cmake 链接

    我的 cmake 的输出是一个静态库 我正在这样创建它 add library myMainLib STATIC BACKEND SOURCES 当我尝试让 myMainLib 链接到第三方 lib dll 时 出现了问题 dll 文件将在
  • C++ OpenCV 3.4 / FFMPEG 3.4.1 VideoWriter 和 MP4 输出文件格式

    我正在运行 Linux 内核 4 9 35 ti r44 的 ARM BeagleBone X 15 Debian 机器 在我的 C Qt 5 应用程序中 我想将 cv Mat 帧保存为 MP4 格式视频 我安装了 libx264 并从头开
  • 在cmake中集成bash测试脚本

    我有一个 C cmake 项目 它使用 Boost Test 进行单元测试 现在我想向 cmake 公开一系列 bash 脚本 用于集成测试 假设每个脚本在以下情况下返回 0PASS或某些情况下 0FAILURE 我希望每次运行时都执行每个
  • 尝试使使用 OpenCV 的 java 应用程序(可执行 Jar)可移植。出现不满意的链接错误

    我制作了一个应用程序 用于从网络摄像头抓取视频并使用 OpenCV 和 JavaCV 检测运动 我正在尝试使用 eclipse 导出为可执行 jar 该程序在 eclipse 中运行良好 就像我编写该程序的计算机上的 exe jar 一样

随机推荐