ROS中階筆記(五):機器人感知—機器視覺python
步驟一,檢測電腦是安裝usb_cam仍是應該安裝uvc_camlinux
$ lsusb #查看usb攝像頭
打開網址:http://www.ideasonboard.org/uvc/,查看與本身攝像頭匹配的ID號。
若是有,就說明你的筆記本攝像頭比較好,有他的廠商提供的linux驅動,是uvc_cam
沒有匹配的ID,說明是usb_cam。算法
Bus 001 Device 002: ID 04f2:b6d9 Chicony Electronics Co., Ltd #攝像頭
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 004: ID 0e0f:0008 VMware, Inc.
Bus 002 Device 003: ID 0e0f:0002 VMware, Inc. Virtual USB Hub
Bus 002 Device 002: ID 0e0f:0003 VMware, Inc. Virtual Mouse
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hubshell
步驟二,查看攝像頭設備數據庫
$ ls /dev/video* #默認筆記本自帶攝像頭是video0
步驟三,測試您的網絡攝像頭;(虛擬機+ubuntu16.04)ubuntu
$ sudo apt-get install cheese $ cheese # 啓動cheese查看攝像頭狀況
步驟四,安裝usb_camapi
$ sudo apt-get install ros-kinetic-usb-cam # 安裝攝像頭功能包 $ roslaunch usb_cam usb_cam-test.launch # 啓動功能包 $ rqt_image_view # 可視化工具
新版本的usb_cam包在launch文件夾下有自帶的launch文件,名叫usb_cam-test.launch數組
顯示圖像類型微信
$ roslaunch usb_cam usb_cam-test.launch $ rostopic info /usb_cam/image_raw
查看圖像消息網絡
$ rosmsg show sensor_msgs/Image
1080 * 720分辨率的攝像頭產生一幀圖像的數據大小是 3 * 1080 * 720=2764800字節,即2.7648MB
壓縮圖像消息
$ rosmsg show sensor_msgs/CompressedImage
紅外攝像頭採集三維點雲數據,採集的位置信息從xyz三個方向上描述,每個方向上的數據都是一個浮點數;
一個浮點數佔據的空間大小爲4個字節。
顯示點雲類型
$ roslaunch freenet_launch freenect.launch #啓動kinect $ rostopic info /camera/depth_registered/points
查看點雲消息
$ rosmsg show sensor_msgs/PointCloud2
點雲單幀數據量也很大,若是使用分佈式網絡傳輸,須要考慮可否知足數據的傳輸要求,或者針對數據進行壓縮。
圖像數據採集以前,須要把攝像頭進行一些標定,關於如何標定,咱們須要外部工具:棋盤格標定靶
攝像頭爲何要標定?
攝像頭這種精密儀器對光學器件的要求較高,因爲攝像頭內部與外部的一些緣由,生成的物體圖像每每會發生畸變,爲避免數據源形成的偏差,須要針對攝像頭的參數進行標定。
安裝標定功能包
$ sudo apt-get install ros-kinetic-camera-calibration
1.啓動攝像頭
$ roslaunch robot_vision usb_cam.launch # 啓動攝像頭功能包 $ roslaunch usb_cam usb_cam-test.launch # 啓動攝像頭功能包
2.啓動標定包
$ rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.024 image:=/usb_cam/image_raw camera:=/usb_cam # 8x6,中間是x,而不是乘號; # 啓動標定包以後,把棋盤格標定靶放在攝像頭的可視範圍內; # square 0.024 實際打印出來紙張的正方形邊長,本身拿尺子測量;0.024米 - 1.size:標定棋盤格的內部角點個數,這裏使用的棋盤一共有六行,每行有8個內部角點; - 2.square:這個參數對應每一個棋盤格的邊長,單位是米; - 3.image和camera:設置攝像頭髮布的圖像話題;
3.標定過程
CALIBRATE:標定以前是灰色;標定成功以後,變爲深綠色,說明當前標定已經結束;點擊它,界面好像未響應,這是由於它在後臺進行數據運算,不要關閉;
後面兩個灰色灰色按鍵SAVE、COMMIT變爲深綠色,說明計算完成;
4.同時在終端中顯示標定結果:
點擊按鍵SAVE,在終端中顯示標定的數據放在哪個路徑下面;
('Wrote calibration data to', '/tmp/calibrationdata.tar.gz')
5.解壓縮——找到標定文件
('Wrote calibration data to', '/tmp/calibrationdata.tar.gz')
找到calibrationdata.tar.gz文件,解壓,裏面有不少圖片(在作標定的時候,採樣圖片,這些圖片已經沒用),咱們須要只有一個文件ost.yaml
文件,把這個文件拷貝到功能包(本身建的任務的功能包)下面;
image_width: 640 image_height: 480 camera_name: narrow_stereo camera_matrix: rows: 3 cols: 3 data: [672.219498, 0.000000, 322.913816, 0.000000, 676.060141, 220.617820, 0.000000, 0.000000, 1.000000] distortion_model: plumb_bob distortion_coefficients: rows: 1 cols: 5 data: [-0.146620, 0.187588, 0.001657, 0.000009, 0.000000] rectification_matrix: rows: 3 cols: 3 data: [1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000] projection_matrix: rows: 3 cols: 4 data: [655.937012, 0.000000, 323.001754, 0.000000, 0.000000, 665.393311, 220.554221, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000]
Kinect包含彩色攝像頭和紅外攝像頭,咱們須要針對兩個攝像頭分別作標定。
1.啓動Kinect
$ roslaunch robot_vision freenect.launch
2.啓動彩色攝像頭
$ rosrun camera_calibration cameracalibrator.py image:=/camera/rgb/image_raw camera:=/camera/rgb --size 8x6 --square 0.024
3.標定紅外攝像頭
$ rosrun camera_calibration cameracalibrator.py image:=/camera/ir/image_raw camera:=/camera/ir --size 8x6 --square 0.024
在launch文件中加載標定文件,經過camera_info_url參數來進行加載;
Kinect由於有兩個標定文件,所以須要經過兩個參數的加載來完成;把兩個文件都加載在進來。
緣由:標定文件中camera_name參數與實際傳感器名稱不匹配
解決方法:按照警告提示的信息進行修改便可。
好比根據上圖所示的警告,分別將兩個標定文件.yaml
中的camera_name參數修改成
「rgb_A70774707163327A」、「depth_A70774707163327A」便可。
Open Source Computer Vision Library;基於BSD許可發行的跨平臺開源計算機視覺庫(Linux、Windows和Mac OS等);由一系列C函數和少許C++類構成,同時提供C++、Python、Ruby、MATLAB等語言的接口;實現了圖像處理和計算機視覺方面的不少通用算法,並且對非商業應用和商業應用都是免費的;能夠直接訪問硬件攝像頭,而且還提供了一個簡單的GUl系統一highgui。
安裝OpenCV
$ sudo apt-get install ros-kinetic-vision-opencv libopencv-dev python-opencv
測試例程
$ roslaunch robot_vision usb_cam.launch # 啓動攝像頭 $ rosrun robot_vision cv_bridge_test.py # 打開opencv圖像,本身的api接口 $ rqt_image_view # ROS中的圖像
imgmsg_to_cv2():將ROS圖像消息轉換成OpenCV圖像數據
cv2_to_imgmsg():將OpenCV格式的圖像數據轉換成ROS圖像消息
輸入參數:
1.圖像消息流
2.轉換的圖像數據格式
啓動人臉識別實例
$ roslaunch robot_vision usb_cam.launch # 啓動攝像頭 $ roslaunch robot_vision face_detector.launch # 啓動人臉識別功能節點 $ rqt_image_view
初始化部分:完成ROS節點、圖像、識別參數的設置。
ROS圖像回調函數:將圖像轉化成OpenCV的數據格式,而後預處理以後開始調用人臉識別的功能函數,最後把識別的結果發佈。
人臉識別:調用OpenCV提供的人臉識別接口,與數據庫中的人臉特徵進行匹配。
啓動物體跟蹤實例
$ roslaunch robot_vision usb_cam.launch # 啓動攝像頭 $ roslaunch robot_vision motion_detector.launch # 啓動物體跟蹤功能節點 $ rqt_image_view
初始化部分:完成ROS節點、圖像、識別參數的設置
圖像處理:將圖像轉換成OpenCV格式;完成圖像預處理以後開始針對兩幀圖像進行比較,基於圖像差別識別到運動的物體,最後標識識別結果併發布
安裝二維碼識別功能包
$ sudo apt-get install ros-kinect-ar-track-alvar
建立二維碼
$ rosrun ar_track_alvar createMarker $ rosrun ar_track_alvar createMarker 0 $ roscd robot_vision/config $ rosrun ar_track_alvar createMarker -s 5 0 #邊長5釐米,數字爲0的二維碼 $ rosrun ar_track_alvar createMarker -s 5 1 $ rosrun ar_track_alvar createMarker -s 5 2
1.啓動攝像頭二維碼識別示例
$ roslaunch robot_vision usb_cam_with_calibration.launch $ roslaunch robot_vision ar_track_camera.launch
啓動攝像頭時,須要加載標定文件,不然可能沒法識別二維碼。
2.查看識別到的二維碼位姿
$ rostopic echo /ar_pose_marker
啓動Kinect二維碼識別示例
$ roslaunch robot_vision freenect.launch $ roslaunch robot_vision ar_track_kinect.launch
Object Recognition Kitchen(ORK) 物體識別框架
TensorFlow Object Detection API 識別API
ROS cV_bridge wiki: http://wiki.ros.org/cv_bridge
ROS opencv_apps: http://wiki.ros.org/opencv_apps
微信公衆號:喵哥解說 公衆號介紹:主要研究機器學習、計算機視覺、深度學習、ROS等相關內容,分享學習過程當中的學習筆記和心得!期待您的關注,歡迎一塊兒學習交流進步!同時還有1200G的Python視頻和書籍資料等你領取!!!