Ubuntu16.04 python2 安装 OpenCV2.4.13.6

事先装有 OpenCV 需要重新安装的,先执行卸载步骤,再安装。

卸载步骤

1.找到当初安装 OpenCV 的 release 或 build 目录,执行以下命令

1
2
3
4
sudo make uninstall
cd ..
sudo rm -r build
sudo rm -r /usr/local/include/opencv2 /usr/local/include/opencv /usr/include/opencv /usr/include/opencv2 /usr/local/share/opencv /usr/local/share/OpenCV /usr/share/opencv /usr/share/OpenCV /usr/local/bin/opencv* /usr/local/lib/libopencv*

2.删除 usr 文件夹中所有 opencv 相关项

1
2
cd /usr/
find . -name "*opencv*" | xargs sudo rm -rf

3.移除 Python 相关

1
apt-get remove opencv-doc opencv-data python-opencv

安装步骤

1.通过命令安装各种软件包

1
2
3
$ sudo apt-get install build-essential
$ sudo apt-get 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

2.进到安装路径下拷贝 OpenCV 源码

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

3.选择安装的 OpenCV 版本号

1
2
$ cd opencv
$ git checkout -b 2.4 origin/2.4

4.使用 Cmake 编译 OpenCV 源码

1
2
3
$ mkdir release
$ cd release
$ cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..

5.make 安装 OpenCV

1
2
$ make -j4
$ sudo make install

安装到此结束。

测试

命令进入 Python 编辑器

1
2
>>> import cv2
>>> print(cv2.__version__)

会输出 OpenCV 的版本号。

cuda 9.0 与 opencv 版本匹配问题:

Cmake 过程中会出现以下问题:

错误
1
2
3
CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
CUDA_nppi_LIBRARY (ADVANCED)
原因

在cuda9里面,NVIDIA把 libnppi.so换成libnppc.so libnppial.so libnppicc.so libnppicom.so libnppidei.so libnppif.so libnppig.so libnppim.so libnppist.so libnppisu.so libnppitc.so libnpps.so

解决方案

修改opencv/cmake/FindCUDA.cmake 文件,将其中的

1
unset(CUDA_nppi_LIBRARY CACHE)

替换为:

1
2
3
4
5
6
7
8
9
10
unset(CUDA_nppial_LIBRARY CACHE)
unset(CUDA_nppicc_LIBRARY CACHE)
unset(CUDA_nppicom_LIBRARY CACHE)
unset(CUDA_nppidei_LIBRARY CACHE)
unset(CUDA_nppif_LIBRARY CACHE)
unset(CUDA_nppig_LIBRARY CACHE)
unset(CUDA_nppim_LIBRARY CACHE)
unset(CUDA_nppist_LIBRARY CACHE)
unset(CUDA_nppisu_LIBRARY CACHE)
unset(CUDA_nppitc_LIBRARY CACHE)


1
2
find_cuda_helper_libs(nppi)
set(CUDA_npp_LIBRARY"${CUDA_nppc_LIBRARY};${CUDA_nppi_LIBRARY};${CUDA_npps_LIBRARY}")

替换为

1
2
3
4
5
6
7
8
9
10
11
find_cuda_helper_libs(nppial)
find_cuda_helper_libs(nppicc)
find_cuda_helper_libs(nppicom)
find_cuda_helper_libs(nppidei)
find_cuda_helper_libs(nppif)
find_cuda_helper_libs(nppig)
find_cuda_helper_libs(nppim)
find_cuda_helper_libs(nppist)
find_cuda_helper_libs(nppisu)
find_cuda_helper_libs(nppitc)
set(CUDA_npp_LIBRARY "${CUDA_nppc_LIBRARY};${CUDA_nppial_LIBRARY};${CUDA_nppicc_LIBRARY};${CUDA_nppicom_LIBRARY};${CUDA_nppidei_LIBRARY};${CUDA_nppif_LIBRARY};${CUDA_nppig_LIBRARY};${CUDA_nppim_LIBRARY};${CUDA_nppist_LIBRARY};${CUDA_nppisu_LIBRARY};${CUDA_nppitc_LIBRARY};${CUDA_npps_LIBRARY}")

错误
1
opencv nvcc fatal   : Unsupported gpu architecture 'compute_20'
原因

cuda9不支持‘ compute-20 ’

解决方案:

更改 OpenCVDetectCUDA.cmake 文件,把有关 ‘ compute-20 ’ 的全删掉

1
2
3
4
5
6
7
if(CUDA_GENERATION STREQUAL "Fermi")
set(__cuda_arch_bin "3.0 3.5")
elseif(CUDA_GENERATION STREQUAL "Kepler")
if(${CUDA_VERSION} VERSION_LESS "5.0")
set(__cuda_arch_bin "2.0 2.1")
else()
set(__cuda_arch_bin "3.0 3.5")

替换为

1
2
3
4
5
6
7
if(CUDA_GENERATION STREQUAL "Fermi")
set(__cuda_arch_bin "3.0 3.5")
elseif(CUDA_GENERATION STREQUAL "Kepler")
if(${CUDA_VERSION} VERSION_LESS "5.0")
set(__cuda_arch_bin "3.0")
else()
set(__cuda_arch_bin "3.0 3.5")

将:

1
2
3
4
if(${CUDA_VERSION} VERSION_LESS "5.0")
set(__cuda_arch_bin "1.1 1.2 1.3 2.0 2.1(2.0) 3.0")
elseif(${CUDA_VERSION} VERSION_GREATER "6.5")
set(__cuda_arch_bin "2.0 2.1(2.0) 3.0 3.5")

替换为:

1
2
3
4
if(${CUDA_VERSION} VERSION_LESS "5.0")
set(__cuda_arch_bin "1.1 1.2 1.3 2.0 2.1(2.0) 3.0")
elseif(${CUDA_VERSION} VERSION_GREATER "6.5")
set(__cuda_arch_bin "3.0 3.5")

然后 cmake 成功。

参考

https://docs.opencv.org/2.4/doc/tutorials/introduction/linux_install/linux_install.html

https://stackoverflow.com/questions/46584000/cmake-error-variables-are-set-to-notfound