在我的主 CMakeLists.txt 中编译 OpenCV 并将其链接到我的项目

2024-02-10

我是 cmake 的新手。我有一个使用 dlib 和 opencv 的项目。它们被定义为位于third_party文件夹中的子模块。我想将它们链接到我的主项目,即带有 cmake 的“节点”,但我无法实现。我正在分享我的项目树。我使用 find_package(OpenCV) 和 target_link_libraries(recognition-node ${OPENCV_LIBS}) 方式进行操作,但我需要从源代码进行编译而不安装任何东西。最后,我只想写 'cmake 。 && 制作'

.
├── CMakeLists.txt
├── node
│   ├── build.sh
│   ├── CMakeLists.txt
│   ├── configure.sh
│   ├── findfacestask.cpp
│   ├── findfacestask.h
│   ├── main.cpp
│   ├── matrixwrapper.h
│   ├── poolcontext.cpp
│   ├── poolcontext.h
│   ├── recognition.dat
│   ├── recognizefacetask.cpp
│   ├── recognizefacetask.h
│   ├── runscript
│   ├── sp.dat
│   ├── task.cpp
│   ├── task.h
│   ├── unhandledexception.cpp
│   ├── unhandledexception.h
│   ├── webcamfeed.cpp
│   ├── webcamfeed.h
│   ├── wrapper.cpp
│   └── wrapper.h
└── third_party
    ├── dlib
    │   ├── appveyor.yml
    │   ├── CMakeLists.txt
    │   ├── dlib
    │   ├── docs
    │   ├── examples
    │   ├── MANIFEST.in
    │   ├── python_examples
    │   ├── README.md
    │   ├── setup.py
    │   └── tools
    └── opencv
        ├── 3rdparty
        ├── apps
        ├── cmake
        ├── CMakeLists.txt
        ├── CONTRIBUTING.md
        ├── data
        ├── doc
        ├── include
        ├── LICENSE
        ├── modules
        ├── platforms
        ├── README.md
        └── samples

我的顶级 CMakeLists.txt 的内容

cmake_minimum_required(VERSION 2.8.12)

set (CMAKE_CXX_STANDARD 11)

add_subdirectory(node)
add_subdirectory(third_party/dlib)
add_subdirectory(third_party/opencv)

节点/CMakeLists.txt的内容

cmake_minimum_required(VERSION 2.8.12)
project(recognition-node)

set(CMAKE_AUTOMOC ON)

find_package(Qt5Widgets REQUIRED)

add_executable(recognition-node main.cpp  
            webcamfeed.cpp 
            poolcontext.cpp 
            unhandledexception.cpp
            task.cpp
            findfacestask.cpp
            wrapper.cpp
            recognizefacetask.cpp)

target_link_libraries(recognition-node Qt5::Widgets)
target_link_libraries(recognition-node dlib::dlib)
target_link_libraries(recognition-node opencv::core)

它在“make”阶段给出错误:

/home/arnes/workspace/recognition-node/node/poolcontext.h:10:28: fatal error: 
opencv2/core.hpp: No such file or directory

既然你坚持将 opencv 保留在你的项目树中

这是更简单的方法,但我只想以这种方式进行。

这是肯定可以与您在问题中发布的项目树配合使用的解决方案opencv-3.4.1 https://github.com/opencv/opencv/tree/3.4.1。为了简单起见,我将忽略dlib图书馆和Qt依赖性,因为你对此没有任何问题。

Root CMakeLists.txt应有以下内容:

cmake_minimum_required(VERSION 2.8.11) # or anything higher, if you wish
project(recognition-node CXX)

add_subdirectory(node)

The CMakeLists.txt在下面node目录应包含以下内容:

add_subdirectory(third_party)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -g") # or any other additional flags

# at this point you can add find_package(Qt5Widgets REQUIRED) and later link your binary against Qt5::widgets as well
add_executable(myExec main.cpp
# and put here all the other source files of your project ...
)
# for linking libs I have put additionally highgui and imgproc to check the solution against OpenCV official sample
target_link_libraries(myExec opencv_core opencv_highgui opencv_imgproc)

target_include_directories(myExec PUBLIC 
    third_party/opencv/modules/calib3d/include
    third_party/opencv/modules/core/include
    third_party/opencv/modules/cudaarithm/include
    third_party/opencv/modules/cudabgsegm/include
    third_party/opencv/modules/cudacodec/include
    third_party/opencv/modules/cudafeatures2d/include
    third_party/opencv/modules/cudafilters/include
    third_party/opencv/modules/cudaimgproc/include
    third_party/opencv/modules/cudalegacy/include
    third_party/opencv/modules/cudaobjdetect/include
    third_party/opencv/modules/cudaoptflow/include
    third_party/opencv/modules/cudastereo/include
    third_party/opencv/modules/cudawarping/include
    third_party/opencv/modules/cudev/include
    third_party/opencv/modules/dnn/include
    third_party/opencv/modules/features2d/include
    third_party/opencv/modules/flann/include
    third_party/opencv/modules/highgui/include
    third_party/opencv/modules/imgcodecs/include
    third_party/opencv/modules/imgproc/include
    third_party/opencv/modules/ml/include
    third_party/opencv/modules/objdetect/include
    third_party/opencv/modules/photo/include
    third_party/opencv/modules/shape/include
    third_party/opencv/modules/stitching/include
    third_party/opencv/modules/superres/include
    third_party/opencv/modules/ts/include
    third_party/opencv/modules/video/include
    third_party/opencv/modules/videoio/include
    third_party/opencv/modules/videostab/include
    third_party/opencv/modules/viz/include
    third_party/opencv/modules/world/include
)

The CMakeLists.txt under third_party应仅包含:

add_subdirectory(opencv)
# add_subdirectory(dlib) # if you will use dlib, of course also add dlib

我用来验证构建的示例是轮廓2.cpp https://docs.opencv.org/3.4.1/d0/d2a/contours2_8cpp-example.html(只需将内容复制粘贴到main.cpp).

然而,我仍然认为使用这个解决方案是一个糟糕的主意。

  • OpenCv 确实需要很多时间来编译
  • 你必须手动添加包含目录(你可以使用一些宏生成器,但通常它看起来更难看)
  • 在你的构建系统中,你有很多你并不真正需要的目标(超过 300 个),包括install target

所以,我的建议是:如果你愿意,可以将此解决方案用于科学目的,但当你真正需要使用它时,只需在系统上(或在本地,如果你不是管理员)编译和安装 OpenCv 即可。

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

在我的主 CMakeLists.txt 中编译 OpenCV 并将其链接到我的项目 的相关文章

  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • 使用 WebClient 时出现 System.Net.WebException:无法创建 SSL/TLS 安全通道

    当我执行以下代码时 System Net ServicePointManager ServerCertificateValidationCallback sender certificate chain errors gt return t
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • 重载<<的返回值

    include
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • 测试用例执行完成后,无论是否通过,如何将测试用例结果保存在变量中?

    我正在使用 NUNIT 在 Visual Studio 中使用 Selenium WebDriver 测试用例的代码是 我想在执行测试用例后立即在变量中记录测试用例通过或失败的情况 我怎样才能实现这一点 NUnit 假设您使用 NUnit

随机推荐