windows下编译opencv 3.4.0

2023-05-16

为了方便后期的调试,自己动手编译opencv3.4.0,这样有需要的时候还可以自己修改修改源代码。

通常来说,编译32位比较简单,直接用cmake生成编译的工程就行了,但64位就比较麻烦了(实际不是麻烦,是没有找到问题的解决办法而已)

今天完成了64位的编译,所以简单记录下整个编译流程。

先下载源代码,我的目录如下:

下载下来后一个sources目录和3个txt文件 ,第一个build不记得了,应该是后来自己放进去的。这个目录在我的电脑里是比较深的,为了方便,可以放的浅一些,但不能是第一级目录,即sources上面至少应该有一层目录比较好,这样是为了整个opencv的文件都在这个目录里,方便管理。

下载后打开cmake gui工具,选择sources目录,我这里为了方便,目标目录选择了和sources同一个位置的vs2015,这个目录是我自己建立的,当然在cmake gui里选择了vs2015,但目录不存在,会提示自己创建它:

 由于我的这个目录已经是正常的工程目录了,所以它会显示这些内容,第一次它是空的,如下所示,我改成不存在的vs2016的样子:

 点击“configure”时提示如下:

 选择“Yes”,然后又会跳出下面的选择:

由于我安装了vs2015,所以我选择2015,其它的就按照默认的即可,然后点“Finish” ,开始分析整个sources目录,在完成后,中间的框中会显示一些选项,可以根据自己的需要进行选择,当然多数情况下按照默认的即可。在第一次点击“Configure”后,中间的框中通常会出现很多红色的项:

 不需要做什么,只是重新再点一次“Configure”即可,这次很快就可以完成。结束后再点“Generate”开始生成工程文件,任务完成之后,就可以去目录里看下,在指定的目录下,会有解决方案文件OpenCV.sln,双击打开vs2015,由于工程好几十个,所以加载过程会比较慢。

加载完成后,为了方便管理生成的文件,在编译之前先进行一些设置,主要内容是生成的obj文件以及dll、lib文件的位置,如果不修改,它们会分布于每个工程的所在目录,当想拷贝整个目录时,就不方便删除或者去年这些不必要的文件了。工程分为三类,一类是环境检查配置的,这类不用管,一类是生成库的,还有一类是正常的生成dll和库的,当然第3类最多,第二类少一些。

除了第一类,所有的工程都要对目标目录进行设置。为了方便64位的一起设置,先在解决方案的配置管理中,添加x64的平台类型,来源选择从win32的配置进行拷贝,我的64位配置名设置的是x64。下面就是设置项:

1. 设置生成文件的目录

 可以选中所有需要设置的工程(第2、3类),然后在任一被选中的工程上点右键,然后选择“属性”,如上图所示(我只选择了4个工程做为示例),在属性窗口中配置选择“所有配置”,平台选择“所有平台”,然后设置两个路径:

输出目录设置为:$(SolutionDir)bin\$(Platform)\$(Configuration)\
中间目录设置为:$(SolutionDir)compile\$(Platform)\$(Configuration)\$(ProjectName)\

这样,生成的所有dll、lib文件,都在cmake指定的根目录下的bin目录中,编译出来的中间文件obj都在compile目录中。

注意:原始的3rdparty是单独的一个目录,为了在设置后也保持这个单独的目录,对于3rdparty分类下的工程,以上两项的设置后面都再加个3rdparty,如下的样子:

输出目录设置为:$(SolutionDir)bin\$(Platform)\$(Configuration)\3rdparty\
中间目录设置为:$(SolutionDir)compile\$(Platform)\$(Configuration)\3rdparty\$(ProjectName)\

2. 设置pdb文件的路径

同样选中所有需要设置的工程,在属性页中设置如下:

 程序数据库文件名:$(OutDir)$(TargetName).pdb,这样pdb文件就和dll文件在同一个目录中了

3. 设置库目录

这一节对第2、3类的设置不完全一样,对于库类型的工程如下:

 可以选中多个此类工程进行设置,在“库管理器”下的“所有选项”中,设置“输出文件”为 $(OutDir)$(TargetName)$(TargetExt)。

对于第3类,则设置如下:

在“链接器” 下的“高级”中,设置“导入库”为 $(OutDir)$(TargetName).lib

以上3类设置,不区分32位和64位,也不区分debug还是release,所以设置比较方便,只要选择所有工程,并选中所有配置和平台,就能一次性设置好。

