用深度学习做图像处理的过程中,我们常常需要用到opencv库,OpenCV是计算机视觉领域应用最广泛的开源工具包,基于C/C++,支持Linux/Windows/MacOS/Android/iOS,并提供了Python,Matlab和Java等语言的接口,因为其丰富的接口,优秀的性能和商业友好的使用许可,不管是学术界还是业界中都非常受欢迎。本文将介绍Python下使用OpenCV的一些基础案例。
和Python一样,当前的OpenCV也有两个大版本,OpenCV2和OpenCV3。相比OpenCV2,OpenCV3提供了更强的功能和更多方便的特性。不过考虑到和深度学习框架的兼容性,以及上手安装的难度,这部分先以2为主进行介绍。
根据功能和需求的不同,OpenCV中的函数接口大体可以分为如下部分:
- core:核心模块,主要包含了OpenCV中最基本的结构(矩阵,点线和形状等),以及相关的基础运算/操作。
- imgproc:图像处理模块,包含和图像相关的基础功能(滤波,梯度,改变大小等),以及一些衍生的高级功能(图像分割,直方图,形态分析和边缘/直线提取等)。
- highgui:提供了用户界面和文件读取的基本函数,比如图像显示窗口的生成和控制,图像/视频文件的IO等。
如果不考虑视频应用,以上三个就是最核心和常用的模块了。针对视频和一些特别的视觉应用,OpenCV也提供了强劲的支持:
- video:用于视频分析的常用功能,比如光流法(Optical Flow)和目标跟踪等。
- calib3d:三维重建,立体视觉和相机标定等的相关功能。
- features2d:二维特征相关的功能,主要是一些不受专利保护的,商业友好的特征点检测和匹配等功能,比如ORB特征。
- object:目标检测模块,包含级联分类和Latent SVM
- ml:机器学习算法模块,包含一些视觉中最常用的传统机器学习算法。
- flann:最近邻算法库,Fast Library for Approximate Nearest Neighbors,用于在多维空间进行聚类和检索,经常和关键点匹配搭配使用。
- gpu:包含了一些gpu加速的接口,底层的加速是CUDA实现。
- photo:计算摄像学(Computational Photography)相关的接口,当然这只是个名字,其实只有图像修复和降噪而已。
- stitching:图像拼接模块,有了它可以自己生成全景照片。
- nonfree:受到专利保护的一些算法,其实就是SIFT和SURF。
- contrib:一些实验性质的算法,考虑在未来版本中加入的。
- legacy:字面是遗产,意思就是废弃的一些接口,保留是考虑到向下兼容。
- ocl:利用OpenCL并行加速的一些接口。
- superres:超分辨率模块,其实就是BTV-L1(Biliteral Total Variation – L1 regularization)算法
- viz:基础的3D渲染模块,其实底层就是著名的3D工具包VTK(Visualization Toolkit)。
从使用的角度来看,和OpenCV2相比,OpenCV3的主要变化是更多的功能和更细化的模块划分。
作为最流行的视觉包,在Linux中安装OpenCV是非常方便的,大多数Linux的发行版都支持包管理器的安装,比如在Ubuntu 16.04 LTS中,只需要在终端中输入:
>> sudo apt install libopencv-dev python-opencv
当然也可以通过官网下载源码编译安装,第一步先安装各种依赖:
>> sudo apt install build-essential
>> sudo apt install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
>> sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
然后找一个clone压缩包的文件夹,把源码拿下来:
>> git clone opencv/opencv
here you can get the source from https://opencv.org/releases.html
click Sources ,and download to your PC.
进入opencv下载的文件夹,解压
unzip opencv-3.1.0.zip
然后进入OpenCV文件夹:
>> mkdir release
>> cd release
>> cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..
准备完毕,直接make并安装:
>> make
>> sudo make install
这里汇总下我使用的完整命令:
首先安装所有依赖
sudo apt-get -qq install libopencv-dev build-essential checkinstall cmake pkg-config yasm libjpeg-dev libjasper-dev libavcodec-dev libavformat-dev libswscale-dev libdc1394-22-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev libv4l-dev python-dev python-numpy libtbb-dev libqt4-dev libgtk2.0-dev libfaac-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev x264 v4l-utils
接着
mkdir build && cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE -D WITH_TBB=ON -D WITH_OPENMP=ON -D BUILD_NEW_PYTHON_SUPPORT=ON -DBUILD_TESTS=OFF -D WITH_V4L=ON ..
make -j32
sudo make install
以上命令打包可以写成:
# install common dependencies: OpenCV
# adpated from OpenCV.sh
version="2.4.13"
echo "Building OpenCV" $version
[[ -d 3rd-party ]] || mkdir 3rd-party/
cd 3rd-party/
if [ ! -d "opencv-$version" ]; then
echo "Installing OpenCV Dependenices"
sudo apt-get -qq install libopencv-dev build-essential checkinstall cmake pkg-config yasm libjpeg-dev libjasper-dev libavcodec-dev libavformat-dev libswscale-dev libdc1394-22-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev libv4l-dev python-dev python-numpy libtbb-dev libqt4-dev libgtk2.0-dev libfaac-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev x264 v4l-utils
echo "Downloading OpenCV" $version
wget -O OpenCV-$version.zip https://github.com/Itseez/opencv/archive/$version.zip
echo "Extracting OpenCV" $version
unzip OpenCV-$version.zip
fi
echo "Building OpenCV" $version
cd opencv-$version
[[ -d build ]] || mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE -D WITH_TBB=ON -D WITH_V4L=ON ..
if make -j32 ; then
cp lib/cv2.so ../../../
echo "OpenCV" $version "built."
else
echo "Failed to build OpenCV. Please check the logs above."
exit 1
fi
cmake -D CMAKE_BUILD_TYPE=RELEASE -D OPENCV_EXTRA_MODULES_PATH=~/Downloads/opencv_contrib-3.4.1/modules -D INSTALL_C_EXAMPLES=OFF -D WITH_CUDA=ON -D WITH_CUBLAS=ON -D DCUDA_NVCC_FLAGS="-D_FORCE_INLINES" -D CUDA_ARCH_PTX="" -D CUDA_FAST_MATH=ON -D CUDA_ARCH_BIN="5.2" -D WITH_TBB=ON -D WITH_OPENMP=ON -D BUILD_NEW_PYTHON_SUPPORT=ON -DBUILD_TESTS=OFF -D WITH_V4L=ON ..
然后
剩下的指令一样。
make -j32
sudo make install
最后做好配置:
echo '/usr/local/lib' | sudo tee -a /etc/ld.so.conf.d/opencv.conf
sudo ldconfig
printf '#OpenCV\nPKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig\nexport PKG_CONFIG_PATH\n' >> ~/.bashrc
source ~/.bashrc
Windows下的安装也很简单,直接去OpenCV官网下载:
DOWNLOADS | OpenCV
执行exe安装后,会在<安装目录>/build/python/2.7下发现一个叫cv2.pyd的文件,把这个文件拷贝到
http://www.lfd.uci.edu/~gohlke/pythonlibs/#opencv
本书只讲Python下OpenCV基本使用,Python中导入OpenCV非常简单:
import cv2
就导入成功了。
pip3 install --upgrade --user opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple/