阅读 120

Mac 平台 OpenCV4.1.2 环境搭建

OpenCV 是开源的计算机视觉库,只需要遵守 BSD 协议,你就可以自由的使用、修改或发布。它包括了数百种计算机视觉算法,比如人工智能领域很火的无人驾驶技术,或者 app 中的人脸登陆、支付等等。

本文针对 Mac 平台下如何使用源代码编译出可执行文件,读者可按着步骤一步步配置,如下的步骤中可先检查自己环境中是否已经存在。

第一步: XCode 的安装

笔者的环境为 MacOS Catalina, 我用了一段时间还是很不错的,读者也可以升级来使用。

如果未安装 XCode 点击此处下载

安装完毕后,接受授权协议。

sudo xcodebuild -license
复制代码

接着安装 Apple 命令行工具,例如 cmake、clang、gcc 等,

sudo xcode-select --install
复制代码

如果你显示如下图,表示你已经安装了。否则会提示你安装。

第二步:安装 Homebrew

Homebrew 是 Mac 平台下的一个包管理器,类似于 ubuntu 中的 apt-get,或者 centos yum。如果还未安装 Homebrew 点击此处查看,或者直接复制下面的命令到 shell 安装。

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
复制代码

笔者这里使用的 shell 环境为 oh-my-zsh, 当然你用 bash 也没有问题。

第三步: 安装 python3

如果您还未安装 python,请点击此处下载, 如果你需要使用的 TensorFlow, 建议你选择 3.6 的版本。笔者这里安装的是 python3.7.4。你可以执行如下命令查看。

OK!如果你看到上的环境,就代表你的环境已经安装完毕。你可以使用如下的命令查看安装位置

因为 OpenCV 是关于计算机视觉的库,而计算机视觉其实处理的就是图像,所以需要先安装一些必要的库。比如 jpeg、png、tiff 等等。

brew install cmake pkg-config
brew install jpeg libpng libtiff openexr
brew install eigen tbb
复制代码

安装 wget,wget 是一个从网络上自动下载文件的自由工具,支持通过 HTTP、HTTPS、FTP 三个最常见的 TCP/IP协议 下载,并可以使用 HTTP 代理。

brew install wget
复制代码

第四步:安装 python 包管理器(pip)

wget https://bootstrap.pypa.io/get-pip.py
sudo python3 get-pip.py
复制代码

安装 puthon 虚拟化环境,一句话简述:各应用有自己的 python 环境。详细介绍 点击此处阅读

sudo pip3 install virtualenv virtualenvwrapper
sudo rm -rf ~/get-pip.py ~/.cache/pip
复制代码

配置环境变量

nano ~/.bash_profile
复制代码

如果你是 zsh 环境请使用如下

nano ~/.zshrc
复制代码

然后拷贝如下环境变量配置

# virtualenv and virtualenvwrapper
export WORKON_HOME=$HOME/.virtualenvs
export VIRTUALENVWRAPPER_PYTHON=/usr/local/bin/python3
source /usr/local/bin/virtualenvwrapper.sh
复制代码

值得注意的是 python3 环境要正确。请注意你的 WORKON_HOME。

更新下你的配置, 你也可以关掉终端后重新打开使配置生效。

source ~/.bash_profile
复制代码

virtualenvwrapper 常用的几个命令:

  • mkvirtualenv <env_name> : 创建一个虚拟环境
  • rmvirtualenv <env_name> : 删除虚拟环境
  • workon <env_name> : 使用虚拟环境

更多的介绍,请查看 Command Reference

接下来创建一个 OpenCV 的 python 虚拟环境。

mkvirtualenv cv -p python3
复制代码

如下图所示,表示你已经成功创建了虚拟环境 cv。

现在你可以使用 cv 虚拟环境了,我们这里使用的是 py3cv4, 表示 python 版本为 3.x, OpenCV 版本为 4.x。同样的还有如下:

  • py3cv3
  • py2cv2

要注意的是需要在刚刚为 OpenCV 创建的虚拟环境中安装。如下图所示,请务必留意!

你可以看到,命令行前端有一个括号包括的 cv。这就说明当前为虚拟环境。

安装 numpy 库,numpy 是 python 扩展库,提供了大量的矩阵运算。

pip install numpy
复制代码

第5步:在 Mac 中安装 OpenCV

前面费了些功夫把环境搭建好,现在就要开始编译 OpenCV 源代码了。首先我们需要下载 opencvopencv_contrib。opencv_contrib 扩展库支持,一般建议安装它。

wget -O opencv4.1.2.zip https://github.com/opencv/opencv/archive/4.1.2.zip
wget -O opencv_contrib4.1.2.zip https://github.com/opencv/opencv_contrib/archive/4.1.2.zip
复制代码

解压下载的包

unzip opencv.zip
unzip opencv_contrib.zip
复制代码

开始编译源码,首先进入 opencv4.1.2 目录下,创建 build 目录

cd opencv-4.1.2
mkdir build
cd build
复制代码

源码使用的是 CMake 来管理,请务必在虚拟环境 cv 中执行如下命令, OPENCV_EXTRA_MODULES_PATH 需要指定你的 opencv_contrib 目录。请务必注意!!!

cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D OPENCV_EXTRA_MODULES_PATH=~/xxx/opencv_contrib-4.1.2/modules \
    -D PYTHON3_LIBRARY=`python -c 'import subprocess ; import sys ; s = subprocess.check_output("python-config --configdir", shell=True).decode("utf-8").strip() ; (M, m) = sys.version_info[:2] ; print("{}/libpython{}.{}.dylib".format(s, M, m))'` \
    -D PYTHON3_INCLUDE_DIR=`python -c 'import distutils.sysconfig as s; print(s.get_python_inc())'` \
    -D PYTHON3_EXECUTABLE=$VIRTUAL_ENV/bin/python \
    -D BUILD_opencv_python2=OFF \
    -D BUILD_opencv_python3=ON \
    -D INSTALL_PYTHON_EXAMPLES=ON \
    -D INSTALL_C_EXAMPLES=OFF \
    -D OPENCV_ENABLE_NONFREE=ON \
    -D BUILD_EXAMPLES=ON ..
复制代码

OK!如果你看到如下的配置,说明已经生成了 Makefile

执行 make, 这里的 -j4 表示运用 CPU 多核心,提高执行效率。

sudo make -j4
复制代码

可能有的朋友在这一步会报错,你可以 点击这里找到解决方法, 我的解决方法如下:

fatal error: boostdesc_bgm.i: No such file or directory

找到新建的 build 目录下,说找不到这几个文件。

cd ./downloads/xfeatures2d
复制代码

将下面的内容全部拷贝到 opencv_contrib-4.1.2 扩展库的 modules/xfeatures2d/src 目录下。

cd opencv-4.1.2
cp build/downloads/xfeatures2d/* ../opencv_contrib-4.1.2/modules/xfeatures2d/src
复制代码

当编译完毕后,可以看到如下的截图。

安装,将动态库安装到系统路径下。

sudo make install
复制代码

第六步:链接 OpenCV4 到 cv 虚拟环境

首先找到 python 安装目录,根据你的安装目录。一般默认会在 /usr/local/lib 下。

cd /usr/local/lib/python3.7
复制代码

找到 cv2.cpython-37m-darwin.so

cd /usr/local/lib/python3.7/site-packages/cv2/python-3.7/
复制代码

链接到虚拟环境 cv 中, 首先确保你的环境为 cv,使用命令 workon cv 进入。

找到虚拟环境中 python 库的安装路径

cd /Users/ciggomac/.virtualenvs/cv/lib/python3.7
复制代码

链接 cv2.cpython-37m-darwin.so 到虚拟环境 cv

ln -s /usr/local/lib/python3.7/site-packages/cv2/python-3.7/cv2.cpython-37m-darwin.so  cv2.so
复制代码

第七步:测试 OpenCV 安装

测试是否能正常打印 OpenCV 版本号

python3
Python 3.7.4 (default, Sep  7 2019, 18:31:37)
[Clang 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'4.1.2'
>>>
复制代码

使用 XCode 学习第一个案例

我们来看一个简单的例子,怎样通过 OpenCV 给一个图片加边框。

  1. 新建一个 Mac 命令行工程2

  1. 创建项目名称,选择 C++

  1. 首先测试环境是否正常,接着开始导入 OpenCV 库

选中工程,找到 Build Settings -> Search Paths

将头文件指向系统查找路径 /usr/local/include, 库路径指向系统查找路径 /usr/local/lib。

  1. 接下来,引入需要的 OpenCV 库, 找到 Build Phases -> Link Binary With Libraries, 然后点击添加,添加新文件, 按下 command + shift + G 输入 /usr/local/lib, 找到如下图的几个库。

  1. main.cpp 代码如下
#include <iostream>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <stdlib.h>
#include <stdio.h>

using namespace std;
using namespace cv;

Mat src, dst;
int borderType;
Scalar value;
char* window_name = "copyMakeBorder Demo";
RNG rng(12345);

int main(int argc, const char * argv[]) {
    int c;
    int top, bottom, left, right;

    /// 装载图像
    src = imread("/Users/ciggomac/Desktop/111.jpeg");

    if( !src.data )
    { return -1;
      printf(" No data entered, please enter the path to an image file \n");
    }

    /// 使用说明
    printf( "\n \t copyMakeBorder Demo: \n" );
    printf( "\t -------------------- \n" );
    printf( " ** Press 'c' to set the border to a random constant value \n");
    printf( " ** Press 'r' to set the border to be replicated \n");
    printf( " ** Press 'ESC' to exit the program \n");

    /// 创建显示窗口
    namedWindow(window_name);

    /// 初始化输入参数
    top = (int) (0.05*src.rows); bottom = (int) (0.05*src.rows);
    left = (int) (0.05*src.cols);
    right = (int) (0.05*src.cols);
    dst = src;

    imshow( window_name, dst );

    while( true )
      {
        c = waitKey(500);

        if( (char)c == 27 )
          { break; }
        else if( (char)c == 'c' )
          { borderType = BORDER_CONSTANT; }
        else if( (char)c == 'r' )
          { borderType = BORDER_REPLICATE; }

        value = Scalar( rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255) );
        copyMakeBorder( src, dst, top, bottom, left, right, borderType, value );

        imshow( window_name, dst );
      }

    return 0;
}


复制代码

效果如下,你可以按下 c 随机生成不同颜色边框, 按下 r 从原图像中 copy 出来填充边框。具体案例 点击这里

关注下面的标签,发现更多相似文章
评论