4. 设置64位标示

有两个地方需要设置,一是machine类型:

 由于64位的配置是从32位拷贝过来的,所以这里的设置和32位一样,在编译时和64位的设置冲突导致无法编译。同样选样同一类的所有工程,在属性窗口中选择“所有配置”,平台切记选中“x64”,然后把“链接器”(对于第2类,则是“库管理器”)->"命令行"中,其他选项框中的“/machine:x86”删除掉

二是x64的标致:

在预处理的定义中加上“_X64” (这个名字自己定义,没有标准,只用于标示64位的编译,后面会用到这个名字),为了方便查看,加在“<不同选项>”之前比较好。

5. 依赖目录的设置

 为了方便,可以选中所有同一类型的工程一次性设置,原始设置是不同的工程可能有不同的依赖,所以设置的也不一样,这里就不管它了,把所有工程都设置上,这样用到的工程就用,用不到的也不会产生负作用。

附加库目录设置为:$(OutDir);$(OutDir)3rdparty\;%(AdditionalLibraryDirectories)

6. 输入库的设置

这个部分设置起来比较麻烦,各个工程都不一样,但对于不同配置,可以一次性设置“所有平台” 的。这个地方的原始设置,主要是基于cmake生成的目录结构,所以它都带了相对路径,现在就是要把这些相对路径全部去掉,但是对于3rdparty下的那些项,则不能简单地去掉路径,这有两个文件,一个是ippiw.lib,可以把路径去掉,也可以保留3rdparty,比如 3rdparty\ippiw.lib,一个是ippicvmt.lib,其形式必需是ippicv\ippicv_win\lib\ia32\ippicvmt.lib,或者前面加个3rdparty,如3rdparty\ippicv\ippicv_win\lib\ia32\ippicvmt.lib。依赖的所有本opencv目录下的lib文件,除了ippicvmt.lib不区分debug和release,其它lib文件都区分,debug的以d结尾,比如ippiwd.lib,release版本的为ippiw.lib。对于3rdparty下的,可以带3rdparty,也可以不带3rdparty,是国类依赖的目录设置包含了3rdparty,所以根据上面依赖的目录设置,所有的3rdparty都可以去掉,但我这里大部分工程都保留了3rdparty,只有2个最开始设置的工程没有保留,因为一开始意识到依赖目录的设置包含了3rdparty,而后来设置时,为了对齐,就全部保留了3rdparty。

7. 依赖的obj文件的路径修改

由于修改了中间文件的生成路径,所这个部分也需要修改。不太记录有哪几个工程涉及到,大概有两三个工程吧。在依据上面的修改完成后,编译32位的debug版,在生成输出窗口中提示有找不到obj文件的工程,找到它,用文本文件编辑器打开它进行修改,一个工程有两个文件,分别为.vcxproj、.vcxproj.filters,打开后搜索.obj,如下为我修改后的一个obj文件:

<Object Include="$(IntDir)..\opencv_core_SSE4_1\convert.sse4_1.obj" />

修改之前它是绝对路径,类似下面这样:

<Object Include="E:\opencv\opencv-3.4.0\vs2015\modul\core\opencv_core_SSE4_1.dir\$(Configration)\convert.sse4_1.obj" />

这里要把工程名之前的部分 E:\opencv\opencv-3.4.0\vs2015\modul\core 换成 $(IntDir)..,去掉后面的 .dir\$(Configration) ,这样就换成了相对路径,并且和修改后的中间文件输出路径想一致了

8. 对64位下的ippiw进行屏蔽

到此,32位的可以正常编译,但64位的还是编译不过,它会提示有个和ippiw有关的函数调用无法链接。刚开始我尝试去寻找ippiw的64位版本,但找了一大圈也没有找到,后来到网上查看编译opencv 64位的文章,提到用cmake配置64位的就可以编译通过。于是我也如法炮制,在cmake选择编译工具那一步时,平台我选“X64”,最后生成工程后编译确实可以成功,然后查看和自己配置的64位编译不过的地方的差异,终于找到了问题所在的位置。

在cmake指定的根目录中,即opencv解决方案所在的目录中,有个 cvconfig.h 文件,通过对比32位和64位目录下的两个,发现在64位下,

#define HAVE_IPP
#define HAVE_IPP_ICV
#define HAVE_IPP_IW

这三行被注释掉了。于是自己修改这个文件如下:

