利用ros+opencv進行人臉識別測試

1.前言

最近在忙機器人項目的人臉識別測試,由於有其他事情,導致人臉識別測試這塊弄的時間很少,遇到很多坑,特此記錄,以便以後方便查看.

2.opencv2.4.9安裝

一開始本來以爲ros自帶的opencv2.4.8能夠利用上,就沒再想裝其他opencv版本,結果還是不行,老是報錯.
在Python的環境下輸入命令:

import cv2.cv as cv

會出現如下錯誤:

ImportError: No module named cv

或者

ImportError: No module named cv2.cv

找了半天網上的資料和辦法,也沒弄成功,應該把網上的辦法都試了個便,還是不行,這時想應該是opencv缺少什麼東西或者自帶的庫有些不全,主要是一開始裝了opencv3.x的版本,導致出現各種問題,因爲人臉識別測試是用的opencv2的庫,因此先把opencv3.x卸載乾淨,然後裝了一個opencv2.4.9
但是我安裝opencv版本2的時候,他的下載速度實在感人,不知道是哪裏的原因,於是改用weget命令下載,再此之前有一些依賴需要安裝:

sudo apt-get install build-essential cmake libgtk2.0-dev pkg-config python-dev python-numpy libavcodec-dev

我這裏下載opencv2.4.9,有需要的可以去下載其他版本,因爲使用別人的腳本下載的非常慢,所以使用weget命令下載,命令如下:

wget https://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.4.9/opencv-2.4.9.zip

我放在了home文件夾下,下載完後會有一個zip文件,將其解壓到本地

unzip opencv-2.4.9.zip

進入到解壓的文件夾下

cd /opencv-2.4.9
mkdir build
cd build
 cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local .. 

這裏寫圖片描述

make -j4

這裏寫圖片描述

sudo make install (注意一定要加sudo,否則會報出permission問題) 

這裏寫圖片描述

pkg-config –modversion opencv (安裝結束後,可以用該條命令查看opencv版本) 

至此,opencv已經安裝完成了,不過不要認爲這樣就萬事大吉了,別忘了配置環境變量

sudo gedit /etc/ld.so.conf (在彈出的窗口中複製如下一段文字:/usr/local/lib) 
sudo ldconfig (使得配置生效) 
sudo gedit /etc/bash.bashrc 

(在彈出的窗口中添加
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
)
這裏寫圖片描述

source /etc/bash.bashrc 使得配置生效

走到這裏纔算得上是真正安裝opencv結束
這裏寫圖片描述

3.利用rbx1中的源碼進行人臉識別測試

首先下載rbx1的源碼,

cd ~/catkin_ws/src
git clone https://github.com/pirobot/rbx1.git
cd rbx1
git checkout hydro-devel
cd ~/catkin_ws
catkin_make
source ~/catkin_ws/devel/setup.bash

安裝攝像頭驅動
這裏寫圖片描述

測試網絡攝像頭
這裏寫圖片描述

這裏寫圖片描述

如圖所示
這裏寫圖片描述

測試1

cv_bridge程序包
這裏寫圖片描述

這裏寫圖片描述

注意:這裏要修改一下cv_bridge_demo.py裏的某個語句,不然程序會報錯
其中有

 frame = self.bridge.imgmsg_to_cv(ros_image, "bgr8")

改成

 frame = self.bridge.imgmsg_to_cv2(ros_image, "bgr8")
      depth_image = self.bridge.imgmsg_to_cv(ros_image, "32FC1")

改成

    depth_image = self.bridge.imgmsg_to_cv2(ros_image, "32FC1")

因爲
ROS與OpenCV之間的圖像格式轉換由 cv_bridge 包負責,我們看下這個包怎麼運作:

 $ roslaunch rbx1_vision usb_cam.launch video_device:=/dev/video0
 $ $rosrun rbx1_vision cv_bridge_demo.py

 Github的代碼已經更新,這裏面我們需要手動改一些這個python script的語句,注意,這個文件的路徑在:catkin_ws/src/rbx1/rbx1_vision/nodes下。

 將其中的 input_rgb_image,input_depth_image全部改爲/camera/rgb/image_raw。以上兩個是jade裏的更新的主題名,但在indigo裏,還是以/camera/rgb/image_raw爲主題名。

這個python script裏面幾個關鍵的語句:

 # 創建CvBridge對象
 self.bridge = CvBridge()
 # 將ros_image通過藍綠紅8位色空間轉換爲OpenCV圖像,結果返回給frame
 frame = self.bridge.imgmsg_to_cv2(ros_image,"bgr8")
 # 最後將frame用numpy轉換成numpy數列,OpenCV這樣大部分的函數才能夠處理
 frame = np.array(frame,dtype = np.uint8)

OpenCV的開發可以基於ros2opencv2.py(catkin_ws/src/rbx1/rbx1_vision/src/rbx1_vision/ros2opencv2.py),改寫其中的process_image()和process_depth_image()函數即可。在訂閱主題的同時,這個節點也會發布信息到/roi(關注域,region of interest)主題下。
如圖所示
這裏寫圖片描述

測試2

圖像流水線如下:
detect_face() → get_keypoints() → track_keypoints()
節點流水線如下:
face_detector.py() → good_features.py() → lk_tracker.py()
我們的節點face_tracker.py實現了以上過程。
同理先運行攝像頭節點(測試1有,不贅述)

第二運行下面的launch文件

roslaunch rbx1_vision face_tracker.launch

在視頻窗口的最前端,在鍵盤上輸入‘c’鍵。清除當前的關鍵點,強制重新檢測檢測面部。
這裏寫圖片描述

移動後的追蹤
這裏寫圖片描述

好了,先到這裏吧

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章