• 配置opencv cmake


    第一种使用 find_package的方法
    示例代码如下:
    # 声明要求的 cmake 最低版本
    cmake_minimum_required( VERSION 2.8 )

    # 声明一个 cmake 工程
    project( pro )

    # 设置编译模式
    set( CMAKE_BUILD_TYPE "Debug" )

    #添加OPENCV库
    #指定OpenCV版本,代码如下
    #find_package(OpenCV 3.3 REQUIRED)
    #如果不需要指定OpenCV版本,代码如下
    find_package(OpenCV REQUIRED)

    #添加OpenCV头文件
    include_directories(${OpenCV_INCLUDE_DIRS})

    #显示OpenCV_INCLUDE_DIRS的值
    message(${OpenCV_INCLUDE_DIRS})

    # 添加一个可执行程序
    # 语法:add_executable( 程序名 源代码文件 )
    add_executable( main main.cpp )

    # 将库文件链接到可执行程序上
    target_link_libraries( main ${OpenCV_LIBS})

    代码部分解释
    find_package(OpenCV REQUIRED)会在Ubuntu系统中找到OpenCVConfig.cmake,该文件定义了OpenCV_INCLUDE_DIRS和OpenCV_LIBS 等变量,因而可以使用 include_directories和target_link_libraries来访问这两个变量。

    可以通过打开terminal输入locate OpenCVConfig.cmake来找到这个.cmake文件,用以确认系统确实安装了OpenCV.

    第二种使用link_libraries(opencv库名的方法)
    既然我们知道了find_package的作用是找到后缀名为.cmake的文件,以此来获取其中的引用目录(.h文件的路径)和库的路径(例如“ /usr/lib/x86_64-linux-gnu/libopencv_video.so”),那么我们也可以选择直接使用正确路径的引用目录和库目录。

    通过include_directories( your/path/to/OpenCV/include)来正确添加引用目录
    通过link_directories( your/path/to/OpenCV/lib) 来添加库的目录
    通过link_libraries(name1 name2 name3)来实现库的链接
    有了link_libraries(name1 name2 name3),就不需要target_link_libraries(main ${PATH/NAME})了。

    示例代码如下(示例中使用的是ROS系统安装的opencv3的路径和库)
    cmake_minimum_required( VERSION 2.8 )
    project( pro )
    set( CMAKE_BUILD_TYPE "Release" )
    set( CMAKE_CXX_FLAGS "-std=c++11" )
    include_directories(
    "/opt/ros/kinetic/include/opencv-3.3.1-dev/"
    )
    #添加动态库的路径
    link_directories("/opt/ros/kinetic/lib/x86_64-linux-gnu")
    #有了上面的路径,下面就可以直接写opencv_aruco3这样的名字了
    #opencv_xxxxx不带d和带d分别表示release和debug版本。
    link_libraries(
    opencv_aruco3
    opencv_bgsegm3
    opencv_bioinspired3
    opencv_calib3d3
    opencv_ccalib3
    opencv_core3
    opencv_cvv3
    opencv_datasets3
    opencv_dpm3
    opencv_face3
    opencv_features2d3
    opencv_flann3
    opencv_fuzzy3
    opencv_hdf3
    opencv_highgui3
    opencv_imgcodecs3
    opencv_img_hash3
    opencv_imgproc3
    opencv_line_descriptor3
    opencv_ml3
    opencv_objdetect3
    opencv_optflow3
    opencv_phase_unwrapping3
    opencv_photo3
    opencv_plot3
    opencv_reg3
    opencv_rgbd3
    opencv_saliency3
    opencv_shape3
    opencv_stereo3
    opencv_stitching3
    opencv_structured_light3
    opencv_superres3
    opencv_surface_matching3
    opencv_text3
    opencv_tracking3
    opencv_video3
    opencv_videoio3
    opencv_videostab3
    opencv_viz3
    opencv_xfeatures2d3
    opencv_ximgproc3
    opencv_xobjdetect3
    opencv_xphoto3
    )
    #生成程序
    add_executable( main main.cpp )
    #不需要target_link_libraries()了

    在写代码过程中发现的东西
    link_directories()单单用这条命令基本没什么意义。一般这里面填写的参数之前也在$PATH中包含了。

    link_libraries里面可以有多个库的名字。

    find_library指令也是用来找库进行链接的。用法如下:
    find_library (<VAR> name1 [path1 path2 ...])
    find_library官方说明
    示例 find_library(OpenCV_LIBS opencv_aruco3 "/opt/ros/kinetic/lib/x86_64-linux-gnu" )
    意为:在路径/opt/ros/kinetic/lib/x86_64-linux-gnu中寻找名为libopencv_aruco3.so的库,将其命名为OpenCV_LIBS。
    正如find_library这个名字所象征的,它只能找一个库,不能同时找多个库,虽然官网有示例说可以加入option实现,但我没有成功。它不能实现类似于aux_source_directory(. SRC)的功能

    find_library()由于只是将某个so文件映射为某个指定的变量,比如将/opt/ros/kinetic/lib/x86_64-linux-gnu/libopencv_aruco3.so映射为OpenCV_LIBS,因而在使用这个libopencv_aruco3.so时,就需要加入target_link_libraries(main ${OpenCV_LIBS})来使这个库成功和main链接

  • 相关阅读:
    类和结构体的区别
    List中的select和where 方法
    js报错,Uncaught SyntaxError: Unexpected token }
    去除list集合中重复项的几种方法
    new
    Dynamic
    ie8下缓存
    datagrid中动态url
    从后台序列化后的类的字符串
    抽象工厂
  • 原文地址:https://www.cnblogs.com/wangshuyi/p/11405364.html
Copyright © 2020-2023  润新知