/* Intel Integrated Performance Primitives */
#ifndef _X64
#define HAVE_IPP
#define HAVE_IPP_ICV
#define HAVE_IPP_IW
#endif

前面添加了 _X64 预定义的判断,这个预定义,就是上面预定义设置里添加的那一个。

这样修改后,32位、64位的全都可以编译通过了。

附加说明

以上的设置,主要工作是为了方便文件管理,修改了生成的目录。如果不修改路径,则只需要修改和 _X64 有关的两个设置即可。当然对于 obj 文件的依赖路径可能也需要修改,因为它默认的是32位的路径,对于64位的,需要进行修改,但由于32位和64位是一起的,所以不能修改成硬路径,其中必需带有“$(Platform)”进行自动变化的标示才行

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

windows下编译opencv 3.4.0 的相关文章

  • Delphi中使用FindVCLWindow调用WinHelp32(WinXP Pro SP3 32bit)

    有什么问题吗 procedure TForm1 VCLHelpClick Sender TObject var Ctrl TWinControl begin Ctrl FindVCLWindow Mouse CursorPos if Ctr
  • 防止 WNetAddConnection2 类允许被禁止的用户访问共享文件夹

    我开发了 C windows 应用程序 操作系统是Windows 7 要求 是使用带有凭据的代码访问网络共享文件夹 Test WNetAddConnection2 class 限制 是某些用户可以访问此共享文件夹 测试 但对于其他用户 设置
  • C++ 使用 Windows 命名管道

    由于某种原因 桅杆和从属装置都失败了 但是我可以找到任何关于它们如何工作的好例子 所以我不确定我哪里出了问题 在 ConnectNamedPipe 之后 主设备永远不会退出 WaitForSingleObject 并且从设备在第一个 boo
  • 为什么 fopen 无法打开已存在的文件?

    我在 Windows XP 上使用 Visual Studio 6 是的 我知道它很旧 构建 维护 C DLL 我遇到了 fopen 无法打开现有文件的问题 它总是返回 NULL 我试过了 通过将 errno 和 doserrno 设置为零
  • git 认为文件已更改

    我在一台机器上对一个项目做了一些工作 然后推送到 github 在另一台机器上克隆并做了一些工作 然后推送 然后我回到第一台机器并做了一个pull 现在 第一台机器认为项目中最初的所有文件都已更改 我试过了 git checkout f a
  • 无法加载 JNI 共享库 (JDK)

    当我尝试打开时Eclipse http www eclipse org 弹出对话框指出 无法加载 JNI 共享库 C JDK bin client jvm dll 此后 Eclipse 强制关闭 我想提出以下几点 我检查了这条路径上是否存在
  • 如何使用Python在Django for Windows中激活虚拟环境?

    我被告知要在 Django for Windows 中激活虚拟环境 我应该尝试 environment path Scripts activate 但是当我输入该命令时 cmd 返回此错误 该系统找不到指定的路径 我通过输入以下命令创建了虚
  • 使用 sed 更新 xml 属性(Windows + cygwin 和 Linux)?

    我需要使用 sed 命令对 xml 文件进行更新 但我在这方面遇到了麻烦 它需要在 Windows 使用 cygwin 和 Linux 上运行 XML 具有以下元素
  • OpenCV Mat 和 Leptonica Pix 之间的转换

    我需要在 C 中在 OpenCV Mat 图像和 Leptonica Pix 图像格式之间进行转换 这用于 8 位灰度图像的二值化 我发现发现了 ikaliga的回答 https stackoverflow com a 25929320 2
  • 在高 dpi Windows 平台上自动重新缩放应用程序?

    我正在编写一个需要在高 dpi Windows 192dpi 而不是 96dpi 上运行的 Qt 应用程序 不幸的是 Qt 框架尚不支持高 dpi 至少在 Windows 上 因此我的应用程序及其所有元素看起来只有应有尺寸的一半 有没有办法
  • Python3 在 DirectX 游戏中移动鼠标

    我正在尝试构建一个在 DirectX 游戏中执行一些操作的脚本 除了移动鼠标之外 我一切都正常 是否有任何可用的模块可以移动鼠标 适用于 Windows python 3 Thanks I used pynput https pypi or
  • CPU 周期与总 CPU 时间

    在 Windows 上 GetProcessTimes 和 QueryProcessCycleTime 可用于获取应用程序所有线程的总计 我期望 显然是天真地 找到总周期数和总处理器时间 用户 内核 之间的比例关系 当转换为相同的单位 秒
  • 如何在 cv2.VideoWriter 中使用 FPS 参数?

    好的 所以我正在制作视频 我想确切地知道如何使用 FPS 参数 它是一个浮点数 所以我假设这是我想要的每帧之间的间隔 你能给个例子吗 我只想知道视频会如何随着 FPS 参数值的变化而变化 因为我制作的视频现在太快了 谢谢 确实只是这样 fr
  • 从其可执行文件的路径获取服务名称

    我有一个可执行文件的路径 它是一个正在运行的服务应用程序 例如 C Program Files x86 Someapp somesvc exe 我想停止并启动它 为此我想我需要获取服务的名称 如下所示 this https stackove
  • 如何以管理员身份在 rake 任务中运行 shell 命令?

    我有一个简短的 cmd 文件 我想将其作为部署过程的一部分运行 不幸的是 cmd 文件需要管理员权限 是否可以从 rake 中获得管理员权限 或者我是否需要以管理员身份启动 shell 您可以尝试runas http ss64 com nt
  • 为什么Android的ImageReader类这么慢?

    我尝试了适用于 Android 3 4 1 的全新 OpenCVJavaCamera2View但它太慢了 仅显示相机视图约 15 fps 当我尝试较旧的JavaCameraView相反 它给了我很好的结果 30fps 这是我相机的极限 我想
  • OpenCV 2.2 和多 CPU - opencv_haartraining.exe 是多线程的吗?

    我在 VS 2010 上构建了 OpenCV 2 2 启用了 TBB 3 支持 我确保所有项目都有正确的 tbb lib 目录 并将 tbb lib 列为依赖项 通过隐藏 tbb dll 进行验证 果然 haartraining exe 抱
  • 如何修复圆角按钮中边框和背景之间的空白?

    我为我的 WPF 应用程序创建了一个简单的按钮模板
  • 批处理脚本 - IF EXIST 复制到 %localappdata% 错误

    我似乎被批处理脚本困住了 需要一些帮助 基本上我需要检查文件是否存在于文件夹中 localappdata 如果确实如此 则覆盖该文件 如果没有放置在不同的位置 那么目前它的内容如下 IF EXIST localappdata foldern
  • 图像梯度角计算

    我实际上是按照论文的说明进行操作的 输入应该是二进制 边缘 图像 输出应该是一个新图像 并根据论文中的说明进行了修改 我对指令的理解是 获取边缘图像的梯度图像并对其进行修改 并使用修改后的梯度创建一个新图像 因此 在 MATLAB Open

