本文共 5674 字,大约阅读时间需要 18 分钟。
比如ubuntu下是apt-get,mac下是brew。(windows下或许用nuget?)以ubuntu下为例。
aptitude search opencv
发现有很多包。不妨安装绝大多数:
sudo apt-get install libopencv-*sudo apt-get install opencv-data python-opencv
opencv有些功能放在opencv_contrib
中了,即便用包管理器安装了opencv_contrib
,有些包还是不能用,一定要自行把opencv
和opencv_contrib
一起编译。
依然以ubuntu16.04为例。
到下载。或者用git:
mkdir -p ~/gitwhat #自行建立的目录cd ~/gitwhatgit clone https://github.com/opencv/opencv --depth=1 #depth表示只下载最新commit的代码,减少下载量。git clone https://github.com/opencv/opencv_contrib --depth=1cd opencvvim compile.sh #cmake编译参数很多,写到文件中方便些
compile.sh内容如下:
#!/bin/bashset -xset -erm -rf buildmkdir -p buildcd buildLOG="../cmake.log"rm $LOGexec &> >(tee -a "$LOG")cmake \-D CMAKE_BUILD_TYPE=Release \-D CMAKE_INSTALL_PREFIX=/usr/local/opencv-git-master \-D WITH_CUDA=OFF \-D WITH_VTK=OFF \-D WITH_MATLAB=OFF \-D BUILD_DOCS=ON \-D OPENCV_EXTRA_MODULES_PATH=/home/chris/work/gitwhat/opencv_contrib/modules \-D PYTHON2_EXECUTABLE=/usr/bin/python \-D PYTHON3_EXECUTABLE=/usr/bin/python3 \-D PYTHON_INCLUDE_DIR=/usr/include/python2.7 \-D PYTHON_INCLUDE_DIR2=/usr/include/x86_64-linux-gnu/python2.7 \-D PYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython2.7.so \-D PYTHON2_NUMPY_INCLUDE_DIRS=/usr/lib/python2.7/dist-packages/numpy/core/include/ \-D PYTHON3_NUMPY_INCLUDE_DIRS=/usr/lib/python3.5/dist-packages/numpy/core/include/ \..make -j8make doxygen # 可选,用来编译出documentation,存放在`/build/doc/doxygen/html`sudo make install #可选,强烈建议执行。
其中,CMAKE_INSTALL_PREFIX
表示make install的安装路径,可修改;OPENCV_EXTRA_MODULES_PATH
是opencv_contrib
项目下的modules
目录,自行修改。
make install
是把opencv和opencv_contrib
进行安装到一个统一的目录,如果后续用opencv的C++接口那么当写CMakeLists.txt时需要这个安装路径;如果仅仅是python opencv调用 ,那么只需要找到cv2.so就可以用了,可以不make install
执行编译脚本:
chmod +x compile.sh./compile.sh
发现往往卡在ippicv等第三方包的下载上(国内网络你懂得)。通过查看相关的.cmake
文件,发现是从github上的下载的,这些下载地址有些需要改掉,下载第三方包后根据.cmake
文件内容,重新压缩、修改md5的hash值等。
这些下载的包放到<opencv_root>/.cache
目录下,并按照固定的规则命名。
以下是细节:
查看/3rdparty/ippicv/ippicv.cmake
此文件是要下载指定commit的opencv_3rdparty包的URL地址,并给出了验证的md5sum值。URL地址是有问题的,现在(2017.04.15)不能用raw.githutcontent.com开头形式的URL下载东西了。
换用这个地址:
https://codeload.github.com/opencv/opencv_3rdparty/zip/81a676001ca8075ada498583e4166079e5744668
其中url最后一部分是commit的id
这样下载完的是zip包,解压它并压缩为.tgz格式。算出它的md5sum值。重命名为md5sum-文件名的格式:
1469ff5ced054be500921d2d46278ef4-ippicv_linux_20151201.tgz
移动到/.cache/ippicv目录下
查看opencv_contrib/modules/dnn/cmake/OpenCVFindLibProtobuf.cmake
此文件是要下载指定版本的protobuf-cpp。我这里是3.1版本的。它下载地址是: 这个地址会转到aws的地址,所以用迅雷下载吧。这个md5sum不用换。或者下载地址换用这种形式:
https://codeload.github.com/google/protobuf/zip/a428e42072765993ff674fda72863c9f1aa2d268
其中URL最后的commit是protobuf-cpp-3.1对应的commit号。可以试试看。(试了,不行,因该是因为下载的不是protobuf-cpp吧)
和上面的包的方法类似。只不过放到.cache目录下后,是把一个个的单个文件进行重命名,格式也是md5sum-文件名,记得对比.cmake文件中的hash值。
.cache git:(master) tree.├── ippicv│ └── 1469ff5ced054be500921d2d46278ef4-ippicv_linux_20151201.tgz├── protobuf│ └── bd5e3eed635a8d32e2b99658633815ef-protobuf-cpp-3.1.0.tar.gz├── tiny_dnn│ └── adb1c512e09ca2c7a6faef36f9c53e59-v1.0.0a3.tar.gz└── xfeatures2d ├── boostdesc │ ├── 0ae0675534aa318d9668f2a179c2a052-boostdesc_lbgm.i │ ├── 0ea90e7a8f3f7876d450e4149c97c74f-boostdesc_bgm.i │ ├── 202e1b3e9fec871b04da31f7f016679f-boostdesc_binboost_064.i │ ├── 232c966b13651bd0e46a1497b0852191-boostdesc_bgm_bi.i │ ├── 324426a24fa56ad9c5b8e3e0b3e5303e-boostdesc_bgm_hd.i │ ├── 98ea99d399965c03d555cef3ea502a0b-boostdesc_binboost_128.i │ └── e6dcfa9f647779eb1ce446a8d759b6ea-boostdesc_binboost_256.i └── vgg ├── 151805e03568c9f490a5e3a872777b75-vgg_generated_120.i ├── 7126a5d9a8884ebca5aea5d63d677225-vgg_generated_64.i ├── 7cd47228edec52b6d82f46511af325c5-vgg_generated_80.i └── e8d0dcd54d1bcfdc29203d011a797179-vgg_generated_48.i6 directories, 14 files
新编译出来的cv2.so位于/usr/local/opencv-git-master/lib/cv2.so
要使用新编译出来的cv2.so,删除apt的python-opencv包,或者把cv2.so放到PYTHONPATH中。
sudo apt-get remove python-opencvsudo ln -sf /usr/local/opencv-git-master/lib/python2.7/dist-packages/cv2.so /usr/lib/python2.7
mac下装caffe时候发现,系统自带的python不靠谱用不了啊,brew的也不怎么能用,所幸有anaconda在。装好anaconda后再brew从源码装boost和boost-python,再caffe。。
对应的opencv编译脚本,改掉python相关的几个路径:
#!/bin/bashset -xset -eLOG="../cmake.log"touch $LOGrm $LOGexec &> >(tee -a "$LOG")BUILD_ROOT=buildif [ -d $BUILD_ROOT ]; then rm -rf $BUILD_ROOTfimkdir -p $BUILD_ROOTcd $BUILD_ROOTANACONDA=/Users/tusdk/anacondacmake \ -D CMAKE_BUILD_TYPE=Release \ -D CMAKE_INSTALL_PREFIX=/usr/local/opencv-git-master \ -D WITH_CUDA=OFF \ -D WITH_VTK=OFF \ -D WITH_MATLAB=OFF \ -D BUILD_DOCS=ON \ -D OPENCV_EXTRA_MODULES_PATH=/Users/tusdk/work/opencv_contrib/modules \ -D PYTHON2_EXECUTABLE=${ANACONDA}/bin/python \ -D PYTHON_INCLUDE_DIR=${ANACONDA}/include/python2.7 \ -D PYTHON_LIBRARY=${ANACONDA}/lib/libpython2.7.dylib \ -D PYTHON2_NUMPY_INCLUDE_DIRS=${ANACONDA}/lib/python2.7/site-packages/numpy/core/include/ \ ..make -j8make doxygen # 可选,用来编译出documentation,存放在`/build/doc/doxygen/html`sudo make install
编译opencv_contrib
时候发现没有编译出opencv_world.so
需要cmake开启开关:
···
-D BUILD_opencv_world=ON ···缺点:只生成一个opencv_world.so
,其他的.so都没有!
opencv_contrib
时报错Unknown CMake command ‘ocv_download’
问题出现原因:opencv_contrib
里面用到的ocv_download
函数没有找到对应的定义。很可能是:你的opencv是下载的.zip/.rar压缩包并且版本比较老(比如opencv-2.4.13.zip),而老版本的opencv中没有定义ocv_download
函数。
因为opencv_contrib
模块只提供了opencv3的支持,只能放弃opencv2版本,或者手动去修改各种头文件和函数接口(暂时不考虑
建议搜索cmake目录下所有文件中的"file(REMOVE",注释掉对应的行。出现本状况的原因是opencv的cmake代码中,执行完下载和解压后就执行删除,好不容易下载好的东西就删除。。不理解这种做法。。
转载地址:http://gjnbx.baihongyu.com/