輪式智能移動(dòng)操作機(jī)器人技術(shù)與應(yīng)用-基于ROS的Python編程 課件 第8章 基于平面視覺(jué)的應(yīng)用_第1頁(yè)
輪式智能移動(dòng)操作機(jī)器人技術(shù)與應(yīng)用-基于ROS的Python編程 課件 第8章 基于平面視覺(jué)的應(yīng)用_第2頁(yè)
輪式智能移動(dòng)操作機(jī)器人技術(shù)與應(yīng)用-基于ROS的Python編程 課件 第8章 基于平面視覺(jué)的應(yīng)用_第3頁(yè)
輪式智能移動(dòng)操作機(jī)器人技術(shù)與應(yīng)用-基于ROS的Python編程 課件 第8章 基于平面視覺(jué)的應(yīng)用_第4頁(yè)
輪式智能移動(dòng)操作機(jī)器人技術(shù)與應(yīng)用-基于ROS的Python編程 課件 第8章 基于平面視覺(jué)的應(yīng)用_第5頁(yè)
已閱讀5頁(yè),還剩48頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第八章基于平面視覺(jué)的應(yīng)用

實(shí)例目錄8.1獲取機(jī)器人平面視覺(jué)圖像8.2

利用平面視覺(jué)進(jìn)行人臉檢測(cè)8.3本章小結(jié)8.1獲取機(jī)器人平面視覺(jué)圖像

機(jī)器人視覺(jué)是機(jī)器人應(yīng)用中至關(guān)重要的一部分,本節(jié)將會(huì)介紹如何獲取機(jī)器人的視覺(jué)圖像及如何將其轉(zhuǎn)換為常用的OpenCV格式。8.1.1在仿真環(huán)境中獲取機(jī)器人平面視覺(jué)圖像1.編寫節(jié)點(diǎn)代碼首先需要?jiǎng)?chuàng)建一個(gè)ROS源碼包。在Ubuntu里打開(kāi)一個(gè)終端程序,輸入如下指令進(jìn)入ROS工作空間(見(jiàn)圖8-1)。cdcatkin_ws/src/圖8-1進(jìn)入ROS工作空間8.1.1在仿真環(huán)境中獲取機(jī)器人平面視覺(jué)圖像然后輸入如下指令創(chuàng)建ROS源碼包。catkin_create_pkgimage_pkgrospystd_msgssensor_msgscv_bridge按“Enter”鍵后創(chuàng)建image_pkg源碼包如圖8-2所示,此時(shí)系統(tǒng)會(huì)提示ROS源碼包創(chuàng)建成功,這時(shí)可以看到“catkin_ws/src”目錄下出現(xiàn)了“image_pkg”子目錄。圖8-2創(chuàng)建image_pkg源碼包8.1.1在仿真環(huán)境中獲取機(jī)器人平面視覺(jué)圖像創(chuàng)建image_pkg源碼包的指令含義,如表8-1所示。表8-1創(chuàng)建image_pkg源碼包的指令含義指令含義catkin_create_pkg創(chuàng)建ROS源碼包(Package)的指令image_pkg新建的ROS源碼包命名rospyPython依賴項(xiàng),因?yàn)楸纠淌褂肞ython編寫,所以需要這個(gè)依賴項(xiàng)std_msgs標(biāo)準(zhǔn)消息依賴項(xiàng),需要里面的String格式做文字輸出sensor_msgs傳感器消息依賴項(xiàng),需要里面的圖像數(shù)據(jù)格式cv_bridgeROS圖像格式轉(zhuǎn)換到OpenCV圖像格式的依賴項(xiàng)8.1.1在仿真環(huán)境中獲取機(jī)器人平面視覺(jué)圖像接下來(lái)在VisualStudioCode中進(jìn)行操作,將目錄展開(kāi),找到前面新建的“image_pkg”并展開(kāi),可以看到它是一個(gè)功能包最基礎(chǔ)的結(jié)構(gòu),選中“image_pkg”并對(duì)其右擊,彈出圖8-3所示的快捷菜單,選擇“新建文件夾”。圖8-3快捷菜單8.1.1在仿真環(huán)境中獲取機(jī)器人平面視覺(jué)圖像將這個(gè)文件夾命名為“scripts”(見(jiàn)圖8-4)。在第2章的2.3節(jié)中,有對(duì)此名稱文件夾的解釋。命名成功后按“Enter”鍵即創(chuàng)建成功。圖8-4創(chuàng)建“scripts”文件夾8.1.1在仿真環(huán)境中獲取機(jī)器人平面視覺(jué)圖像選中此文件夾并右擊,彈出圖8-3所示的快捷菜單,選擇“新建文件”。這個(gè)Python節(jié)點(diǎn)文件被命名為“image_node.py”。命名完成后即可在IDE右側(cè)開(kāi)始編寫“image_node.py”的代碼,其內(nèi)容如下。#!/usr/bin/envpython3#coding=utf-8importrospyimportcv2fromsensor_msgs.msgimportImagefromcv_bridgeimportCvBridge,CvBridgeErrorcapture_one_frame=True8.1.1在仿真環(huán)境中獲取機(jī)器人平面視覺(jué)圖像#彩色圖像回調(diào)函數(shù)defcbImage(msg):bridge=CvBridge()cv_image=bridge.imgmsg_to_cv2(msg,"bgr8")#彈出窗口顯示圖片

