使用CMake构建OpenCV项目

摘要:
这篇文章我们来对我们的安装进行测试,并介绍如何用CMake工具快捷地构建OpenCV项目。 为了使整个项目更加条理,我们的文件夹采用如下组织方式:
这篇文章我们来对我们的安装进行测试,并介绍如何用CMake工具快捷地构建OpenCV项目。
为了使整个项目更加条理,我们的文件夹采用如下组织方式:

bin
build
CMakeLists.txt
src
使用CMake构建OpenCV项目第1张

其中bin目录用于放编译生成的可执行文件,build目录用于cmake构建项目,src用于放源代码。"CMakeLists.txt"这个名字,一个字都不能错。
编写的OpenCV示例代码:
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>

usingnamespace std;
usingnamespace cv;

int main(int argc, char** argv)
{
    if (argc !=2)
    {
        cout <<"Usage: opencv_test <image path>"<< endl;
        return-1;
    }

    char*imgName = argv[1];
    Mat image;

    image = imread(imgName, 1);
    if (!image.data)
    {
        cout <<"No image data"<< endl;
        return-1;
    }
    Mat gray_img;

    cvtColor(image, gray_img, COLOR_BGR2GRAY);
   // imwrite("~/template/result.jpg", gray_img);
    imshow("gray",gray_img);
   cv::waitKey(0);

    return0;
}
这是一个很简单的例子:读取图片然后转化成灰度图。取名为main.cpp。需要注意的是在没有“语法糖”的情况下编写代码非常困难,我选择首先在vs中编好,然后复制。

使用CMake构建OpenCV项目第2张
CMake文件的文件名CMakeLists.txt有严格的大小写要求,注意不要写错。
# project name
PROJECT(opencv_test)
# requirement of cmake version
cmake_minimum_required(VERSION 3.5)

# set the directory of executable files
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${opencv_test_SOURCE_DIR}/bin)

# find required opencv
find_package(OpenCV REQUIRED)
# directory of opencv headers
include_directories(${OpenCV_INCLUDE_DIRS})
# name of executable file and path of source file
add_executable(opencv_test src/opencv_test.cpp)
# directory of opencv library
link_directories(${OpenCV_LIBRARY_DIRS})
# opencv libraries
target_link_libraries(opencv_test ${OpenCV_LIBS})
PROJECT指令的语法是:
PROJECT(projectname [CXX] [C] [Java])
你可以用这个指令定义工程名称,并可指定工程支持的语言,支持的语言列表是可以忽略的,这个指令隐式的定义了两个cmake变量:<projectname>_BINARY_DIR以及<projectname>_SOURCE_DIR。前者指构建路径,后者指工程路径,即CMakeLists.txt所在的路径。
同时cmake系统也帮助我们预定义了PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR变量,他们的值分别跟opencv_test_BINARY_DIR与opencv_test_SOURCE_DIR一致。【注意这里的许多约定,这个名字应该就是目录名称】
为了统一起见,建议以后直接使用PROJECT_BINARY_DIR,PROJECT_SOURCE_DIR,即使修改了工程名称,也不会影响这两个变量。如果使用了<projectname>_SOURCE_DIR,修改工程名称后,需要同时修改这些变量。
接下来是设置cmake要求的最低版本号:
cmake_minimum_required(VERSION 3.5)
SET指令的语法是:
SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
现阶段,你只需要了解SET指令可以用来显式的定义变量即可。这里我们将变量CMAKE_RUNTIME_OUTPUT_DIRECTORY定义为${opencv_test_SOURCE_DIR}/bin也就是工程路径下的bin目录。
下面介绍一个很重要的指令:find_package这个指令以被用来在系统中自动查找配置构建工程所需的程序库。在linux和unix类系统下这个命令尤其有用。CMake自带的模块文件里有大半是对各种常见开源库的find_package支持,支持库的种类非常多。
当它找到OpenCV程序库之后,就会帮助我们预定义几个变量,OpenCV_FOUND、OpenCV_INCLUDE_DIRS、OpenCV_LIBRARY_DIRS、OpenCV_LIBRARIES,它们分别指是否找到OpenCV,OpenCV的头文件目录,OpenCV的库文件目录,OpenCV的所有库文件列表。接着我们就可以使用这些变量来配置了:
include_directories(${OpenCV_INCLUDE_DIRS})
这个指令用来设置包含的头文件的路径。
link_directories(${OpenCV_LIBRARY_DIRS})
这个指令用来设置库文件的路径。
target_link_libraries(opencv_test ${OpenCV_LIBS})
这个指令用来设置需要的库文件,它的语法是:
TARGET_LINK_LIBRARIES(target library1<debug | optimized> library2...)
其中的target就是前面设置生成的目标文件(可执行文件):
add_executable(opencv_test src/opencv_test.cpp)
这个命令很好理解,首先是可执行文件的名字,然后是源码的名字。因此,这个命令一定要在TARGET_LINK_LIBRARIES之前使用。
现在我们的CMakeLists.txt就介绍完了。
进入build目录,然后开始构建:
cd build
cmake ..
因为CMakeLists.txt在buil的父目录中,因此make命令之后使用..。
-- Configuring done
-- Generating done
-- Build files have been written to:/home/liuchaoyang/grad_proj/opencv_test/build
这样就构建成功了,构建之后会生成很多文件,其中就有Makefile文件。
然后编译生成可执行文件:
make
[ 50%] Building CXX object CMakeFiles/opencv_test.dir/src/opencv_test.cpp.o
[100%] Linking CXX executable ../bin/opencv_test
[100%] Built target opencv_test
运行生成的可执行文件以测试我们是否成功,该程序需要传递一个命令行参数。下面是运行结果:
使用CMake构建OpenCV项目第3张
这里非常神奇的就是CMake能够自动给你找到环境。那么也就是说当我们进行类库移植的时候,最好进行一次CMake和make ,看上去非常高级。
总结:
使用CMake构建OpenCV项目第4张
这几个标黄的地方,改成和目录名称一样,应该就可以了。


