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’鍵。清除當前的關鍵點,強制重新檢測檢測面部。
移動後的追蹤
好了,先到這裏吧