亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

搜索
博主信息
博文 291
粉絲 0
評(píng)論 0
訪問(wèn)量 450485
最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板
【Linux學(xué)習(xí)】OpenCV+ROS 實(shí)現(xiàn)人臉識(shí)別(Ubantu16.04)
原創(chuàng)
1035人瀏覽過(guò)

鏡像下載、域名解析、時(shí)間同步請(qǐng)點(diǎn)擊 阿里云開源鏡像站

前言

本文主要學(xué)習(xí) ROS機(jī)器人操作系統(tǒng) ,在ROS系統(tǒng)里調(diào)用 OpenCV庫(kù) 實(shí)現(xiàn)人臉識(shí)別任務(wù)

一、環(huán)境配置

1.安裝ROS

  1. sudo apt-get install ros-kinetic-desktop-full

2.攝像頭調(diào)用

安裝攝像頭組件相關(guān)的包,命令行如下:

  1. sudo apt-get install ros-kinetic-usb-cam

啟動(dòng)攝像頭,命令行如下:

  1. roslaunch usb_cam usb_cam-test.launch

調(diào)用攝像頭成功,如下圖所示:

file

攝像頭的驅(qū)動(dòng)發(fā)布的相關(guān)數(shù)據(jù),如下圖所示:

file

攝像頭 usb_cam/image_raw 這個(gè)話題,發(fā)布的消息的具體類型,如下圖所示:

file

那么圖像消息里面的成員變量有哪些呢?

打印一下就知道了!一個(gè)消息類型里面的具體成員變量,如下圖所示:

file

  • Header:很多話題消息里面都包含的

    消息頭:包含消息序號(hào),時(shí)間戳和綁定坐標(biāo)系

    消息的序號(hào):表示我們這個(gè)消息發(fā)布是排第幾位的,并不需要我們手動(dòng)去標(biāo)定,每次

    發(fā)布消息的時(shí)候會(huì)自動(dòng)地去累加

    綁定坐標(biāo)系:表示的是我們是針對(duì)哪一個(gè)坐標(biāo)系去發(fā)布的header有時(shí)候也不需要去配置

  • height:圖像的縱向分辨率

  • width:圖像的橫向分辨率

  • encoding:圖像的編碼格式,包含RGB、YUV等常用格式,都是原始圖像的編碼格式,不涉及圖像壓縮編碼

  • is_bigendian: 圖像數(shù)據(jù)的大小端存儲(chǔ)模式

  • step:一行圖像數(shù)據(jù)的字節(jié)數(shù)量,作為數(shù)據(jù)的步長(zhǎng)參數(shù)

  • data:存儲(chǔ)圖像數(shù)據(jù)的數(shù)組,大小為step×height個(gè)字節(jié)

  • format:圖像的壓縮編碼格式(jpeg、png、bmp)

3.導(dǎo)入OpenCV

file

在ROS當(dāng)中完成OpenCV的安裝,命令行如下圖所示:

  1. sudo apt-get install ros-kinetic-vision-opencv libopencv-dev python-opencv

安裝完成

file

二、創(chuàng)建工作空間和功能包

1.創(chuàng)建工作空間

  1. mkdir -p ~/catkin_ws/src
  2. cd ~/catkin_ws/src
  3. catkin_init_workspace
  • 創(chuàng)建完成工作空間后,在根目錄下面,執(zhí)行編譯整個(gè)工作空間
  1. cd ~/catkin_ws/
  2. catkin_make
  • 工作空間中會(huì)自動(dòng)生成兩個(gè)文件夾:devel,build

  • devel文件夾中產(chǎn)生幾個(gè)setup.*sh形成的環(huán)境變量設(shè)置腳本,使用source命令運(yùn)行這些腳本文件,則工作空間中的環(huán)境變量得以生效

  1. source devel/setup.sh
  • 將環(huán)境變量設(shè)置到/.bashrc文件中
  1. gedit ~/.bashrc
  • 在打開的文件,最下面粘貼以下代碼即可設(shè)置環(huán)境變量
  1. source ~/catkin_ws/devel/setup.bash

