我试图在我的机器上安装带有Python3的OpenCV 3.1.0。因为我有Ubuntu 16.04,所以我完全遵循本指南:
http://www.pyimagesearch.com/2016/10/24/ubuntu-16-04-how-to-install-opencv/
但是,在运行cmake之后,我在第4步遇到了麻烦。我的cmake程序的输出有这个片段:
-- OpenCL:
-- Version: dynamic
-- Include path: /home/kevin/opencv-3.1.0/3rdparty/include/opencl/1.2
-- Use AMDFFT: NO
-- Use AMDBLAS: NO
--
-- Python 2:
-- Interpreter: /home/kevin/.virtualenvs/cv/bin/python (ver 3.5.2)
--
-- Python 3:
-- Interpreter: /home/kevin/.virtualenvs/cv/bin/python3 (ver 3.5.2)
--
-- Python (for build): /home/kevin/.virtualenvs/cv/bin/python
--
-- Java:
-- ant: NO
-- JNI: /usr/lib/jvm/java-8-oracle/include /usr/lib/jvm/java-8-oracle/include/linux /usr/lib/jvm/java-8-oracle/include
-- Java wrappers: NO
-- Java tests: NO
cmake文件似乎没有正确链接python部分(libraries,numpy,packages_path)下缺少的属性。我尝试编译opencv并安装它,当我加载python3并导入cv时,它说它无法找到cv包。
我尝试修改CMAKE命令,因此我没有使用指南建议的内容,而是添加了三个参数来强制cmake包含缺少的python属性(最后三个属性是我的修改):
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D INSTALL_C_EXAMPLES=OFF \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.1.0/modules \
-D PYTHON_EXECUTABLE=~/.virtualenvs/cv/bin/python \
-D BUILD_EXAMPLES=ON \
-D PYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython3.5m.so \
-D PYTHON_NUMPY_INCLUDE_DIR=~/.virtualenvs/cv/lib/python3.5/site-packages/numpy/core/include \
-D PYTHON_PACKAGES_PATH=~/.virtualenvs/cv/lib/python3.5/site-packes ..
但是,cmake的输出是相同的(它只列出解释器,没有其他python属性),当我尝试构建opencv并安装它时,我的python解释器找不到opencv包。
我完成安装opencv之后,我的/usr/local/lib/python3.5/文件没有site-packages目录。
有人能指出我正确的方向吗?我一直试图在过去的几个小时内搜索如何解决这个问题,但到目前为止找不到办法,所以我非常感谢任何指导。谢谢!
更新
我意识到我必须在cmake命令中添加-D BUILD_opencv_python3 = yes,以便opencv查找python库。但是,这是我从cmake获得的新输出:
-- Python 3:
-- Interpreter: /home/kevin/.virtualenvs/cv/bin/python (ver 3.5.2)
-- Libraries: NO
-- numpy: NO (Python3 wrappers can not be generated)
-- packages path: lib/python3.5/site-packages
知道为什么cmake没有正确找到我的python 3库(即使我添加" -D PYTHON_LIBRARY = / usr / lib / x86_64-linux-gnu / libpython3.5m.so" cmake选项)?
更新
我通过删除整个/ build目录并在新目录上运行cmake来解决问题。我认为错误继续出现是因为cmake进行了一些缓存,但添加标志-D BUILD_opencv_python3 = yes似乎对我有用。
答案 0 :(得分:17)
我通过删除整个/ build目录并再次运行cmake来修复我的问题(使用-D BUILD_opencv_python3 = yes)。我认为它因cmake的某种缓存而出错,因此当我删除所有内容并重新开始时,错误就消失了。
答案 1 :(得分:2)
以上解决方案对我不起作用,我必须指定一堆选项以使cmake识别python3。这可以解决问题:
private function get_course($course) {
global $DB;
/***************** CUSTOM *****************/
//print_object($course);
$enrolledusercourses = enrol_get_users_courses($this->user->id);
// print_object($enrolledusercourses);
$cour = array();
foreach($enrolledusercourses as $key =>$value){
$course = $enrolledusercourses[$key]->id;
/***************** CUSTOM *****************/
if ($course) {
// If $course is an integer, it is a course id, get the object from database.
if (is_int($course) || is_string($course)) {
if (!$course = $DB->get_record('course', array('id' => $course), '*', MUST_EXIST)) {
print_error('Course ID was incorrect');
}
}
}
echo "Course List";
print_object($course);
}
echo "course Receiving";
print_object($course);
return $course;
}
答案 2 :(得分:1)
我相信,问题是由cmake-gui的内部错误引起的; OPENCV_PYTHON_VERSION变量被视为布尔值,而cmake脚本将变量视为您首选的python版本的占位符。因此,删除变量并手动将其重新添加为具有首选python版本初始值的字符串数据类型。例如3.7。 一旦按下Generate,cmake将接受带有已填充库的python模块并包含变量。但是,如果需要再次按“生成”,则可以在不修改OPENCV_PYTHON_VERSION变量的情况下自由进行操作,因为cmake gui会再次将其返回为布尔值,同时您插入的首选值将在内部维护和缓存。
答案 3 :(得分:1)
您可以启用cmake输出或CmakeVars来检查python2或python3是否不可用(查找它)
如果是这种情况,除非再次从构建文件夹中清除CMakeCache.txt和.cmake文件,否则再次运行cmake不会成功。 您可能会留下其余部分以免再次编译所有内容
当我在docker内部使用时,我禁用了其他一些功能,但是如果您愿意,可以使用此功能 但可以根据需要调整变量
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_CUDA=ON -D WITH_OPENCL=ON -D ENABLE_FAST_MATH=1 -D CUDA_FAST_MATH=1 -D WITH_CUBLAS=1 -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.1.2/modules -D WITH_LIBV4L=OFF -D WITH_V4L=OFF -D INSTALL_C_EXAMPLES=OFF -D WITH_DC1394=OFF -D ENABLE_NEON=OFF -D OPENCV_ENABLE_NONFREE=ON -D WITH_PROTOBUF=OFF -D INSTALL_PYTHON_EXAMPLES=ON -D BUILD_OPENCV_PYTHON3=yes -D PYTHON3_EXECUTABLE=$(which python3) -D PYTHON_INCLUDE_DIR=$(python3 -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())") -D PYTHON_INCLUDE_DIR2=$(python3 -c "from os.path import dirname; from distutils.sysconfig import get_config_h_filename; print(dirname(get_config_h_filename()))") -D PYTHON_LIBRARY=$(python3 -c "from distutils.sysconfig import get_config_var;from os.path import dirname,join ; print(join(dirname(get_config_var('LIBPC')),get_config_var('LDLIBRARY')))") -D PYTHON3_NUMPY_INCLUDE_DIRS=$(python3 -c "import numpy; print(numpy.get_include())") -D PYTHON3_PACKAGES_PATH=$(python3 -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") ..
答案 4 :(得分:1)
如果您使用的是 ARM64,这可能是问题所在:https://github.com/numpy/numpy/issues/18131
设置 OPENBLAS_CORETYPE=ARMV8 解决 cmake 不选择 python3