1. 程式人生 > >解決Ubuntu環境下ROS Kinetic中的cv_bridge和自己安裝OpenCV 2.4.xx相容性筆記

解決Ubuntu環境下ROS Kinetic中的cv_bridge和自己安裝OpenCV 2.4.xx相容性筆記

我們如果使用的ROS版本為Kinetic,那麼ROS一般會預設安裝OpenCV3。所以使用cv_bridge的情況下,ROS會自動去呼叫它自己安裝的OpenCV3。但是對於一部分人還是比較習慣使用OpenCV2,所以需要對CMakeLists.txt檔案進行修改或者修改ROS目錄下的cv_bridge的配置檔案,具體操作如下。

(1)第一種方法就是不使用cv_bridge包,在CMakeLists.txt檔案中採用手動指定的方式找到自己安裝的OpenCV。

首先找到OpenCV配置檔案的路徑,所謂的配置檔案如下圖:


然後在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之間的相容性問題,再補充。