cv2.imshow("Imagewindow",cv_image)cv2.waitKey(1)#保存圖像到文件

globalcapture_one_frameifcapture_one_frame==True:cv2.imwrite('/home/robot/1.jpg',cv_image)rospy.logwarn("保存圖片成功!")capture_one_frame=False8.1.1在仿真環(huán)境中獲取機(jī)器人平面視覺(jué)圖像#主函數(shù)if__name__=="__main__":rospy.init_node("image_node")#訂閱機(jī)器人視覺(jué)傳感器kinect2的圖像話題

image_sub=rospy.Subscriber("/kinect2/hd/image_color_rect",Image,cbImage,queue_size=10)rospy.spin()(1)代碼的開(kāi)始部分,使用Shebang符號(hào)指定這個(gè)Python文件的解釋器為python3。如果是Ubuntu18.04或更早的版本,解釋器可設(shè)為python。(2)第二句代碼指定該文件的字符編碼為utf-8,這樣就能在代碼執(zhí)行的時(shí)候顯示中文字符。8.1.1在仿真環(huán)境中獲取機(jī)器人平面視覺(jué)圖像(3)使用import導(dǎo)入以下五個(gè)模塊。①rospy模塊,包含了大部分的ROS接口函數(shù)。②cv2模塊,包含了OpenCV圖形處理庫(kù)的函數(shù)接口。③sensor_msgs.msg里的Image數(shù)據(jù)類型模塊,這個(gè)是ROS里常用的圖形數(shù)據(jù)類型。④cv_bridge里的CvBridge模塊,這個(gè)是ROS圖形數(shù)據(jù)格式和OpenCV圖像數(shù)據(jù)格式的轉(zhuǎn)換工具。⑤cv_bridge里的CvBridgeError模塊,用于處理圖像格式轉(zhuǎn)換過(guò)程中的一些異常錯(cuò)誤。8.1.1在仿真環(huán)境中獲取機(jī)器人平面視覺(jué)圖像(4)這里定義了一個(gè)全局變量capture_one_frame,用來(lái)控制將彩色視頻圖像截取成為圖片文件的時(shí)機(jī),當(dāng)這個(gè)值為True的時(shí)候就保存一幀彩色圖像為文件。(5)定義一個(gè)回調(diào)函數(shù)cbImage(),用來(lái)處理kinect2獲取到的彩色視頻圖像。ROS每接收到一幀傳回來(lái)的彩色視頻圖像,就會(huì)自動(dòng)調(diào)用一次回調(diào)函數(shù)。圖像數(shù)據(jù)會(huì)以參數(shù)的形式傳遞到這個(gè)回調(diào)函數(shù)里。(6)回調(diào)函數(shù)cbImage()的參數(shù)msg是一個(gè)sensor_msgs::Image格式的消息包,其中存放著ROS格式的彩色圖像數(shù)據(jù)。在實(shí)際開(kāi)發(fā)中,通常不會(huì)直接使用這個(gè)格式的圖像,而是將其轉(zhuǎn)換成OpenCV格式,這樣就可以使用豐富的OpenCV函數(shù)來(lái)處理彩色圖像。8.1.1在仿真環(huán)境中獲取機(jī)器人平面視覺(jué)圖像(7)下面開(kāi)始這個(gè)轉(zhuǎn)換操作,先生成一個(gè)CvBridge對(duì)象,對(duì)象名為bridge;然后調(diào)用bridge的imgmsg_to_cv2()函數(shù),將參數(shù)msg里的圖像數(shù)據(jù)轉(zhuǎn)換成OpenCV的bgr8格式,并保存在對(duì)象cv_image中。(8)接下來(lái),調(diào)用cv2的imshow()函數(shù),將cv_image里的圖像顯示在一個(gè)彈出的窗口中,這個(gè)窗口的標(biāo)題為“Imagewindow”。(9)cv2.waitKey(1)可以讓程序暫停一會(huì),讓“Imagewindow”窗口中的彩色圖像能夠顯示出來(lái)。8.1.1在仿真環(huán)境中獲取機(jī)器人平面視覺(jué)圖像(10)回調(diào)函數(shù)的最后是彩色圖像的保存操作。當(dāng)capture_one_frame的值為True的時(shí)候,調(diào)用cv2的imwrite()函數(shù),將cv_image里的圖像數(shù)據(jù)保存成圖片文件,保存的位置為“/home/robot/1.jpg”。其中“/home/robot/”是當(dāng)前用戶的主文件夾,robot是當(dāng)前的用戶名。如果用戶名不是robot,則需要根據(jù)實(shí)際情況修改這個(gè)文件路徑。(11)當(dāng)圖像保存完畢后,先調(diào)用rospy.logwarn()顯示圖像保存成功的信息,然后將全局變量capture_one_frame設(shè)置為False。這樣下一幀圖像進(jìn)入這個(gè)回調(diào)函數(shù)的時(shí)候就不會(huì)再保存成圖片文件。作為實(shí)驗(yàn),我們只保存第一幀圖像,能夠進(jìn)行查看就行了。8.1.1在仿真環(huán)境中獲取機(jī)器人平面視覺(jué)圖像(12)當(dāng)__name__為“__main__”時(shí),執(zhí)行這個(gè)文件的主函數(shù)代碼。(13)調(diào)用rospy的init_node()函數(shù)進(jìn)行該節(jié)點(diǎn)的初始化操作,參數(shù)是節(jié)點(diǎn)名稱。(14)調(diào)用rospy的Subscriber()函數(shù)生成一個(gè)訂閱對(duì)象image_sub,在函數(shù)的參數(shù)中指明訂閱的話題名稱是“/kinect2/hd/image_color_rect”,也就是kinect2發(fā)布彩色圖像視頻的話題,數(shù)據(jù)類型為Image,回調(diào)函數(shù)設(shè)置為之前定義的cbImage(),緩沖長(zhǎng)度為10。8.1.1在仿真環(huán)境中獲取機(jī)器人平面視覺(jué)圖像(15)調(diào)用rospy的spin()函數(shù)對(duì)這個(gè)主函數(shù)進(jìn)行阻塞,保持這個(gè)節(jié)點(diǎn)程序不會(huì)結(jié)束退出。程序編寫完后,代碼并未馬上保存到文件里,此時(shí)會(huì)看到編輯區(qū)左上角的文件名“image_node.py”右側(cè)有個(gè)白色小圓點(diǎn)(見(jiàn)圖8-5),這表示此文件并未保存。在按下“Ctrl+S”鍵進(jìn)行保存后,白色小圓點(diǎn)會(huì)變成關(guān)閉按鈕“×”。圖8-5文件未保存狀態(tài)8.1.1在仿真環(huán)境中獲取機(jī)器人平面視覺(jué)圖像由于這個(gè)代碼文件是新創(chuàng)建的,其默認(rèn)不帶有可執(zhí)行屬性,所以我們需要為其添加一個(gè)可執(zhí)行屬性才能讓它運(yùn)行起來(lái)。啟動(dòng)一個(gè)終端程序,輸入如下指令進(jìn)入這個(gè)代碼文件所存放的目錄(見(jiàn)圖8-6)。cd~/catkin_ws/src/image_pkg/scripts/再執(zhí)行如下指令為代碼文件添加可執(zhí)行屬性。chmod+ximage_node.py圖8-6進(jìn)入目錄8.1.1在仿真環(huán)境中獲取機(jī)器人平面視覺(jué)圖像設(shè)置文件權(quán)限如圖8-7所示,按“Enter”鍵執(zhí)行后,這個(gè)代碼文件就獲得了可執(zhí)行屬性,可以在終端程序里運(yùn)行了。圖8-7設(shè)置文件權(quán)限8.1.1在仿真環(huán)境中獲取機(jī)器人平面視覺(jué)圖像3.編譯軟件包現(xiàn)在節(jié)點(diǎn)文件可以運(yùn)行了,但是這個(gè)軟件包還沒(méi)有加入ROS的包管理系統(tǒng),無(wú)法通過(guò)ROS指令運(yùn)行其中的節(jié)點(diǎn),因此還需要對(duì)這個(gè)軟件包進(jìn)行編譯。在終端程序中輸入如下指令進(jìn)入ROS工作空間(見(jiàn)圖8-8)。cd~/catkin_ws/再執(zhí)行如下指令對(duì)軟件包進(jìn)行編譯。catkin_make圖8-8進(jìn)入ROS工作空間8.1.1在仿真環(huán)境中獲取機(jī)器人平面視覺(jué)圖像編譯完成如圖8-9所示,這時(shí)就可以測(cè)試此節(jié)點(diǎn)了。圖8-9編譯完成8.1.1在仿真環(huán)境中獲取機(jī)器人平面視覺(jué)圖像4.啟動(dòng)仿真環(huán)境啟動(dòng)開(kāi)源項(xiàng)目“wpr_simulation”中的仿真場(chǎng)景(見(jiàn)圖8-10),打開(kāi)終端程序,輸入如下指令。roslaunchwpr_simulationwpb_single_face.launch啟動(dòng)后會(huì)彈出圖8-11所示的仿真場(chǎng)景,機(jī)器人前方站立著一個(gè)模型。8.1.1在仿真環(huán)境中獲取機(jī)器人平面視覺(jué)圖像圖8-10啟動(dòng)仿真場(chǎng)景圖8-11仿真場(chǎng)景8.1.1在仿真環(huán)境中獲取機(jī)器人平面視覺(jué)圖像5.運(yùn)行節(jié)點(diǎn)程序啟動(dòng)image_node節(jié)點(diǎn),如圖8-12所示,打開(kāi)一個(gè)新的終端程序,輸入如下指令。rosrunimage_pkgimage_node.py指令運(yùn)行后會(huì)在主目錄下生成一個(gè)新的jpg圖像文件,如果發(fā)現(xiàn)沒(méi)有新文件生成,那么請(qǐng)查看終端程序內(nèi)@符號(hào)前的用戶名和程序內(nèi)設(shè)置的保存路徑,將程序內(nèi)的用戶名更改成終端程序內(nèi)顯示的用戶名即可。保存圖片文件如圖8-13所示。8.1.1在仿真環(huán)境中獲取機(jī)器人平面視覺(jué)圖像圖8-12啟動(dòng)image_node節(jié)點(diǎn)圖8-13保存圖片文件8.1.2在真實(shí)環(huán)境中獲取機(jī)器人平面視覺(jué)圖像這里的程序可以在啟智ROS機(jī)器人上運(yùn)行,具體步驟如下。(1)根據(jù)啟智ROS的實(shí)驗(yàn)指導(dǎo)書對(duì)運(yùn)行環(huán)境和驅(qū)動(dòng)源碼包進(jìn)行配置。(2)連接好設(shè)備上的硬件。(3)把本章所創(chuàng)建的源碼包“image_pkg”復(fù)制到機(jī)載計(jì)算機(jī)的“~/catkin_ws/src”目錄下進(jìn)行編譯。(4)打開(kāi)機(jī)器人底盤上的電源開(kāi)關(guān)(按下去)。8.1.2在真實(shí)環(huán)境中獲取機(jī)器人平面視覺(jué)圖像(5)使用機(jī)載計(jì)算機(jī)打開(kāi)終端程序,輸入如下指令。roslaunchwpb_home_bringupkinect_test.launch(6)啟動(dòng)image_node節(jié)點(diǎn)。保持前面的程序繼續(xù)運(yùn)行別退出,打開(kāi)一個(gè)新的終端程序,運(yùn)行如下指令。rosrunimage_pkgimage_node.py按“Enter”鍵運(yùn)行后,即可在機(jī)器人主目錄下看到所獲取的圖像文件。8.2利用平面視覺(jué)進(jìn)行人臉檢測(cè)8.2.1在仿真環(huán)境中實(shí)現(xiàn)人臉檢測(cè)1.編寫節(jié)點(diǎn)代碼首先需要?jiǎng)?chuàng)建一個(gè)ROS源碼包Package。在Ubuntu里打開(kāi)一個(gè)終端程序,輸入如下指令進(jìn)入ROS工作空間(見(jiàn)圖8-14)。cdcatkin_ws/src/圖8-14進(jìn)入ROS工作空間8.2.1在仿真環(huán)境中實(shí)現(xiàn)人臉檢測(cè)然后輸入如下指令創(chuàng)建ROS源碼包。catkin_create_pkgface_pkgrospystd_msgssensor_msgscv_bridge按“Enter”鍵創(chuàng)建face_pkg源碼包如圖8-15所示,系統(tǒng)會(huì)提示ROS源碼包創(chuàng)建成功,這時(shí)可以看到“catkin_ws/src”目錄下出現(xiàn)了“face_pkg”子目錄。創(chuàng)建face_pkg源碼包的指令含義,如表8-2所示。接下來(lái)在VisualStudioCode中進(jìn)行操作,將目錄展開(kāi),找到前面新建的“image_pkg”并展開(kāi),可以看到這是一個(gè)功能包最基礎(chǔ)的結(jié)構(gòu),選中“image_pkg”并右擊,彈出圖8-16所示的快捷菜單,選擇“新建文件夾”。8.2.1在仿真環(huán)境中實(shí)現(xiàn)人臉檢測(cè)圖8-15創(chuàng)建face_pkg源碼包圖8-16快捷菜單8.2.1在仿真環(huán)境中實(shí)現(xiàn)人臉檢測(cè)指令含義catkin_create_pkg創(chuàng)建ROS源碼包(Package)的指令face_pkg新建的ROS源碼包命名rospyPython依賴項(xiàng),因?yàn)楸纠淌褂肞ython編寫,所以需要這個(gè)依賴項(xiàng)std_msgs標(biāo)準(zhǔn)消息依賴項(xiàng),需要里面的String格式做文字輸出sensor_msgs傳感器消息依賴項(xiàng),需要里面的圖像數(shù)據(jù)格式cv_bridgeROS圖像格式轉(zhuǎn)換到OpenCV圖像格式的依賴項(xiàng)表8-2創(chuàng)建face_pkg源碼包的指令含義8.2.1在仿真環(huán)境中實(shí)現(xiàn)人臉檢測(cè)將這個(gè)文件夾命名為“scripts”(見(jiàn)圖8-17)。在第2章的2.3節(jié)中,有對(duì)此名稱文件夾的解釋。命名成功后按“Enter”鍵即創(chuàng)建成功。選中此文件夾并對(duì)其右擊,彈出圖8-16所示的快捷菜單,選擇“新建文件”。將這個(gè)Python節(jié)點(diǎn)文件命名為“face_node.py”。圖8-17創(chuàng)建“scripts”文件夾8.2.1在仿真環(huán)境中實(shí)現(xiàn)人臉檢測(cè)命名完成后即可在IDE右側(cè)開(kāi)始編寫“face_node.py”的代碼,其內(nèi)容如下。#!/usr/bin/envpython3#coding=utf-8importrospyimportcv2fromsensor_msgs.msgimportImagefromcv_bridgeimportCvBridge,CvBridgeError#彩色圖像回調(diào)函數(shù)defcbImage(msg):bridge=CvBridge()cv_image=bridge.imgmsg_to_cv2(msg,"bgr8")#轉(zhuǎn)換為灰度圖

