Ubuntu 16.04 操作系统上 OpenCV 3.3 的安装
文件准备
- opencv-3.3.1.zip
- opencv_contrib-3.3.1.zip
准备
如果遇到OpenCV无法打开视频或RTSP流的情况,请参考https://stackoverflow.com/questions/41200201/opencv-unable-to-stop-the-stream-inappropriate-ioctl-for-device
安装以下依赖项:
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
sudo apt-get install build-essential qt5-default ccache libv4l-dev libavresample-dev libgphoto2-dev libopenblas-base libopenblas-dev doxygen openjdk-8-jdk pylint libvtk6-dev
sudo apt-get install pkg-config
编译
1. 解压zip文件
sudo unzip opencv-3.3.1.zip
sudo unzip opencv_contrib-3.3.1.zip
2. 解压完后需要将opencv_contrib.zip提取到opencv目录下,同时在该目录下新建一个文件夹build:
sudo cp -r opencv_contrib-3.3.1 opencv-3.3.1 #复制opencv_contrib到opencv目录下 cd opencv-3.3.1
sudo mkdir build #新建文件夹build
3. 现在进入到opencv-3.3.1目录下,查看文件结构:
ls
3rdparty cmake data LICENSE platforms
apps CMakeLists.txt doc modules README.md
build CONTRIBUTING.md include opencv_contrib-3.3.1 samples
4. 进入build目录,并且执行cmake生成makefile文件:
cd build
sudo cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=/home/files/opencv-3.3.1/opencv_contrib-3.3.1/modules/ ..
如果安装的是CUDA 10及以上,需要如下操作,将-D BUILD_opencv_cudacodec=OFF:
sudo cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_opencv_cudacodec=OFF -D OPENCV_EXTRA_MODULES_PATH=/home/files/OpenCV3/opencv_contrib-3.3.1/modules/ ..
注意:OPENCV_EXTRA_MODULES_PATH 就是你 opencv_contrib-3.3.1下面的modules目录,请按照自己的实际目录修改地址。还有后面的两点不可省略!!
接下来就是漫长的等待了…
生成完毕提示:
-- Install path: /usr/local
--
-- cvconfig.h is in: /home/files/opencv-3.3.1/build
-- -----------------------------------------------------------------
--
-- Configuring done
-- Generating done
-- Build files have been written to: /home/files/opencv-3.3.1/build
5.在cmake成功之后,就可以在build文件下make了:
sudo make -j8 #8线程编译
sudo make install
接下来就是更漫长的等待了…具体时间因人而异,我的电脑跑了20分钟。如果看到下图,说明成功了,再make install就ok了!
6.链接库共享
编译安装完毕之后,为了让你的链接库被系统共享,让编译器发现,需要执行管理命令ldconfig:
sudo ldconfig -v
测试
如果以上步骤没有报错,OpenCV3.3应该就安装成功了,但是为了确认一下,我们可以写一个简单的程序来测试一下。
- 在 OpenCV3.3.1的目录下,创建一个新的文件夹,然后进去:
mkdir DisplayImage
cd DisplayImage
- 在这个文件夹里新建两个文件CMakeLists.txt和DisplayImage.cpp,以及一个文件夹build:
mkdir build
vim DisplayImage.cpp
- 在DisplayImage.cpp中输入以下代码:
#include <stdio.h>
#include <opencv2/opencv.hpp>
//using namespace std;
using namespace cv;
int main(){
Mat image;
image = imread("./test.jpg", CV_LOAD_IMAGE_UNCHANGED);
if(!image.data){
printf("No image data! \n");
return -1;
}else{
printf("Image Displayed! \n");
}
namedWindow("Display Image", CV_WINDOW_AUTOSIZE);
imshow("Display Image", image);
cv::waitKey(0);
getchar();
return 0;
}
- 然后保存退出,再创建CMakeLists.txt
vim CMakeLists.txt
- 在 CMakeLists.txt 里面输入以下内容:
cmake_minimum_required(VERSION 2.8)
project(DisplayImage)
find_package(OpenCV REQUIRED)
add_executable(DisplayImage DisplayImage.cpp)
target_link_libraries(DisplayImage ${OpenCV_LIBS})
- 保存退出后,进入build文件夹
cd build
cmake ..
make
- 即可编译通过,然后将一张图片放入build文件夹下,运行DisplayImage可执行文件
./DisplayImage
- 即可显示那张图片,这就说明OpenCV3.3安装成功了!
可能遇到的问题
1. 多个版本的OpenCV
如果系统安装了多个版本的OpenCV,比如OpenCV2.4和OpenCV3.3,OpenCV的安装会通过,但是如果要安装其它依赖于某个版本的OpenCV的工程时,如Caffe,它就会报错。这时候的解决办法就是:
-
删除不需要的OpenCV版本
-
CMake下指定OpenCV版本
关键文件:OpenCVConfig.cmake。在OpenCV编译好后,所在目录中一般会有一个叫OpenCVConfig.cmake的文件,这个文件指定了CMake要去哪里找OpenCV,其头文件在哪里等,比如其中一行:
# Provide the include directories to the caller
set(OpenCV_INCLUDE_DIRS "/home/ubuntu/src/opencv-3.1.0/build" "/home/ubuntu/src/opencv-3.1.0/include" "/home/ubuntu/src/opencv-3.1.0/include/opencv")
只要让CMake找到这个文件,这个文件就指定了Opencv的所有路径,因此设置OpenCV_DIR为包含OpenCVConfig.cmake的目录,如在我的C++工程CMakeLists.txt中添加
set(OpenCV_DIR "/home/ubuntu/src/opencv-3.1.0/build")
我的OpenCVConfig.cmake在
/home/ubuntu/src/opencv-3.1.0/build
注意,将其添加在project(MyProjectName)之前。
如CMakeLists.txt内容如下:
cmake_minimum_required(VERSION 2.8)
set(OpenCV_DIR "/home/ubuntu/src/opencv-3.1.0/build")
project( camera )
find_package( OpenCV REQUIRED )
add_executable( camera camera.cpp )
target_link_libraries( camera ${OpenCV_LIBS} )
因此,我们期望使用哪个版本的Opencv,只要找到对应的OpenCVConfig.cmake文件,并且将其路径添加到工程的CMakeLists.txt中即可了。
此问题的其它解决办法可参考:https://www.cnblogs.com/xzd1575/p/5555523.html
2. Eigen 错误
如果开启Eigen,可能会遇到如下错误:
...opencv_contrib/modules/rgbd/src/odometry.cpp:21:12: fatal error: unsupported/Eigen/MatrixFunctions: No such file or directory
# include <unsupported/Eigen/MatrixFunctions>^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
解决方案是将对应的文件夹复制到/usr/include/下,举例Eigen安装到了/usr/include/eigen3/,则执行:
cd /usr/include/eigen3/
sudo cp -r unsupported/ ..
sudo cp -r Eigen/ ..
3. Could NOT find CUDA
重装了一次系统,但是原来的一些软件可能没有卸载干净,比如以前安装的是cuda8.0+opencv3.4.1,新装的是cuda9.0+opencv3.4.1,这里不介绍opencv3.4.1,只讲cmake遇到的一些问题
cmake链接opencv时,在这一步遇到Could NOT find CUDA: Found unsuitable version “8.0”, but required is exact version “9.0” (found /usr/local/cuda)
find_package(OpenCV REQUIRED)
应该是系统还是认为是cuda8.0,但其实我已经装的是9.0的版本, 在终端 nvcc-V的时候也是9.0版本,而且我移除了所有8.0的文件夹,但还是cmake发现不了 cuda-9.0.
opencv重装,环境变量设置等等等等但仍然解决不了。
解决方案:
mkdir build
# cmake .. 一般会这样,但没有这样
cmake -D CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda-9.0 .. #ok编译成功,需要指定一下cuda路径
原理:
原理转自 http://www.it1352.com/344521.html:
cmake的提到 CUDA_TOOLKIT_ROOT_DIR 作为CMake的变量,而不是环境之一。这就是为什么当你把它变成的.bashrc不工作。如果你看看FindCUDA.cmake它清楚地说:
该脚本会提示用户指定CUDA_TOOLKIT_ROOT_DIR如果preFIX
不能NVCC的位置,在系统路径和要求的确定
被指定到find_package()。要使用的不同的安装版本
工具箱设置环境变量CUDA_BIN_PATH运行cmake的前
(例如CUDA_BIN_PATH =的/ usr /本地/ cuda1.0而不是默认的/ usr /本地/ CUDA)
或配置之后设置CUDA_TOOLKIT_ROOT_DIR。如果更改的值
CUDA_TOOLKIT_ROOT_DIR,依赖路径上的各种组件将
搬迁。
所以把 CUDA_BIN_PATH 到.bashrc或者指定 CUDA_TOOLKIT_ROOT_DIR 来cmake的:
http://www.it1352.com/344521.html