最开始偷懒,想着用最简单的方法安装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
网友评论
-- Could NOT find PythonLibs: Found unsuitable version "2.7.14", but required is exact version "2.7.10" (found /usr/local/Cellar/python/2.7.14/Frameworks/Python.framework/Versions/2.7/lib/python2.7/config/libpython2.7.dylib)
-- Could NOT find PythonInterp: Found unsuitable version "2.7.10", but required is at least "3.4" (found /Users/Jayson/.virtualenvs/cv2/bin/python)
-- Could NOT find PythonInterp: Found unsuitable version "2.7.10", but required is at least "3.2" (found /Users/Jayson/.virtualenvs/cv2/bin/python)
配置结果中,Libraries: No
请问有什么办法解决吗?