gray_img=cv2.cvtColor(cv_image,cv2.COLOR_BGR2GRAY)8.2.1在仿真環(huán)境中實(shí)現(xiàn)人臉檢測(cè)

#創(chuàng)建一個(gè)級(jí)聯(lián)分類器

face_casecade=cv2.CascadeClassifier('/home/robot/catkin_ws/src/wpb_home/wpb_home_python/config/haarcascade_frontalface_alt.xml’)

#人臉檢測(cè)

face=face_casecade.detectMultiScale(gray_img,1.3,5)for(x,y,w,h)inface:#在原圖上繪制矩形

cv2.rectangle(cv_image,(x,y),(x+w,y+h),(0,0,255),3)rospy.loginfo("人臉位置=(%d,%d)",x,y)#彈出窗口顯示圖片

cv2.imshow("facewindow",cv_image)cv2.waitKey(1)8.2.1在仿真環(huán)境中實(shí)現(xiàn)人臉檢測(cè)#主函數(shù)if__name__=="__main__":rospy.init_node("image_face_detect")#訂閱機(jī)器人視覺(jué)傳感器kinect2的圖像話題

image_sub=rospy.Subscriber("/kinect2/hd/image_color_rect",Image,cbImage,queue_size=10)rospy.spin()(1)代碼的開(kāi)始部分,使用Shebang符號(hào)指定這個(gè)Python文件的解釋器為python3。如果是Ubuntu18.04或更早的版本,解釋器可設(shè)為python。(2)第二句代碼指定該文件的字符編碼為utf-8,這樣就能在代碼執(zhí)行的時(shí)候顯示中文字符。8.2.1在仿真環(huán)境中實(shí)現(xiàn)人臉檢測(cè)(3)使用import導(dǎo)入以下五個(gè)模塊。①rospy模塊,包含了大部分的ROS接口函數(shù)。②cv2模塊,包含了OpenCV圖形處理庫(kù)的函數(shù)接口。③sensor_msgs.msg里的Image數(shù)據(jù)類型,這個(gè)是ROS里常用的圖形數(shù)據(jù)類型。④cv_bridge里的CvBridge,這個(gè)是ROS圖形數(shù)據(jù)格式和OpenCV圖像數(shù)據(jù)格式的轉(zhuǎn)換工具。⑤cv_bridge里的CvBridgeError,用于處理圖像格式轉(zhuǎn)換過(guò)程中的一些異常錯(cuò)誤。8.2.1在仿真環(huán)境中實(shí)現(xiàn)人臉檢測(cè)(4)定義一個(gè)回調(diào)函數(shù)cbImage(),用來(lái)處理kinect2獲取到的彩色視頻圖像。ROS每接收到一幀傳回來(lái)的彩色視頻圖像,就會(huì)自動(dòng)調(diào)用一次回調(diào)函數(shù)。圖像數(shù)據(jù)會(huì)以參數(shù)的形式傳遞到這個(gè)回調(diào)函數(shù)里。(5)回調(diào)函數(shù)cbImage()的參數(shù)msg是一個(gè)sensor_msgs::Image格式的消息包,其中存放著ROS格式的彩色圖像數(shù)據(jù)。在實(shí)際開(kāi)發(fā)中,通常不會(huì)直接使用這個(gè)格式的圖像,而是將其轉(zhuǎn)換成OpenCV格式,這樣就可以使用豐富的OpenCV函數(shù)來(lái)處理彩色圖像。(6)下面開(kāi)始這個(gè)轉(zhuǎn)換操作,先生成一個(gè)CvBridge對(duì)象,對(duì)象名為“bridge”;然后調(diào)用bridge的imgmsg_to_cv2()函數(shù),將參數(shù)msg里的圖像數(shù)據(jù)轉(zhuǎn)換成OpenCV的bgr8格式,并保存在對(duì)象cv_image中。8.2.1在仿真環(huán)境中實(shí)現(xiàn)人臉檢測(cè)(7)調(diào)用cv2的cvtColor()函數(shù)將彩色圖像cv_image轉(zhuǎn)換成黑白灰度圖,并存放在gray_img里。(8)調(diào)用cv2的CascadeClassifier()函數(shù)構(gòu)造一個(gè)級(jí)聯(lián)分類器,名字叫face_casecade。分類器的參數(shù)從一個(gè)xml文件里讀取,這個(gè)文件在另外的wpb_home源碼目錄中,這個(gè)源碼應(yīng)該在安裝系統(tǒng)時(shí)已經(jīng)部署好了,如果Ubuntu用戶名不為“robot”請(qǐng)將其更改為正確的用戶名。(9)調(diào)用face_casecade分類器的detectMultiScale()函數(shù),從黑白灰度圖gray_img中檢測(cè)人臉,并將檢測(cè)結(jié)果放置在face數(shù)組中。參數(shù)1.3是每次搜索人臉目標(biāo)的縮放比例,參數(shù)5是構(gòu)成目標(biāo)的相鄰矩形的最小個(gè)數(shù)。參數(shù)的具體意義可以查閱detectMultiScale()函數(shù)的官方說(shuō)明,這里使用這兩個(gè)數(shù)值就行。8.2.1在仿真環(huán)境中實(shí)現(xiàn)人臉檢測(cè)(10)使用for循環(huán)將face里的人臉檢測(cè)結(jié)果逐個(gè)提取出來(lái)。每個(gè)檢測(cè)結(jié)果包含如下數(shù)值。①x為人臉目標(biāo)在圖像中的橫向坐標(biāo)最小值,單位是像素,越小越靠近左側(cè)。②y為人臉目標(biāo)在圖像中的縱向坐標(biāo)最小值,單位是像素,越小越靠近上方。③w為人臉目標(biāo)的橫向?qū)挾?,單位是像素。④h為人臉目標(biāo)的縱向?qū)挾龋瑔挝皇窍袼?。?duì)于每一個(gè)人臉檢測(cè)結(jié)果,系統(tǒng)都會(huì)先調(diào)用cv2的rectangle()函數(shù)在彩色圖像cv_image上繪制一個(gè)對(duì)應(yīng)的矩形框;然后使用rospy.loginfo()函數(shù)將人臉位置矩形框的左上角坐標(biāo)值顯示在終端里。8.2.1在仿真環(huán)境中實(shí)現(xiàn)人臉檢測(cè)(11)在彩色圖像cv_image上繪制好所有的人臉目標(biāo)框后,調(diào)用cv2的imshow()函數(shù)將帶有人臉框的cv_image顯示在一個(gè)獨(dú)立窗口中,窗口的標(biāo)題名稱為“facewindow”。(12)判斷__name__為“__main__”時(shí),執(zhí)行這個(gè)文件的主函數(shù)代碼。(13)調(diào)用rospy的init_node()函數(shù)進(jìn)行該節(jié)點(diǎn)的初始化操作,參數(shù)是節(jié)點(diǎn)名稱。(14)調(diào)用rospy的Subscriber()函數(shù)生成一個(gè)訂閱對(duì)象image_sub,在函數(shù)的參數(shù)中指明訂閱的話題名稱是“/kinect2/hd/image_color_rect”,也就是kinect2發(fā)布彩色圖像視頻的話題,數(shù)據(jù)類型為Image,回調(diào)函數(shù)設(shè)置為之前定義的cbImage(),緩沖長(zhǎng)度為10。8.2.1在仿真環(huán)境中實(shí)現(xiàn)人臉檢測(cè)(15)調(diào)用rospy的spin()函數(shù)對(duì)這個(gè)主函數(shù)進(jìn)行阻塞,保持這個(gè)節(jié)點(diǎn)程序不會(huì)結(jié)束退出。程序編寫完后,代碼并未馬上保存到文件里,此時(shí)編輯區(qū)左上角的文件名“image_node.py”右側(cè)有個(gè)白色小圓點(diǎn)(見(jiàn)圖8-18),這表示此文件并未保存。在按下“Ctrl+S”鍵進(jìn)行保存后,白色小圓點(diǎn)會(huì)變成關(guān)閉按鈕“×”。圖8-18文件未保存狀態(tài)8.2.1在仿真環(huán)境中實(shí)現(xiàn)人臉檢測(cè)2.設(shè)置可執(zhí)行權(quán)限由于這個(gè)代碼文件是新創(chuàng)建的,其默認(rèn)不帶有可執(zhí)行屬性,所以我們需要為其添加一個(gè)可執(zhí)行屬性才能讓它運(yùn)行起來(lái)。啟動(dòng)一個(gè)終端程序,輸入如下指令進(jìn)入這個(gè)代碼文件所存放的目錄(見(jiàn)圖8-19)。cd~/catkin_ws/src/face_pkg/scripts/圖8-19進(jìn)入目錄8.2.1在仿真環(huán)境中實(shí)現(xiàn)人臉檢測(cè)再執(zhí)行如下指令為代碼文件添加可執(zhí)行屬性。chmod+xface_node.py設(shè)置文件權(quán)限如圖8-20所示,按“Enter”鍵執(zhí)行后,這個(gè)代碼文件就獲得了可執(zhí)行屬性,可以在終端程序里運(yùn)行了。圖8-20設(shè)置文件權(quán)限8.2.1在仿真環(huán)境中實(shí)現(xiàn)人臉檢測(cè)3.編譯軟件包現(xiàn)在節(jié)點(diǎn)文件可以運(yùn)行了,但是這個(gè)軟件包還沒(méi)有加入ROS的包管理系統(tǒng),無(wú)法通過(guò)ROS指令運(yùn)行其中的節(jié)點(diǎn),因此還需要對(duì)這個(gè)軟件包進(jìn)行編譯

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論