[MacOS] OpenCV4源码build记录(Mac M2平台)

这次要做的事情是在Mac平台上build OpenCV。记录一下踩的坑,主要是参考这篇文章:笔记--Mac下基于源码编译OpenCV(C++)_opencv c++源码_憨豆的小泰迪的博客-CSDN博客

首先是我的电脑的各种版本:

MacBook Air M2 (Ventura 13.2.1)

cmake 3.25.2

clang 14.0.0

 make 3.81

下面是具体build过程

1.下载OpenCV源代码

我直接从opencv github的release页面下载的最新版: Source code(zip)https://github.com/opencv/opencv/archive/refs/tags/4.7.0.zip

解压后会得到opencv-4.7.0的文件夹。

2. 使用cmake生成makefile

进行以下操作

cd opencv-4.7.0
mkdir build
cd build

cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/Users/huyz/Documents/daily/code/opencv-lib -D BUILD_ZLIB=OFF  ..

这里主要说一下最后一行命令,指定了这几个参数:

CMAKE_BUILD_TYPE=RELEASE:build release版本,速度会更快。如果需要对opencv源代码进行修改并调试,就要设置成DEBUG模式。

CMAKE_INSTALL_PREFIX=/Users/huyz/Documents/daily/code/opencv-lib:指定opencv库在电脑上的安装位置。其实这个是可以不指定的,默认是/usr/local。但是我怕把系统路径弄乱了,而且这个路径还需要sudo权限,所以我就装到了一个普通路径下,不需要sudo权限。

BUILD_ZLIB=OFF:这是一个大坑。默认是ON。如果被设置成ON,那么cmake能够顺利通过,然而在make的时候会有报错:

make[2]: *** No rule to make target `zlib', needed by `lib/libopencv_imgcodecs.4.7.0.dylib'.  Stop.
make[2]: *** Waiting for unfinished jobs....

原因不明,难道是zlib已经在系统里有了,所以不需要compile了?通过查看cmake的输出,发现还真的有:

-- Found ZLIB: /Library/Developer/CommandLineTools/SDKs/MacOSX13.1.sdk/usr/lib/libz.tbd (found suitable version "1.2.11", minimum required is "1.2.3")

3. 编译与安装 

make -j8
make install

接下来就是常规操作了。第一行命令就是进行build,我发现make完之后我之前指定的CMAKE_INSTALL_PREFIX目录下什么也没有。后来网上查到还要进行make install。按照我的理解,make install主要就是将头文件、lib文件复制到CMAKE_INSTALL_PREFIX目录下。与此同时,还会生成OpenCVConfig.cmake这种配置文件,之后再学习一下吧。

这个配置文件我也看了一下,是自动生成的cmake格式文件,其中定义了一些常用变量,比如OpenCV_INCLUDE_DIRS,OpenCV_LIBS之类的。

4. 调用opencv的sample程序

参考了开头文章中的链接,试着做了一个颜色空间转换:

# include
# include"opencv2/opencv.hpp"
 
using namespace cv;
 
int main(){
    printf("Hello, Opencv4!\n");
    Mat image = imread("/Users/huyz/Desktop/winter.png"); // 读取图片
    
    Mat yuv;
    cvtColor(image, yuv, COLOR_BGR2GRAY);


    imwrite("gray.png", yuv);
    
    return 0;
}

下面是CMakeLists.txt的内容

cmake_minimum_required(VERSION 3.24)  # 指定 cmake的 最小版本
project(test) # 设置项目名称
set(OpenCV_DIR /Users/huyz/Documents/daily/code/opencv-lib/lib/cmake/opencv4)

find_package(OpenCV REQUIRED)
add_executable(main main.cpp) # 生成可执行文件
target_link_libraries(main ${OpenCV_LIBS} ) # 设置target需要链接的库

这里需要提一点参考文章里的问题:参考文章里的find_package命令是:

find_package(Opencv REQUIRED)

但是这会导致cmake报错:

CMake Error at CMakeLists.txt:5 (find_package):By not providing "FindOpencv.cmake" in CMAKE_MODULE_PATH this project has
asked CMake to find a package configuration file provided by "Opencv", but
CMake did not find one.

Could not find a package configuration file provided by "Opencv" with any
of the following names:

OpencvConfig.cmake
opencv-config.cmake

Add the installation prefix of "Opencv" to CMAKE_PREFIX_PATH or set
"Opencv_DIR" to a directory containing one of the above files. If "Opencv"
provides a separate development package or SDK, be sure it has been
installed.

原因应该就是find_package命令是大小写敏感的。 cmake会试图在Opencv_DIR路径下找这两个.cmake文件(如果有设置Opencv_DIR变量的话)。因此这个大小写问题就很关键,因为我找了一下,实际装到电脑上的文件名字是OpenCVConfig.cmake,哭了。同时OpenCV_DIR必须是直接包含该文件的目录,cmake并不会递归到每个子目录下搜索。

另一个解决方案是提供cmake命令行参数,如下设置CMAKE_INSTALL_PREFI即可。然而与第一种方法不同的是,这种方式下提供的路径并不是.cmake文件所在的父目录,而是make install的目标路径。一般而言.cmake文件会在该install路径的某个深层子文件夹下。

cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/Users/huyz/Documents/daily/code/opencv-lib ..

最后提供一下sample的build&run完整命令(cmake命令不加参数的话默认已经设置好了OpenCV_DIR变量):

mkdir build
cd build

cmake ..
make

./main

简单展示一下左侧的输入图和右侧的颜色转换结果,看到图就想家了,北京今日花粉+沙尘夹击属实难顶,再坚持几个月就能回南方了: (

[MacOS] OpenCV4源码build记录(Mac M2平台)_第1张图片

 感觉cmake果然还是博大精深,之后还要继续再学习一下用法呢。

你可能感兴趣的:(C++,macos,opencv,c++)