2.創(chuàng)建功能包

開始創(chuàng)建

  1. cd ~/catkin_ws/src
  2. catkin_create_pkg learning std_msgs rospy roscpp

回到根目錄,編譯并設(shè)置環(huán)境變量

  1. cd ~/catkin_ws
  2. catkin_make
  3. source ~/catkin_ws/devel/setup.sh

三、人臉識(shí)別檢測(cè)相關(guān)代碼

基于 Haar 特征的級(jí)聯(lián)分類器檢測(cè)算法

核心內(nèi)容,如下所示:

  • 灰階色彩轉(zhuǎn)換
  • 縮小攝像頭圖像
  • 直方圖均衡化
  • 檢測(cè)人臉

1.python文件

face_detector.py

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import rospy
  4. import cv2
  5. import numpy as np
  6. from sensor_msgs.msg import Image, RegionOfInterest
  7. from cv_bridge import CvBridge, CvBridgeError
  8. class faceDetector:
  9. def __init__(self):
  10. rospy.on_shutdown(self.cleanup);
  11. # 創(chuàng)建cv_bridge
  12. self.bridge = CvBridge()
  13. self.image_pub = rospy.Publisher("cv_bridge_image", Image, queue_size=1)
  14. # 獲取haar特征的級(jí)聯(lián)表的XML文件,文件路徑在launch文件中傳入
  15. cascade_1 = rospy.get_param("~cascade_1", "")
  16. cascade_2 = rospy.get_param("~cascade_2", "")
  17. # 使用級(jí)聯(lián)表初始化haar特征檢測(cè)器
  18. self.cascade_1 = cv2.CascadeClassifier(cascade_1)
  19. self.cascade_2 = cv2.CascadeClassifier(cascade_2)
  20. # 設(shè)置級(jí)聯(lián)表的參數(shù),優(yōu)化人臉識(shí)別,可以在launch文件中重新配置
  21. self.haar_scaleFactor = rospy.get_param("~haar_scaleFactor", 1.2)
  22. self.haar_minNeighbors = rospy.get_param("~haar_minNeighbors", 2)
  23. self.haar_minSize = rospy.get_param("~haar_minSize", 40)
  24. self.haar_maxSize = rospy.get_param("~haar_maxSize", 60)
  25. self.color = (50, 255, 50)
  26. # 初始化訂閱rgb格式圖像數(shù)據(jù)的訂閱者,此處圖像topic的話題名可以在launch文件中重映射
  27. self.image_sub = rospy.Subscriber("input_rgb_image", Image, self.image_callback, queue_size=1)
  28. def image_callback(self, data):
  29. # 使用cv_bridge將ROS的圖像數(shù)據(jù)轉(zhuǎn)換成OpenCV的圖像格式
  30. try:
  31. cv_image = self.bridge.imgmsg_to_cv2(data, "bgr8")
  32. frame = np.array(cv_image, dtype=np.uint8)
  33. except CvBridgeError, e:
  34. print e
  35. # 創(chuàng)建灰度圖像
  36. grey_image = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
  37. # 創(chuàng)建平衡直方圖,減少光線影響
  38. grey_image = cv2.equalizeHist(grey_image)
  39. # 嘗試檢測(cè)人臉
  40. faces_result = self.detect_face(grey_image)
  41. # 在opencv的窗口中框出所有人臉區(qū)域
  42. if len(faces_result)>0:
  43. for face in faces_result:
  44. x, y, w, h = face
  45. cv2.rectangle(cv_image, (x, y), (x+w, y+h), self.color, 2)
  46. # 將識(shí)別后的圖像轉(zhuǎn)換成ROS消息并發(fā)布
  47. self.image_pub.publish(self.bridge.cv2_to_imgmsg(cv_image, "bgr8"))
  48. def detect_face(self, input_image):
  49. # 首先匹配正面人臉的模型
  50. if self.cascade_1:
  51. faces = self.cascade_1.detectMultiScale(input_image,
  52. self.haar_scaleFactor,
  53. self.haar_minNeighbors,
  54. cv2.CASCADE_SCALE_IMAGE,
  55. (self.haar_minSize, self.haar_maxSize))
  56. # 如果正面人臉匹配失敗,那么就嘗試匹配側(cè)面人臉的模型
  57. if len(faces) == 0 and self.cascade_2:
  58. faces = self.cascade_2.detectMultiScale(input_image,
  59. self.haar_scaleFactor,
  60. self.haar_minNeighbors,
  61. cv2.CASCADE_SCALE_IMAGE,
  62. (self.haar_minSize, self.haar_maxSize))
  63. return faces
  64. def cleanup(self):
  65. print "Shutting down vision node."
  66. cv2.destroyAllWindows()
  67. if __name__ == '__main__':
  68. try:
  69. # 初始化ros節(jié)點(diǎn)
  70. rospy.init_node("face_detector")
  71. faceDetector()
  72. rospy.loginfo("Face detector is started..")
  73. rospy.loginfo("Please subscribe the ROS image.")
  74. rospy.spin()
  75. except KeyboardInterrupt:
  76. print "Shutting down face detector node."
  77. cv2.destroyAllWindows()

