安装 Opencv 3.2 on Ubuntu 16.04 并创建node测试

—假设我们已经安装好一版OpenCV,一般都安装在/usr/local下。
—如果需要安装另一个版本的OpenCV,就不能再安装到/usr/local,而是选择其他路径,否则会覆盖掉之前的版本。

step 1: 安装一些package

sudo apt-get -y install libopencv-dev build-essential cmake git libgtk2.0-dev pkg-config python-dev python-numpy libdc1394-22 libdc1394-22-dev libjpeg-dev libpng12-dev libjasper-dev libavcodec-dev libavformat-dev libswscale-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev libv4l-dev libtbb-dev libqt4-dev libfaac-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev x264 v4l-utils unzip

step 2: 创建新的文件夹作为OpenCV的目录

mkdir opencv

step 3: 将路径转到OpenCV的目录

cd opencv

step 4: 下载OpenCV的安装包

wget https://github.com/Itseez/opencv/archive/3.2.0.zip -O opencv-3.2.0.zip

(注:此处3.2.0可换成任意自己需要的版本即可直接下载相应版本)

step 5: 解压OpenCV的安装包

unzip opencv-3.2.0.zip

step 6: 将路径转到opencv-3.2.0的目录

cd opencv-3.2.0

step 7: 创建build文件夹

mkdir build

step 8: 将路径转到build文件夹

cd build

step 9: 运行cmake

cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_TBB=ON -D WITH_V4L=ON -D WITH_QT=ON -D WITH_OPENGL=ON …

step 10: 运行make

make -j $(nproc)

step 11: 运行install

sudo make install

step 12: 运行bash

sudo /bin/bash -c ‘echo “/usr/local/lib” > /etc/ld.so.conf.d/opencv.conf’

step 13: 运行配置

sudo ldconfig

step 14: 重启

Reboot your machine and run following command to check installed version

step 15: 查询版本

pkg-config --modversion opencv
安装成功!可以创建一个node测试了!

之后则是对ROS环境中的CMakeLists.txt 和 package.xml进行修改。

在这里插入图片描述
然后在CMakeLists.txt文件下指定该文件的目录,指令如下。

set(OpenCV_DIR /usr/local/share/OpenCV)

再就是用find package指令找到OpenCV包。

find_package(OpenCV REQUIRED)

指定OpenCV的头文件目录

include_directories(
  ......
  ${OpenCV_INCLUDE_DIRS}
  ......
)

将编译生成的文件与OpenCV的动态库/静态库进行链接。

target_link_libraries(
   ......
   ${OpenCV_LIBS}
   ......
)

总体的CMakeLists.txt文件如下图所示。
在这里插入图片描述
进入工程运行catkin_make以后可看到OpenCV的版本已经切换完成。
在这里插入图片描述

(2)除了上面去掉cv_bridge手动指定路径外。还有一种方法就是修改cv_bridge的配置文件,使得cv_bridge去调用我们自己安装的OpenCV版本,具体方式如下。

首先打开终端并进入cv_bridge配置文件所在目录,并用gedit指令打开该配置文件。

$ cd /opt/ros/kinetic/share/cv_bridge/cmake/
$ sudo gedit cv_bridgeConfig.cmake

在这里插入图片描述
然后按ctrl+f,输入关键词include找到以下内容并按图中的方式进行修改。
在这里插入图片描述

将默认的OpenCV头文件目录替换后,再按ctrl+f并输入关键词libraries可以找到下图的区域,我们将其库文件也进行替换。

在这里插入图片描述

与头文件直接写入目录的方式不同,库文件是将文件本身也写入到配置文件中。而OpenCV的库文件有很多种,如下图所示。
在这里插入图片描述

所以我们通常都将core、highgui、imgproc等常用的库文件写入到配置文件中,万一遇到要用的函数的库文件没有包含在配置文件中只要手动添加就可以。

修改cv_bridge的配置文件结束后,我们只需要在工程的CMakeLists.txt文件中的find_package加入cv_bridge就能够使用自己安装的OpenCV版本。不需要再像(1)方法中那样手动指定路径,而且这样做的好处就是能够使用cv_bridge。因为该包在OpenCV图像与ROS图像之间的转换中会经常用到。

在这里插入图片描述
这时候再编译工程就可以通过了,但奇怪的是我们发现编译输出OpenCV的版本还是3.3.1并且配置文件还是默认的OpenCV3,如下图所示。
在这里插入图片描述

然后我在cv_bridge配置文件中输入message(STATUS “opencv version: ${OpenCV_VERSION}”)来寻找哪条语句将OpenCV的版本号改回了ROS默认的版本。最终,在配置文件的最后几行的一条语句下面会出现版本号从Opencv 2.4.13变成Opencv 3.3.1。因此,该语句就是修改配置文件的路径的地方。然后,我用message找出修改OpenCV配置文件路径所在路径就知道了那个文件下面修改了OpenCV的配置文件,详细如下图所示。

在这里插入图片描述
然后在终端下面用gedit打开cv_bridge-extras.cmake文件,就发现它修改的地方了。
在这里插入图片描述
我们对该文件进行修改,把自己安装的OpenCV对应的目录输入到文件中,如下图所示:
在这里插入图片描述

再运行catkin_make编译工程就可以发现版本号回到了我们指定的版本号。当然,这只是对于显示设置而已,对于使用OpenCV没有太大的影响。

(3)还有一种方法就是cv_bridge与手动指定结合的方式。我们打开自己安装的OpenCV的配置文件可以发现该配置文件主要是用来设置一些OpenCV的相关信息,如下图所示。

在这里插入图片描述
然后我们只要在cv_bridge中导入OpenCV的配置文件,那么只要使用cv_bridge的包就可以在ROS中使用相关的OpenCV版本,如下图所示。
在这里插入图片描述

同样从配置文件中得到库函数目录的路径,如下图所示。
在这里插入图片描述

上面要注意的是在给系统赋予OpenCV头文件和库文件目录路径时,千万不要忘记把cv_bridge的头文件和库文件目录路径忘记赋给系统。最后把cv_bridge配置文件设置OpenCV参数的选项注释掉,如下图所示。
在这里插入图片描述

以后再遇到其他OpenCV与cv_bridge之间的兼容性问题,再补充。