使用CMake构建OpenCV项目

上一篇文章中,我们介绍了如何在ubuntu上安装配置OpenCV,这篇文章我们来对我们的安装进行测试,并介绍如何用CMake工具快捷地构建OpenCV项目。

项目结构

为了使整个项目更加条理,我们的文件夹采用如下组织方式:

bin
build
CMakeLists.txt
src

其中bin目录用于放编译生成的可执行文件,build目录用于cmake构建项目,src用于放源代码。

OpenCV源文件

下面是我们写的一个OpenCV示例代码:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>

using namespace std;
using namespace 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, CV_BGR2GRAY);
    imwrite("images/result.jpg", gray_img);

    return 0;
}

这是一个很简单的例子:读取图片然后转化成灰度图。

编写CMake文件

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_DIRPROJECT_SOURCE_DIR变量,他们的值分别跟opencv_test_BINARY_DIRopencv_test_SOURCE_DIR一致。

为了统一起见,建议以后直接使用PROJECT_BINARY_DIRPROJECT_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_FOUNDOpenCV_INCLUDE_DIRSOpenCV_LIBRARY_DIRSOpenCV_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

运行生成的可执行文件以测试我们是否成功,该程序需要传递一个命令行参数。下面是运行结果:

lena-gray

参考资料

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

  • 19
    点赞
  • 140
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值