2.lanuch文件

usb_cam.launch

  • 攝像頭啟動(dòng)文件
  1. <launch>
  2. <node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen" >
  3. <param name="video_device" value="/dev/video0" />
  4. <param name="image_width" value="640" />
  5. <param name="image_height" value="480" />
  6. <param name="pixel_format" value="yuyv" />
  7. <param name="camera_frame_id" value="usb_cam" />
  8. <param name="io_method" value="mmap"/>
  9. </node>
  10. </launch>

face_detector.launch

  • 人臉識(shí)別啟動(dòng)文件
  1. <launch>
  2. <node pkg="test2" name="face_detector" type="face_detector.py" output="screen">
  3. <remap from="input_rgb_image" to="/usb_cam/image_raw" />
  4. <rosparam>
  5. haar_scaleFactor: 1.2
  6. haar_minNeighbors: 2
  7. haar_minSize: 40
  8. haar_maxSize: 60
  9. </rosparam>
  10. <param name="cascade_1" value="$(find robot_vision)/data/haar_detectors/haarcascade_frontalface_alt.xml" />
  11. <param name="cascade_2" value="$(find robot_vision)/data/haar_detectors/haarcascade_profileface.xml" />
  12. </node>
  13. </launch>

3.CvBridge

  • ROS 與 OpenCV 之間的數(shù)據(jù)連接是通過(guò) CvBridge 來(lái)實(shí)現(xiàn)的
  • ROS Image Message與 OpenCV Ipllmage 之間連接的一個(gè)橋梁

cv_bridge_test.py

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import rospy
  4. import cv2
  5. from cv_bridge import CvBridge, CvBridgeError
  6. from sensor_msgs.msg import Image
  7. class image_converter:
  8. def __init__(self):
  9. # 創(chuàng)建cv_bridge,聲明圖像的發(fā)布者和訂閱者
  10. self.image_pub = rospy.Publisher("cv_bridge_image", Image, queue_size=1)
  11. self.bridge = CvBridge()
  12. self.image_sub = rospy.Subscriber("/usb_cam/image_raw", Image, self.callback)
  13. def callback(self,data):
  14. # 使用cv_bridge將ROS的圖像數(shù)據(jù)轉(zhuǎn)換成OpenCV的圖像格式
  15. try:
  16. cv_image = self.bridge.imgmsg_to_cv2(data, "bgr8")
  17. except CvBridgeError as e:
  18. print e
  19. # 在opencv的顯示窗口中繪制一個(gè)圓,作為標(biāo)記
  20. (rows,cols,channels) = cv_image.shape
  21. if cols > 60 and rows > 60 :
  22. cv2.circle(cv_image, (60, 60), 30, (0,0,255), -1)
  23. # 顯示Opencv格式的圖像
  24. cv2.imshow("Image window", cv_image)
  25. cv2.waitKey(3)
  26. # 再將opencv格式額數(shù)據(jù)轉(zhuǎn)換成ros image格式的數(shù)據(jù)發(fā)布
  27. try:
  28. self.image_pub.publish(self.bridge.cv2_to_imgmsg(cv_image, "bgr8"))
  29. except CvBridgeError as e:
  30. print e
  31. if __name__ == '__main__':
  32. try:
  33. # 初始化ros節(jié)點(diǎn)
  34. rospy.init_node("cv_bridge_test")
  35. rospy.loginfo("Starting cv_bridge_test node")
  36. image_converter()
  37. rospy.spin()
  38. except KeyboardInterrupt:
  39. print "Shutting down cv_bridge_test node."
  40. cv2.destroyAllWindows()

