项目结构
为了使整个项目更加条理,我们的文件夹采用如下组织方式:
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 ${PROJECT_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要求的最低版本号:
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指令
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命令之后使用..。
然后编译生成可执行文件:
make
运行生成的可执行文件以测试我们是否成功,该程序需要传递一个命令行参数。
您可能感兴趣的文章:Android 通过cmake的方式接入opencv的方法步骤python 下 CMake 安装配置 OPENCV 4.1.1的方法浅谈CMake配置OpenCV 时静态链接与动态链接的选择python利用opencv保存、播放视频Python+OpenCV检测灯光亮点的实现方法Android Studio4.0导入OpenCv4.3.0的方法步骤python openCV自制绘画板Python+OpenCV图像处理——图像二值化的实现Python+OpenCV图像处理——实现轮廓发现