最开始偷懒,想着用最简单的方法安装opencv-python,使用pip install opencv-python,但是发现无法正常读取视频。在/pypi/opencv-python找到了原因

Q: Why I can't open video files on GNU/Linux distribution X or on macOS?

A: OpenCV video I/O depends heavily on FFmpeg. Manylinux and macOS OpenCV binaries are not compiled against it.

所以我们需要走一条稍微曲折一点的路,直接编译opencv

step 1:安装 Xcode

在appstore搜索xcode安装。我们需要xcode帮助我们安装配套的开发者工具,用于后面的opencv编译工作。

- 先注册apple开发者账号

这是免费的。如果你有一个apple id那么可以直接使用,如果你个人资料不全,可能会要求补充。我没有遇到这个问题,直接使用apple id,一路同意条款。这里注册

- 安装xcode

这个过程大约30分钟,xcode安装完成后在我的磁盘中占用4.9g

- 接收apple开发者许可协议

$ sudo xcodebuild -license

- 安装apple 命令行工具

$ sudo xcode-select --install

这里可能会弹出窗口提示你,是否同意安装。我这里没有到这个问题,我之前已经安装过apple 命令行工具

step 2:安装 Homebrew

Homebrew对于mac而言,是类似apt-get之于ubuntu的工具。

- 安装命令

直接复制,在terminal执行

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

- brew修改源

国外源的速度可能是很慢的。所以你需要换一个国内的源。我选了中科大的源,表现还可以。

$ cd "$(brew --repo)"
$ git remote set-url origin git://mirrors.ustc.edu.cn/brew.git
$ echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles' >> ~/.bash_profile
$ source ~/.bash_profile

update一下

brew update

- 配置环境变量

接下来你需要配置一下环境变量,在这个文件 ~/.bash_profile ,如果没有,那么需要你创建一个。

vi ~/.bash_profile

在~/.bash_profile最底下添加下面这一行

# Homebrew

export PATH=/usr/local/bin:$PATH

重新加载~/.bash_profile

source ~/.bash_profile

step 3:python及其虚拟环境

我安装好后的python路径为 /usr/local/Cellar/python/2.7.13

brew install python

接着安装virtualenv 和 virtualenvwrapper,搭建python虚拟环境,更多关于虚拟环境,看这里。为了避免奇怪的问题,建议使用虚拟环境。

$ pip install virtualenv virtualenvwrapper

$ mkvirtualenv opencv_2.7.13 # 创建虚拟环境

$ workon opencv_2.7.13 # 进入虚拟环境

$ pip install numpy # 安装numpy,后面需要

step 4:安装opencv需要的依赖

有的是用来读取图片的,例如jpeg libpng libtiff。有的是用来编译opencv的。

$ brew install cmake pkg-config

$ brew install jpeg libpng libtiff openexr

$ brew install eigen tbb

step 5:从github下载opencv源码

可以打开链接直接下载,也可以通过git clone,opencv,opencv_contrib,后者包含一些有意思的模型。

git clone https://github.com/opencv/opencv_contrib

git clone https://github.com/opencv/opencv

step 6:通过cmake配置opencv3和python2.7

- 创建build文件夹,并进入其中

进入刚下好的opencv文件夹,创建build文件夹,并进入build

$ cd ~/opencv

$ mkdir build

$ cd build

- 配置cmake

不要直接复制以下代码!!,有四个地方需要配置。

cmake -D CMAKE_BUILD_TYPE=RELEASE \

-D CMAKE_INSTALL_PREFIX=/usr/local \

-D OPENCV_EXTRA_MODULES_PATH= 你的opencv_contrib位置 \

-D PYTHON2_LIBRARY= 你的位置 PYTHON2_LIBRARY位置\

-D PYTHON2_INCLUDE_DIR= 你的Python.h位置 \

-D PYTHON2_EXECUTABLE= python虚拟环境的python执行程序地址\

-D BUILD_opencv_python2=ON \