四、代碼實(shí)測(cè)

1.執(zhí)行命令行

分別在三個(gè)終端下運(yùn)行,命令行如下:

啟動(dòng)攝像頭

  1. roslaunch robot_vision usb_cam.launch

啟動(dòng)人臉識(shí)別

  1. roslaunch robot_vision face_detector.launch

打開人臉識(shí)別窗口

  1. rqt_image_view

2.人臉識(shí)別效果

拿了C站官方送的書來(lái)進(jìn)行測(cè)試,識(shí)別的效果還是相當(dāng)不錯(cuò)的,效果如下圖所示:

file

五、報(bào)錯(cuò)解決

報(bào)錯(cuò)1:E:無(wú)法定位軟件包 ros-kinetic-usb-cam

file

解決方法: 網(wǎng)上下載編譯安裝

$ cd catkin_ws/src

$ git clone https://github.com/bosch-ros-pkg/usb_cam.git

$ cd ~/catkin_ws

$ catkin_make

成功解決:

file

報(bào)錯(cuò)2:?jiǎn)?dòng)攝像頭報(bào)錯(cuò)

file

file決方法:輸入以下命令行,再啟動(dòng)攝像頭

  1. source ~/catkin_ws/devel/setup.bash

成功解決:

file

報(bào)錯(cuò)3:虛擬機(jī)攝像頭沒(méi)連接報(bào)錯(cuò)

file

解決方法:打開虛擬機(jī)設(shè)置,更改usb版本為3.1

file

可移動(dòng)設(shè)備將攝像頭設(shè)置連接

file

六、總結(jié)

  • 在ROS操作系統(tǒng)中調(diào)用 OpenCV 完成人臉識(shí)別還是比較有意思的,目前圖像處理和人臉識(shí)別還是比較常用到的,本文主要記錄學(xué)習(xí)過(guò)程,以及遇到的相關(guān)報(bào)錯(cuò)問(wèn)題進(jìn)行記錄

  • 如何對(duì)于特定目標(biāo)的檢測(cè)并顯示出結(jié)果?如何優(yōu)化讓人臉識(shí)別的更精準(zhǔn)?目前還在朝著這個(gè)方向進(jìn)行思考和探究

原文鏈接:https://blog.csdn.net/m0_61745661/article/details/125578352

本博文版權(quán)歸博主所有,轉(zhuǎn)載請(qǐng)注明地址!如有侵權(quán)、違法,請(qǐng)聯(lián)系admin@php.cn舉報(bào)處理!
全部評(píng)論 文明上網(wǎng)理性發(fā)言,請(qǐng)遵守新聞評(píng)論服務(wù)協(xié)議
0條評(píng)論
作者最新博文
關(guān)于我們 免責(zé)申明 意見(jiàn)反饋 講師合作 廣告合作 最新更新
php中文網(wǎng):公益在線php培訓(xùn),幫助PHP學(xué)習(xí)者快速成長(zhǎng)!
關(guān)注服務(wù)號(hào) 技術(shù)交流群
PHP中文網(wǎng)訂閱號(hào)
每天精選資源文章推送
PHP中文網(wǎng)APP
隨時(shí)隨地碎片化學(xué)習(xí)
PHP中文網(wǎng)抖音號(hào)
發(fā)現(xiàn)有趣的

Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)

  • 登錄PHP中文網(wǎng),和優(yōu)秀的人一起學(xué)習(xí)!
    全站2000+教程免費(fèi)學(xué)