使用CMake编译基于OpenCV开发的程序的方法
方法
使用CMake编译OpenCV开发的程序分为以下几个步骤:
- 安装编译器和代码编辑器。
- Windows安装Visual Studio社区版,集成了编译器和代码编辑器。
- Ubuntu安装gcc、g++和VSCode:
sudo apt install gcc gc++
- macOS安装XCode Commandline Tools和VSCode:
sudo xcode-select --install
- 安装CMake。
- Windows下载安装程序,安装时勾选将cmake加入环境变量;若未勾选,需要手动将cmake.exe所在目录添加到系统或者用户PATH变量中。
- Ubuntu可用apt安装:
sudo apt install -y cmake
- macOS可用Homebrew安装:
brew install cmake
- 安装OpenCV。
- Windows可从官网下载二进制包,解压到指定目录:如D:/。
- Ubuntu可用apt安装:
sudo apt install -y opencv*
- macOS可以用Homebrew安装:
# 2022.12.22, OpenCV 4.6.0_1
brew install opencv
- 三大桌面操作系统都可以从源码编译OpenCV(4.6.0)。
- 新建环境变量
OpenCV_DIR
,将OpenCV的OpenCVConfig.cmake
文件所在目录添加进去。- Windows是解压opencv目录+build或者cmake目录(
D:/opencv/build
或者D:/opencv/cmake
)。 - Ubuntu和macOS无需设定
OpenCV_DIR
(OpenCV安装时会将cmake配置文件自动添加到cmake modules中);但如果未自动配置,可以手动设定OpenCV_DIR为/usr/local/share/OpenCV
。
- Windows是解压opencv目录+build或者cmake目录(
- 使用以下CMakeLists.txt模版编译源代码
problem1_read_image.cpp
(如果你的源码文件不一样,要修改为你的源码文件名):
# 注意:CMake也是一种编程语言,是大小写敏感的!
# 项目名称
PROJECT(problem1)
# CMake版本要求
cmake_minimum_required(VERSION 3.5)
# 设定OpenCV的环境变量OpenCV_DIR;如果没有在Windows系统中设置,可以在这里设置;
# 否则find_package会报找不到OpenCV库的错误。
# set(OpenCV_DIR /usr/local/share/OpenCV)
# 查找OpenCV库
find_package(OpenCV REQUIRED)
# 添加OpenCV头文件
include_directories(${OpenCV_INCLUDE_DIRS})
# 添加自己编写的源文件 problem1_read_image.cpp,设定生成的目标文件名是 problem1
add_executable(problem1 problem1_read_image.cpp)
# 添加链接库搜索目录
link_directories(${OpenCV_LIBRARY_DIRS})
# 添加链接库
target_link_libraries(problem1 ${OpenCV_LIBS})
- 编译生成可执行文件
在Ubuntu或macOS上打开终端(在Windows上打开命令提示符),切换到在源码cpp文件和input.png所在目录,然后执行
mkdir build
cd build
cmake ..
make -j
- Ubuntu和macOS会直接生成可执行文件,无需额外操作。
- Windows上使用Visual Studio打开生成的sln项目,继续执行编译才能得到可执行文件;
- 运行生成的可执行文件
# mac/Ubuntu
./problem1
# Windows
problem1.exe
- 编译和执行结果
图1 编译和执行结果
附录1 测试代码(problem1_read_image.cpp)
/*
* @Descripttion: C++ Practice
* @Author: Tom Heaven
* @Date: 2022-12-21 15:55:10
* @LastEditTime: 2022-12-22 15:40:24
*/
#include <cstdio>
#include <opencv2/opencv.hpp>
using namespace cv;
int main() {
char filename[255] = "../input.png";
Mat image = imread(filename);
Vec3b pixel = image.at<Vec3b>(50, 50);
printf("(R,G,B)=(%d,%d,%d)\n", pixel[2], pixel[1], pixel[0]);
return 0;
}
附录2 输入图像(input.png)
图2 Input.png