ubuntu 16.04 不用root权限安装 opencv 3.1.0

1、下载安装包:

 http://opencv.org/releases.html

选择3.1.0版本的source下载

2、安装

unzip opencv-3.1.0.zip

cd opencv-3.1.0

mkdir build

cd build

cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/home/xiongcx/files/opencv_install ..

make -j20  #可能遇到的问题见第三部分

make install

如果没有报错,此时opencv应该安装在了/home/xiongcx/files/opencv_install/lib/python2.7/site-packages/cv2.so,查看使用的是哪个python

>>> which python

/home/xiongcx/anaconda2/bin/python

将自己的python与opencv建立联系

cd /home/xiongcx/anaconda2/lib/python2.7/site-packages/

ln -s /home/xiongcx/files/opencv_install/lib/python2.7/site-packages/cv2.so cv2.so

3、验证

pkg-config --modversion opencv

或在python中import cv2,并查看cv2.__version__。此处应注意,如果opencv没有安装成功,但装了opencv-python的包的话,import cv2也不会报错,所以要注意看版本对不对。

4、遇到的问题

(1) make -j20时报错:

/home/xiongcx/files/opencv-3.1.0/modules/cudalegacy/src/graphcuts.cpp:120:54: error: ‘NppiGraphcutState’ has not been declared
     typedef NppStatus (*init_func_t)(NppiSize oSize, NppiGraphcutState** ppState, Npp8u* pDeviceMem);

解决:将/opencv-3.1.0/modules/cudalegacy/src/graphcuts.cpp中的

#if !defined (HAVE_CUDA) || defined (CUDA_DISABLER)

修改为

#if !defined (HAVE_CUDA) || defined (CUDA_DISABLER) || (CUDART_VERSION>=8000)

参考https://blog.csdn.net/yhaolpz/article/details/71375762

(2)在python中import cv2时出现

ImportError: No module named cv2

解决:由于安装过程中没有报错,所以认为问题不在于安装错了,而在于系统未准确找到opencv的lib文件,因此配置pkg-config。

mkdir /home/xiongcx/files/pkgconfig

cp /home/xiongcx/files/opencv_install/lib/pkgconfig/opencv.pc /home/xiongcx/files/pkgconfig/opencv3.1.0.pc

vi ~/.bashrc

#添加环境变量
export PKG_CONFIG_PATH="/home/xiongcx/files/pkgconfig:$PKG_CONFIG_PATH"

source ~/.bashrc

此时测试pkgconfig

pkg-config --libs opencv3.1.0

发现可以正常显示opencv的信息,再在python中import cv2时不再出现上面的错误,而是错误3

参考https://www.cnblogs.com/wycBlog/p/7217498.html

(3)在python中import cv2时出现

>>> import cv2
Traceback (most recent call last):
  File "", line 1, in 
ImportError: /home/xiongcx/anaconda2/bin/../lib/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by ./cv2.so)

解决:

先查看libstdc++.so.6是什么

>>> cd /home/xiongcx/anaconda2/bin/../lib/

>>> ls -l | grep libstdc++.so.6

lrwxrwxrwx  1 xiongcx xiongcx       19 10月 15 21:36 libstdc++.so -> libstdc++.so.6.0.19
-rwxrwxr-x  1 xiongcx xiongcx  1055192 10月 30 14:57 libstdc++.so.6
-rwxrwxrwx  2 xiongcx xiongcx  1055192 9月  19  2015 libstdc++.so.6.0.19
-rw-r--r--  1 xiongcx xiongcx  1566440 10月 30 14:49 libstdc++.so.6.0.21

然后

>>> strings libstdc++.so.6 | grep GLIBCXX

GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH

发现这里面没有GLIBCXX_3.4.21

通过locate指令查找系统中是否存在其他libstdc++.so.6

>>> locate libstdc++.so.6

/usr/lib/x86_64-linux-gnu/libstdc++.so.6
/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21

再查看这里的libstdc++.so.6是否符合要求

>>> strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21 | grep GLIBCXX

GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_3.4.20
GLIBCXX_3.4.21
GLIBCXX_DEBUG_MESSAGE_LENGTH

可以看到是符合要求的,因此将这个libstdc++.so.6.0.21复制到/home/xiongcx/anaconda2/bin/../lib/中,然后删除原来的软链接libstdc++.so.6,再建立新的指向libstdc++.so.6.0.21的软链接

cp /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21 ~/anaconda2/lib

rm libstdc++.so.6

