一、基本关系
opencv
OpenCV的全称是Open Source Computer Vision Library,是一个跨平台的计算机视觉处理开源软件库,是由Intel公司俄罗斯团队发起并参与和维护,支持与计算机视觉和机器学习相关的众多算法。OpenCV基于C++实现,同时提供python, Ruby, Matlab等语言的接口。OpenCV-Python是OpenCV的Python API,结合了OpenCV C++API和Python语言的最佳特性。
libopencv
"libopencv" 是 OpenCV 库的一个部分,是指 OpenCV 库的核心静态链接库文件,包括计算机视觉算法、图像处理等的实现。 "libopencv" 是 "OpenCV" 库的一个组成部分,是 OpenCV 的核心代码库之一。
vision_opencv
在 Ubuntu 上使用 ROS 并需要使用 OpenCV,需要安装 ROS 中的 "vision_opencv" 软件包。该软件包提供了与 OpenCV 相关的 ROS 节点和函数,可以方便地使用 OpenCV 进行图像处理和计算机视觉任务。
cv_bridge
cv_bridge是vision_opencv中的一个包,用于opencv与ROS之间的数据通信。
可以说 "vision_opencv" 软件包和 "libopencv" 库都是与 OpenCV 相关的软件库,但是它们的使用方式和应用场景略有不同。
opencv-python
是opencv的python绑定库,满足python的使用。
简单来讲,我们一般会在ubuntu运用ROS对图片数据进行传输,不管是python还是C++,我们都需要安装一个暂且叫做主opencv库,和一个cv_bridge.下面将讲怎么安装使用。
二、下载安装
2.1 C++
- 自动安装
- 主opencv库的安装
sudo apt-get install libopencv-dev
- cv_bridge的安装
sudo apt-get install ros-noetic-cv-bridge
用以上两行命令即可解决,但这样的方法虽然简单,有时候却不能满足编译条件,比如ubuntu20.04默认是opencv4,如果你的代码想用opencv3,就会出现问题。于是还可以手动安装opencv。
- 手动安装
- 主opencv库安装
所以我们就去opencv官网找4.2.0的包,下载下来。
安装依赖
sudo apt-get install build-essential cmake git
sudo apt-get install libgtk2.0-dev pkg-config libavcodec-dev
sudo apt-get install libavformat-dev libswscale-dev
sudo apt-get install python-dev python-numpy python3-dev python3-numpy
sudo apt-get install libtbb2 libtbb-dev libjasper-dev libdc1394-22-dev
sudo apt-get install libjpeg-dev libpng-dev libtiff-dev
编译安装
mkdir build && cd build
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
#电脑性能差可去掉-j4,性能很好可增加数字(线程)
make -j4
sudo make install
添加环境路径
配置OpenCV变量,编辑文件 /etc/ld.so.conf.d/opencv.conf(如果没有就会自动创建):
sudo gedit /etc/ld.so.conf.d/opencv.conf
然后添加 OpenCV的 lib 路径:
/usr/local/opencv4/lib
保存退出,执行:
sudo ldconfig
编辑 ~/.bashrc 文件:
sudo gedit ~/.bashrc
最后添加:
xport PKG_CONFIG_PATH=${PKG_CONFIG_PATH}:/usr/local/opencv4/lib/pkgconfig
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:./usr/local/opencv4/lib
保存退出
source ~/.bashrc
验证opencv是否安装
pkg-config --modversion opencv
- 冲突问题
这时问题就出现了,你的电脑里现在有两个opencv和一个cv_bridge,就会出现版本冲突的令人头疼的问题。首先应该将两个opencv区分开,让C++知道应该用哪个进行编译,应在CMakelist文件中添加
set(OpenCV_DIR "~/opencv-3.2.0/installed")
find_package(OpenCV 3.2。0 REQUIRED)
现在opencv解决了,但由于你手动安装的opencv版本和cv_bridge是不一样,cv_bridge版本默认和libopencv配对,这两个依然还是会冲突,所以应该下载官网的opencv_vision包。
- opencv_vision的安装
官网如下,选择和opencv一样的版本下载
https://github.com/ros-perception/vision_opencv
随后像这样一样直接把这整个包放入你的工作空间中,一起进行编译。
如果还出现冲突将cv_bridge先卸载也可以,反正就一行命令的事情。
sudo apt-get remove ros-noetic-cv-bridge
这样就可以在ubuntu20.04使用opencv3进行编译了。需要用opencv4进行编译时,将bashrc中的opencv路径注释,不放入vision-opencv即可。
- 其他问题
Q1:opencv和cv_bridge的版本不同一定不能编译吗?
A1:并不是,如果libopencv是4.2,版本你手动安装的是opencv4.1,是可以通过编译的,但会显示冲突警告。有时如果相差版本过大是通不过编译的,博主换成手动安装的opencv3.2就编译报错了。
Q2:安装了libopencv后,有必要再手动安装一个同样的opencv版本吗?
A2:一般情况下是没必要的,libopencv和opencv他们有一个就好,博主做过测试,只要有一个,就可以找到opencv进行编译。
Q3:推荐自动安装opencv还是手动安装opencv?
A3:看具体的代码要求,自动安装的优势是很方便,但版本固定。手动安装比较复杂,但可以自由安装版本。博主是先自动安装opencv和cv_bridge,主要满足不了编译条件再手动安装。一般情况如果自动安装opencv3,那就手动安装一个opencv4.自动安装opencv4,就手动安装opencv3.同系的opencv一般虽然会显示冲突,但是能够编译通过的。
Q4:我就想手动安装opencv,不想用简单一行命令的libopencv,且不与一行命令的cv_bridge产生冲突,可以吗?
A4:你jian不jian啊(绝大多数人的情况),但是确实可以。可以先安装libopencv,然后查看它的版本,然后再去官网选择与libopencv的版本一样的下载就可以了,不会产生冲突。博主亲自实验过,也是jian的。但大部分情况是这两种方法使用的效果一样,那为什么不选择用一行命令呢?
2.2 PYTHON
1.安装
python 相对的使用就方便很多
- 主opencv库安装
pip install opencv-python
- cv_bridge
pip install cv_bridge
不过好像sudo apt-get install ros-noetic-cv-bridge安装完,python就能用cv_bridge
2.其他问题
Q1:手动安装opencv完整库后,能否不安装opencv-python,就能在python使用
A1:经过测试,是不行的。如果python想用opencv就必须安装opencv-python。
总结:opencv的安装使用,主要头疼的地方是在C++的编译冲突,网上有大量的教你怎么修改cv_bridge的原始调用文件等等很复杂。其实很简单,opencv和cv_bridge的安装使用,要手动都手动,要自动都自动,就可以避免冲突。
版权归原作者 桦树无泪 所有, 如有侵权,请联系我们删除。