-D BUILD_opencv_python3=OFF \

-D INSTALL_PYTHON_EXAMPLES=ON \

-D INSTALL_C_EXAMPLES=OFF \

-D BUILD_EXAMPLES=ON ..

BUILD_opencv_python2 = ON,BUILD_opencv_python3=OFF,如果你需要python3也可以改变这个配置,但需要注意其他配置的PYTHON2需要改为PYTHON3

如果不配置 OPENCV_EXTRA_MODULES_PATH,将会在下面make -j4报错,make: *** No targets specified and no makefile found. Stop.

PYTHON2_LIBRARY = 指向libpython2.7.dylib文件,一般在如下文件夹,你可能需要小改一下。我的是python 是 2.7.13,你可能是2.7.*

/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/config/libpython2.7.dylib

PYTHON2_INCLUDE_DIR = 指向Python.h所在文件夹,一般在如下文件夹,你可能需要小改一下,同上。

/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/include/python2.7/

PYTHON2_EXECUTABLE= 虚拟环境下的python执行程序地址

这些都弄好后可以,我的配置如下

cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D OPENCV_EXTRA_MODULES_PATH= /Users/xxx/Desktop/opencv_contrib-master/modules \
-D PYTHON2_LIBRARY=/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/config/libpython2.7.dylib \
-D PYTHON2_INCLUDE_DIR=/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/include/python2.7/ \
-D PYTHON2_EXECUTABLE=/Users/xxx/workspaces/opencv_2.7.13/bin/python \
-D BUILD_opencv_python2=ON \
-D BUILD_opencv_python3=OFF \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D INSTALL_C_EXAMPLES=OFF \
-D BUILD_EXAMPLES=ON ..

在terminal中执行,将会显示

需要检查红框中的配置,确保:

Iterpreter 指向虚拟环境的python执行程序

Libraries 指向 libpython2.7.dylib 文件

numpy 是安装在虚拟环境中的numpy

step 7:编译opencv

-编译

如果一切顺利,终于到了激动人心的编译时间。以下代码中的-j4指的是,开4个进程并行编译。

make -j4

这个过程花了我30分钟,其中有一次正在84%报错,但是我重新执行一次,却成功了。过程类似下图,知道100%

-安装

编译过程没有错误的前提下,执行安装

sudo make install

完成安装后,你会发现在以下文件夹发现多出了一个叫cv2.so的文件。

cd usr/local/lib/python2.7/site-packages/

恭喜! 终于完成了opencv-python的安装!

剩下的工作是为我们的python虚拟环境创建一个cv2.so的链接,进入你的python虚拟环境的site-packages目录,例如我的环境叫opencv_2.7.13

$ cd ~/opencv_2.7.13/lib/python2.7/site-packages/

$ ln -s /usr/local/lib/python2.7/site-packages/cv2.so cv2.so

-测试是否成功

彩蛋:在jupyter 中使用cv2

没有找到很好的方法可以让视频在jupyter notebook中播放,关于这个的问题在 stackoverflow 找到。如果有好的方法欢迎告诉我。

以下python代码,演示在jupyter notebook通过利用cv2中扑抓一帧。

# Use OpenCV
from matplotlib.pyplot import *
import numpy as np
import cv2
capture = cv2.VideoCapture(0) # 使用第一个摄像头
capture.open(0) # 摄像头是否开启
# out: True
capture.isOpened() # 同上检测摄像头是否开启
# out: True
grabbed, frame = capture.read() # 扑抓一帧,grabbed 为bool,true说明扑抓到视频流,frame 为numpy矩阵
print('Frame grabbed: {0}'.format(grabbed))
# out: Frame grabbed: True
frame.shape #(height,width,channel)
# out: (720, 1280, 3)
frame_grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 调成黑白
imshow(frame_grey, cmap=cm.gray) # 用matplotlib.pyplot的imshow

参考链接

macOS: Install OpenCV 3 and Python 2.7

penCV-Python Tutorials