来自为知笔记(Wiz)


附件列表

    免责声明:文章转载自《使用CMake构建OpenCV项目》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

    上篇网站url路径优化方法完全讲解 (url优化、基于tp5、API接口开发)appium的元素定位总结下篇

    宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

    相关文章

    Linux的SOCKET编程详解

    Linux的SOCKET编程详解 1. 网络中进程之间如何通信 进 程通信的概念最初来源于单机系统。由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进 程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施,如 UNIX BSD有:管道(pipe)、命名管道(named pipe)软中断信号(signal) UNIX syste...

    python下编译py成pyc和pyo

    其实很简单,用python -m py_compile file.py python -m py_compile /root/src/{file1,file2}.py编译成pyc文件。也可以写份脚本来做这事:Code: import py_compile py_compile.compile('path') //path是包括.py文件名的路径 用py...

    Adobe photoshop CS6 + 破解补丁

    软件位置:  链接:https://pan.baidu.com/s/1KeKRS0yIMfeEbOJQ-ilo0g 破解流程 首先断开网络连接 (如果不断网安装过程中会要求登陆)打开Photoshop CS6文件夹里的Adobe CS6文件夹双击set-up.exe 进行安装询问[安装]或[试用]时 选择试用用试用方式不需要输入序列号 安装完成后打开一次...

    谈C/C++ 指针精髓 CHRIS

    指针是C和C++语言编程中最重要的概念之一,也是最容易产生困惑并导致程序出错的问题之一。利用指针编程可以表示各种数据结构, 通过指针可使用主调函数和被调函数之间共享变量或数据结构,便于实现双向数据通讯;并能像汇编[url=javascript:;]语言[/url]一样处理内存[地址从而编出精练而高效的程序。指针极大地丰富了C和C++语言的功能。 ­ ­ 在...

    windows-android-appium环境搭建

    一、安装jdk 安装jdk1.7以上版本,会生成一个jdk目录,和单独的jre目录(注意:不是jdk里面的jre,时安装过程中设置的那个jre路径)安装完成后并配置环境变量 在系统环境变量中,新建:JAVA_HOME的值时jdk目录 然后在path目录中增加jdk的bin目录和jre的bin目录 完成后,在cmd窗口输入java -version能够出...

    Linux Shell常用技巧(十二)

    二十三. Bash Shell编程:    1.  读取用户变量:    read命令是用于从终端或者文件中读取输入的内建命令,read命令读取整行输入,每行末尾的换行符不被读入。在read命令后面,如果没有指定变量名,读取的数据将被自动赋值给特定的变量REPLY。下面的列表给出了read命令的常用方式: 命令格式 描述 read answer 从...