1. 程式人生 > >Ubuntu16.04下opencv2與ROSkinetic中自帶opencv3不相容問題總結

Ubuntu16.04下opencv2與ROSkinetic中自帶opencv3不相容問題總結

1、背景:從ROSindigo換到ROSkinetic,ROSkinetic中自帶的opencv3,與原來indigo中opencv2不一樣,所以原來的涉及opencv的程式都出了問題,最近這兩天就一直在改相容性,清明節最後一天了,總結一下關於opencv的一些問題

2、程式碼從indigo移到kinetic後,立馬運行了一下,果真不行,然後百度,知道是opencv相容問題,查到文章一篇:

按照文章修改了配置,後來發現有的程式ok了,有的程式還是不行

出現了

我就意識到現在問題不是相容性了,根據以往除錯經驗,undefined reference to xxx CMakeLists.txt中缺少對應庫,發現確實忘了加 opencv庫,新增之後就ok了。然而奇怪的是,為什麼會我之前在indigo中除錯沒有這個${OpenCV_LIBRARIES}庫卻沒有問題呢?如有大神知道,麻煩留言告知!

target_link_libraries(main_interface ${QT_LIBRARIES} ${catkin_LIBRARIES} ${OpenCV_LIBRARIES})

3、關於opencv3.x的使用及遷移

// old header
#include "opencv2/<module>/<module>.hpp"
// new header
#include "opencv2/<module>.hpp"
//for example:
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/highgui.hpp>//opencv3 changed place

4、ros by example1 程式碼涉及cv2.cv在kinetic中的使用

(1)rbx1_系列程式碼是基於indigo的,opencv2,在rbx1_vision中有這麼一句

import cv2.cv as cv

在ros kinetic中編譯時會出現沒有cv這個module的錯誤提示,因為子啊kinetic中它使用的是opencv3.x,所以你要使用rbx1的程式碼,必須要使用Ubuntu16.04中自帶的opencv2,而不是ROS kinetic中的opencv3!

(2)使用命令檢視系統opencv版本:如果不是opencv2.x,那你就要自己去下載opencv2然後自己編譯了

[email protected]
:~$ pkg-config --modversion opencv 2.4.9.1

據瞭解在,python中是通過cv2.so呼叫opencv的庫的:參考連結

Python呼叫opencv的原理是:opencv編譯出共享庫檔案,python把這個共享庫檔案作為一個模組載入並使用。通俗點就是,編譯opencv的時候開啟python介面選項,編譯好了會產生cv2.so(linux下)或者cv2.pyd(windows下)這個共享庫檔案,python程式碼中import這個cv2就可以用了。為了能正確import它,往往需要把cv2.so放在python找包能找到的路徑下,或者修改PYTHONPATH環境變數讓它包含cv2.so所在路徑。

(3)所以為了避免使用ROSkinetic中的opencv3的庫,就需要將其cv2.so刪掉,為了以防萬一,可以先將cv2.so移到其他地方

[email protected]:~$ cd /opt/ros/kinetic/lib/python2.7/dist-packages
[email protected]:~$ sudo mv cv2.so /home/sun 

移除cv2.so檔案後執行rbx1的cv_bridge_demo程式:完美!