随机推荐

  • 匈牙利算法解决两个坐标列表匹配问题

    匈牙利算法 xff1a python线性规划 xff08 linear programming xff09 与分配问题 xff08 assignment problem xff09 linear sum assignment的使用 pyth
  • word如何在文中添加参考文献的引用并自动更新

    步骤 1 添加参考文献 打开word xff0c 将文章末尾写第一个参考文献 xff0c 如下图所示 2 添加参考文献的编号 点击编号库 xff0c 在下拉菜单中选择需要的编号格式 xff0c 如下所示 如果编号库中没有所需格式 xff0c
  • Stable Diffusion Web UI + Anaconda环境 + 本地Windows系统部署

    Stable Diffusion Web UI 43 Anaconda环境 43 本地Windows系统部署 最近的很多AIGC模型层出不穷 xff0c Stable Diffusion 模型作为一个开源的热门生成式模型 xff0c 或许对
  • VirtualBox 宿主机ping不通虚拟机解决方案

    一般VirtualBox新创建的虚拟机 xff0c 默认是一个网卡 xff0c 网络类型是NAT xff0c 此方式下与VMware不同的是 xff0c virtualbox的效果是 xff0c 虚拟机可以ping通宿主机 xff0c 宿主
  • SVD进行图像压缩案例

    理论部分参考这篇文章 xff0c 写的非常好 本文主要是直观感受一下SVD对图像进行压缩的作用 案例图片如下 xff08 PS 图片为华山 xff0c 拍摄于2023 4 29 xff09 1 首先需要将上述图片转换为矩阵 xff0c 利用
  • QPainter的字符设置和获取接口

    参考网址 xff1a Qt绘制字体并获取文本宽度 邶风 博客园 cnblogs com 简单记录 xff1a QPainter painter this QFont oldFont 61 painter font QFont newFont
  • My God,CImage裁剪图片变成黑色了

    一直以来 xff0c 用CImage裁剪图片 xff0c 代码如下 xff1a CImage img if FAILED img Load strFileFrom return int imgH 61 img GetHeight int i
  • WEB API返回的字符串列表

    参考网址 xff1a https www cnblogs com yuanmo p 10045467 html 开发工具 xff1a vs2015 语言 xff1a C ASP NET 5 第一次弄asp net mvc xff0c 太难了
  • python中把float类型转换成日期

    从excel的某一格中读出日期时 xff0c 发现是一个float类型 xff0c 但它在显示的时候却是一个日期 xff0c 这个就要在代码中处理了 xff0c 如下进行转换 xff1a 44152 0146412037 DateObj 6
  • Java调用C++库dll文件接口(JNI)回传int参数(引用)

    vc写了一个标准的动态库 xff0c 有如下接口 xff1a const WCHAR execCommand const char param int amp errCode java中的接口声明 xff1a VideoUnit java
  • MVC5后台C#无法访问网络共享目录的解决办法

    开发环境 xff1a vs2015 xff0c C xff0c MVC5 做了一个简单的网站 xff0c 其重点是后台需要访问其它电脑上的共享目录 xff0c 在调试的时候一切正常 xff0c 发布版本之后 xff0c 在服务器上无法正常访
  • python-Qt的多个QLineEdit和QComboBox分别绑定同一个槽时的信息获取

    这个标题可能会有点容易让人弄错 xff0c 我只不过是想把QLineEdit和QComboBox的绑定处理放在同一标题可能容易让人看错 xff0c 我只不过是想把QLineEdit和QComboBox的问题放在一篇文章中而已 xff0c 所
  • 鸿蒙App调试入门

    前段时间下载了DevEco Studio xff0c 根据提示创建了一个手机App xff0c 不做任何修改 xff0c 直接调试时 xff0c 总是提示失败 xff0c 不支持 xff0c 如下的样子 xff1a 点左边的三角符号也是一样
  • MFC单文档程序不设置文档标题

    对于MFC单文档 多文档估计也是一样 程序来说 xff0c 创建一个工程后不做任何修改 xff0c 直接编译运行 xff0c 会发现程序标题 xff0c 除了带有程序名称之外 xff0c 还带有 未命名 xff0c 整个标题的样子差不多是这
  • Mvc Web工程中加入Web Api后,Web Api接口无法访问

    用vs2015 C 建立了一个web mvc工程 xff0c 实现了一些简单的功能 xff0c 包括对后台数据库的访问 xff0c 添加 修改数据等普通功能 xff0c 其中有好几个controller xff0c 比如用户管理 任务添加修
  • OpenMP与OpenMPI介绍与简单程序编写

    首先说一下OpenMP与OpenMPI的区别 OpenMP主要是在单机上进行并行 xff0c 是基于共享内存的 xff0c 共享内存就是多个核 xff08 包括单CPU多核和多CPU多核 xff08 都是单机 xff09 xff09 共享一
  • Web Api获取POST中的body数据

    一个普通的web api xff0c 大佬说为了安全 xff0c 上传的参数数据一般是放在Body中的 xff0c 所以后台也要从body中来拿参数 xff0c 这个确实好一些 xff0c 在地址栏中看不到参数 xff0c 相对来说 xff
  • MFC视图中的OnPaint()更新

    今天弄了个工具 xff0c vs2015 mfc 单文档结构的工程 xff0c 没有选择 34 文档 视图体系结构支持 34 xff0c 因为我不需要文档 xff0c 只需要有个视图就行了 后台有个从网络接收数据的服务 xff0c 当收到数
  • vs中加入.h文件后改名为.cpp后,其中的函数无法被链接

    这个问题一般碰不到 一个项目 xff0c 是vs2015 c 43 43 win32类型的 xff0c 项目不大 xff0c 大约有10来个源文件 xff0c 一切都是正常的 后来由于需要添加md5加密 xff0c 所以就从别的项目中拿了一
  • windows下编译opencv 3.4.0

    为了方便后期的调试 xff0c 自己动手编译opencv3 4 0 xff0c 这样有需要的时候还可以自己修改修改源代码 通常来说 xff0c 编译32位比较简单 xff0c 直接用cmake生成编译的工程就行了 xff0c 但64位就比较