ln -s libstdc++.so.6.0.21 libstdc++.so.6

再在python中import cv2时不再出现上面的错误,而是错误(4)

(4)报错如下:

>>> import cv2
Traceback (most recent call last):
  File "", line 1, in 
ImportError: libgomp.so.1: version `GOMP_4.0' not found (required by /usr/lib/x86_64-linux-gnu/libsoxr.so.0)

解决:这个报错与(3)有些相似,猜测也是anaconda2中部分链接需要更新的原因。先在anaconda2/lib中

>>> strings libgomp.so.1 | grep "GOMP"

GOMP_barrier
GOMP_critical_start
GOMP_critical_end
GOMP_critical_name_start
GOMP_critical_name_end
GOMP_atomic_start
GOMP_atomic_end
GOMP_loop_static_start
GOMP_loop_dynamic_start
GOMP_loop_guided_start
GOMP_loop_runtime_start
GOMP_loop_ordered_static_start
GOMP_loop_ordered_dynamic_start
GOMP_loop_ordered_guided_start
GOMP_loop_ordered_runtime_start
GOMP_loop_static_next
GOMP_loop_dynamic_next
GOMP_loop_guided_next
GOMP_loop_runtime_next
GOMP_loop_ordered_static_next
GOMP_loop_ordered_dynamic_next
GOMP_loop_ordered_guided_next
GOMP_loop_ordered_runtime_next
GOMP_parallel_loop_static_start
GOMP_parallel_loop_dynamic_start
GOMP_parallel_loop_guided_start
GOMP_parallel_loop_runtime_start
GOMP_loop_end
GOMP_loop_end_nowait
GOMP_loop_ull_static_start
GOMP_loop_ull_dynamic_start
GOMP_loop_ull_guided_start
GOMP_loop_ull_runtime_start
GOMP_loop_ull_ordered_static_start
GOMP_loop_ull_ordered_dynamic_start
GOMP_loop_ull_ordered_guided_start
GOMP_loop_ull_ordered_runtime_start
GOMP_loop_ull_static_next
GOMP_loop_ull_dynamic_next
GOMP_loop_ull_guided_next
GOMP_loop_ull_runtime_next
GOMP_loop_ull_ordered_static_next
GOMP_loop_ull_ordered_dynamic_next
GOMP_loop_ull_ordered_guided_next
GOMP_loop_ull_ordered_runtime_next
GOMP_ordered_start
GOMP_ordered_end
GOMP_parallel_start
GOMP_parallel_end
GOMP_sections_start
GOMP_sections_next
GOMP_parallel_sections_start
GOMP_sections_end
GOMP_sections_end_nowait
GOMP_single_start
GOMP_single_copy_start
GOMP_single_copy_end
GOMP_task
GOMP_taskwait
GOMP_taskyield
GOMP_1.0
GOMP_2.0
GOMP_3.0
GOMP_CPU_AFFINITY
GOMP_SPINCOUNT
GOMP_STACKSIZE
not enough memory to store GOMP_CPU_AFFINITY list
Invalid value for enviroment variable GOMP_CPU_AFFINITY

发现的确没有GOMP_4.0,在系统中查找libgomp.so.1发现了/usr/lib/x86_64-linux-gnu/libgomp.so.1,于是

>>> strings /usr/lib/x86_64-linux-gnu/libgomp.so.1 | grep "GOMP"

GOMP_barrier
GOMP_barrier_cancel
GOMP_critical_start
GOMP_critical_end
GOMP_critical_name_start
GOMP_critical_name_end
GOMP_atomic_start
GOMP_atomic_end
GOMP_loop_static_start
GOMP_loop_dynamic_start
GOMP_loop_guided_start
GOMP_loop_runtime_start
GOMP_loop_ordered_static_start
GOMP_loop_ordered_dynamic_start
GOMP_loop_ordered_guided_start
GOMP_loop_ordered_runtime_start
GOMP_loop_static_next
GOMP_loop_dynamic_next
GOMP_loop_guided_next
GOMP_loop_runtime_next
GOMP_loop_ordered_static_next
GOMP_loop_ordered_dynamic_next
GOMP_loop_ordered_guided_next
GOMP_loop_ordered_runtime_next
GOMP_parallel_loop_static_start
GOMP_parallel_loop_dynamic_start
GOMP_parallel_loop_guided_start
GOMP_parallel_loop_runtime_start
GOMP_parallel_loop_static
GOMP_parallel_loop_dynamic
GOMP_parallel_loop_guided
GOMP_parallel_loop_runtime
GOMP_loop_end
GOMP_loop_end_cancel
GOMP_loop_end_nowait
GOMP_loop_ull_static_start
GOMP_loop_ull_dynamic_start
GOMP_loop_ull_guided_start
GOMP_loop_ull_runtime_start
GOMP_loop_ull_ordered_static_start
GOMP_loop_ull_ordered_dynamic_start
GOMP_loop_ull_ordered_guided_start
GOMP_loop_ull_ordered_runtime_start
GOMP_loop_ull_static_next
GOMP_loop_ull_dynamic_next
GOMP_loop_ull_guided_next
GOMP_loop_ull_runtime_next
GOMP_loop_ull_ordered_static_next
GOMP_loop_ull_ordered_dynamic_next
GOMP_loop_ull_ordered_guided_next
GOMP_loop_ull_ordered_runtime_next
GOMP_ordered_start
GOMP_ordered_end
GOMP_parallel_start
GOMP_parallel_end
GOMP_parallel
GOMP_cancellation_point
GOMP_cancel
GOMP_sections_start
GOMP_sections_next
GOMP_parallel_sections_start
GOMP_parallel_sections
GOMP_sections_end
GOMP_sections_end_cancel
GOMP_sections_end_nowait
GOMP_single_start
GOMP_single_copy_start
GOMP_single_copy_end
GOMP_task
GOMP_taskwait
GOMP_taskyield
GOMP_taskgroup_start
GOMP_taskgroup_end
GOMP_offload_register
GOMP_offload_unregister
GOMP_target
GOMP_target_data
GOMP_target_end_data
GOMP_target_update
GOMP_teams
GOMP_PLUGIN_malloc
GOMP_PLUGIN_malloc_cleared
GOMP_PLUGIN_realloc
GOMP_PLUGIN_debug
GOMP_PLUGIN_error
GOMP_PLUGIN_fatal
GOMP_PLUGIN_async_unmap_vars
GOMP_PLUGIN_acc_thread
GOMP_1.0
GOMP_2.0
GOMP_3.0
GOMP_4.0
GOMP_4.0.1
GOMP_PLUGIN_1.0
GOMP_DEBUG
GOMP_CPU_AFFINITY
GOMP_SPINCOUNT
GOMP_STACKSIZE
  GOMP_CPU_AFFINITY = ''
  GOMP_STACKSIZE = '%lu'
  GOMP_SPINCOUNT = '%lu'
Invalid value for enviroment variable GOMP_CPU_AFFINITY
GOMP_OFFLOAD_get_name
GOMP_OFFLOAD_get_caps
GOMP_OFFLOAD_get_type
GOMP_OFFLOAD_get_num_devices
GOMP_OFFLOAD_init_device
GOMP_OFFLOAD_fini_device
GOMP_OFFLOAD_load_image
GOMP_OFFLOAD_unload_image
GOMP_OFFLOAD_alloc
GOMP_OFFLOAD_free
GOMP_OFFLOAD_dev2host
GOMP_OFFLOAD_host2dev
GOMP_OFFLOAD_run
GOMP_OFFLOAD_openacc_parallel
GOMP_OFFLOAD_openacc_register_async_cleanup
GOMP_OFFLOAD_openacc_async_test
GOMP_OFFLOAD_openacc_async_test_all
GOMP_OFFLOAD_openacc_async_wait
GOMP_OFFLOAD_openacc_async_wait_async
GOMP_OFFLOAD_openacc_async_wait_all
GOMP_OFFLOAD_openacc_async_wait_all_async
GOMP_OFFLOAD_openacc_async_set_async
GOMP_OFFLOAD_openacc_create_thread_data
GOMP_OFFLOAD_openacc_destroy_thread_data
GOMP_OFFLOAD_openacc_get_current_cuda_device
GOMP_OFFLOAD_openacc_get_current_cuda_context
GOMP_OFFLOAD_openacc_get_cuda_stream
GOMP_OFFLOAD_openacc_set_cuda_stream

存在GOMP_4.0,符合要求,于是删除anaconda2/lib中原有的libgomp.so.1,将/usr/lib/x86_64-linux-gnu/libgomp.so.1复制过来。然后成功了。

>>> import cv2
>>> cv2.__version__
'3.1.0'

参考http://www.voidcn.com/article/p-qlcwabfp-bnv.html

 

 

 

 

 

 

 

你可能感兴趣的:(环境配置)