版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
ROS應(yīng)用開發(fā)技術(shù)1.機器人感知-ROS中的圖像01機器視覺02cv_bridge目錄CONTENTS機器視覺機器視覺介紹機器視覺是一項運用攝像頭、傳感器等先進設(shè)備來捕獲圖像或視頻數(shù)據(jù)的技術(shù)。通過精心設(shè)計的算法和模型,這些數(shù)據(jù)得以被深入分析和精確理解,從而實現(xiàn)高效的圖像和視頻處理。應(yīng)用領(lǐng)域農(nóng)業(yè)領(lǐng)域安防監(jiān)控助力車輛實現(xiàn)精準(zhǔn)的環(huán)境感知和自動導(dǎo)航,提升駕駛的安全性和效率。幫助農(nóng)民更精準(zhǔn)地監(jiān)測農(nóng)作物生長和檢測病蟲害,提升了農(nóng)業(yè)生產(chǎn)效率。工業(yè)自動化自動駕駛幫助實現(xiàn)身份驗證、門禁控制等任務(wù),提高了安全性和便利性。提供智能的解決方案,實時識別異常行為或物體,提升安全性。助力完成質(zhì)量控制、產(chǎn)品檢測和物體識別等任務(wù),提高生產(chǎn)效率和產(chǎn)品精度。幫助醫(yī)生更快速、更準(zhǔn)確地分析醫(yī)學(xué)影像,為疾病診斷和治療計劃制定提供支持。人臉識別醫(yī)療ROS中的圖像數(shù)據(jù)格式主要圖像數(shù)據(jù)格式是sensor_msgs/Image消息類型header字段提供圖像數(shù)據(jù)的時間戳和坐標(biāo)系信息height和width字段分別表示圖像的高度和寬度,單位是像素encoding字段指定了圖像像素的編碼方式,比如RGB8、BGR8或MONO8等創(chuàng)建編碼step字段表示一行像素在內(nèi)存中的字節(jié)數(shù),通常是圖像的寬度乘以每個像素的字節(jié)數(shù)data字段是一個字節(jié)數(shù)組,它存儲了圖像的像素值。圖像數(shù)據(jù)的處理和分析ROS主要圖像數(shù)據(jù)格式了解了這些圖像數(shù)據(jù)的組成部分后,我們就可以更好地處理和分析這些數(shù)據(jù)了,例如進行圖像處理算法、目標(biāo)檢測、圖像識別等應(yīng)用。文件創(chuàng)建OpenCV提供了C++和Python等多種編程語言的接口,方便在常用的編程語言中調(diào)用OpenCV進行圖像處理工作。OpenCV庫多語言接口GUI系統(tǒng)cdsOpenCV對商業(yè)應(yīng)用和非商業(yè)應(yīng)用都是免費的,因此在產(chǎn)品開發(fā)中也可以選擇使用OpenCV來完成圖像處理任務(wù)。免費使用cdrobot_vOpenCV是一個開放的機器視覺處理庫,可以跨平臺完成機器視覺處理工作。OpenCV還提供了一個簡單的GUI系統(tǒng),用于實現(xiàn)可視化顯示,幫助更直觀地展示圖像處理的結(jié)果。在ROS中安裝OpenCV在ROS中安裝OpenCV也非常簡單,只需使用apt-getinstall命令即可完成OpenCV的安裝。sudoapt-getinstallros-kinetic-vision-opencvlibopencv-devpython-opencvcv_bridgecv_bridge介紹cv_bridge是一個通用的庫,用于在ROS和OpenCV之間進行圖像數(shù)據(jù)的轉(zhuǎn)換。cv_bridge提供了一系列的函數(shù)和類,可以將ROS中的圖像消息轉(zhuǎn)換為OpenCV格式的圖像,或者將OpenCV處理過后的圖像轉(zhuǎn)換為ROS格式的圖像消息,以便在ROS節(jié)點之間傳輸。功能介紹將OpenCV圖像轉(zhuǎn)換為ROS圖像消息將ROS圖像消息轉(zhuǎn)換為OpenCV圖像實現(xiàn)ROS節(jié)點之間的圖像傳輸ROS應(yīng)用開發(fā)技術(shù)2.機器人感知-cv_bring庫01準(zhǔn)備工作02文件編寫03效果展示目錄CONTENTS準(zhǔn)備工作功能包創(chuàng)建060402050301sensor_msgsstd_msgs包含傳感器數(shù)據(jù)的消息定義image_transportrospyROS的C++客戶端庫用于在OpenCV圖像和ROS圖像消息之間進行轉(zhuǎn)換的包在工作空間的src文件夾下新建一個功能包robot_vision,該功能包將專門用于我們的機器視覺實驗catkin_create_pkgrobot_visioncv_bridgeimage_transportroscpprospysensor_msgsstd_msgsroscpp包含標(biāo)準(zhǔn)消息定義,如字符串、浮點數(shù)、整數(shù)等cv_bridge用于發(fā)布和訂閱圖像數(shù)據(jù)的包,它處理圖像的傳輸和壓縮ROS的Python客戶端庫usb_cam功能包下載ros無法直接打開usb外接攝像頭,所以需要通過usb_cam功能包幫助進行攝像頭的連接sudoapt-getinstallros-melodic-usb-camusb_cam-test.launch文件代碼<launch><nodename="usb_cam"pkg="usb_cam"type="usb_cam_node"output="screen"><paramname="video_device"value="/dev/video0"/><paramname="image_width"value="640"/><paramname="image_height"value="480"/><paramname="pixel_format"value="yuyv"/><paramname="camera_frame_id"value="usb_cam"/><paramname="io_method"value="mmap"/></node><nodename="image_view"pkg="image_view"type="image_view"respawn="false"output="screen"><remapfrom="image"to="/usb_cam/image_raw"/><paramname="autosize"value="true"/></node></launch>usb_cam功能包下載ROS開發(fā)者為我們提供了與OpenCV的接口功能包——cv_bridge。我們可以通過該功能包將ROS中的圖像數(shù)據(jù)轉(zhuǎn)換成OpenCV格式的圖像,并且調(diào)用OpenCV庫進行各種圖像處理sudoapt-getinstallros-melodic-vision-opencvlibopencv-devpython-opencv文件編寫文件創(chuàng)建mkdirscriots進入robot_vision功能包創(chuàng)建scripts文件夾編寫cv_bridge_test.py文件cdscriots進入scripts文件夾cdrobot_visionvicv_bridge_test.py文件內(nèi)容importrospyimportcv2fromcv_bridgeimportCvBridge,CvBridgeErrorfromsensor_msgs.msgimportImageclassimage_converter:def__init__(self):#創(chuàng)建cv_bridge,聲明圖像的發(fā)布者和訂閱者self.image_pub=rospy.Publisher("cv_bridge_image",Image,queue_size=1)self.bridge=CvBridge()self.image_sub=rospy.Subscriber("/usb_cam/image_raw",Image,self.callback)defcallback(self,data):#使用cv_bridge將ROS的圖像數(shù)據(jù)轉(zhuǎn)換成OpenCV的圖像格式try:cv_image=self.bridge.imgmsg_to_cv2(data,"bgr8")exceptCvBridgeErrorase:print(e)文件內(nèi)容#在opencv的顯示窗口中繪制一個圓,作為標(biāo)記(rows,cols,channels)=cv_image.shapeifcols>60androws>60:cv2.circle(cv_image,(60,60),30,(0,0,255),-1)#顯示Opencv格式的圖像cv2.imshow("Imagewindow",cv_image)cv2.waitKey(3)#再將opencv格式額數(shù)據(jù)轉(zhuǎn)換成rosimage格式的數(shù)據(jù)發(fā)布try:self.image_pub.publish(self.bridge.cv2_to_imgmsg(cv_image,"bgr8"))exceptCvBridgeErrorase:print(e)文件內(nèi)容if__name__=='__main__':try:#初始化ros節(jié)點rospy.init_node("cv_bridge_test")rospy.loginfo("Startingcv_bridge_testnode")image_converter()rospy.spin()exceptKeyboardInterrupt:print("Shuttingdowncv_bridge_testnode.")cv2.destroyAllWindows()usb_cam.launch編寫<launch><nodename="usb_cam"pkg="usb_cam"type="usb_cam_node"output="screen"><paramname="video_device"value="/dev/video0"/><paramname="image_width"value="640"/><paramname="image_height"value="480"/><paramname="pixel_format"value="yuyv"/><paramname="camera_frame_id"value="usb_cam"/><paramname="io_method"value="mmap"/></node></launch>返回功能包命令,創(chuàng)建scripts文件夾,編寫usb_cam.launch效果展示結(jié)果展示020301連接攝像頭roslaunchrobot_visionusb_cam.launchrqt_image_view啟動Python腳本啟動RQT工具rosrunrobot_visioncv_bridge_test.pyROS應(yīng)用開發(fā)技術(shù)3.機器人感知-OpenCV學(xué)習(xí)(上)01圖像處理目錄CONTENTS圖像處理學(xué)習(xí)任務(wù)03010204借助OpenCV庫實現(xiàn)圖像的讀取運用高斯模糊濾波器對圖像中的噪聲進行消除拓展功能執(zhí)行邊緣檢測等操作以優(yōu)化圖像質(zhì)量范圍提取圖像中的關(guān)鍵特征圖像讀取importcv2img=cv2.imread("0.jpg")cv2.imshow("name",img)cv2.waitKey()cv2.destroyAllWindows()傅里葉變換傅里葉變換由18世紀(jì)法國數(shù)學(xué)家傅里葉提出,它認(rèn)為信號可由波形描述。在圖像處理中,利用傅里葉變換分析圖像信號強弱,標(biāo)記不同區(qū)域。圖像由多頻率信號組成,分離頻率有助于理解圖像并提取數(shù)據(jù)。傅里葉變換在圖像處理中重要,助力深入理解與分析。高通濾波器importcv2importnumpyasnpimg=cv2.imread("0.jpg",0)blurred=cv2.GaussianBlur(img,(17,17),0)#模糊濾波器,是一個削弱高頻信號強度的濾波器(去噪音)g_hpf=img-blurredcv2.imshow("g_hpf",g_hpf)cv2.waitKey()cv2.destroyAllWindows()邊緣檢測介紹邊緣檢測通過識別圖像中的灰度突變確定物體邊界,常用于識別和分析圖像內(nèi)容。常用的邊緣檢測算法包括Sobel、Prewitt和Canny。進行邊緣檢測能提取物體輪廓信息,助力形狀識別和目標(biāo)檢測等任務(wù),廣泛應(yīng)用于圖像分割和特征提取。圖像讀取importcv2
img=cv2.imread("0.jpg",0)cv2.imwrite("canny.jpg",cv2.Canny(img,200,300))cv2.imshow("canny",cv2.imread("canny.jpg"))cv2.waitKey()cv2.destroyAllWindows()ROS應(yīng)用開發(fā)技術(shù)3.機器人感知-OpenCV學(xué)習(xí)(下)01圖像處理目錄CONTENTS圖像處理學(xué)習(xí)任務(wù)圓檢測直線檢測人臉檢測直線檢測importcv2importnumpyasnpimg=cv2.imread('0.jpg')gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)edges=cv2.Canny(gray,50,120)#畫邊minLineLength=20#最小直線長度maxLineGap=5#最大線段間隙#霍夫變換直線檢測(HoughLinesP)#1:需要處理的圖像#2,3:線段的幾何表示#4:閾值lines=cv2.HoughLinesP(edges,1,np.pi/180,20,minLineLength,maxLineGap)forx1,y1,x2,y2inlines[0]:cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2)
cv2.imshow("edges",edges)cv2.waitKey()cv2.destroyAllWindows()圓檢測importcv2importnumpyasnpplanets=cv2.imread('planet_glow.jpg')gray_img=cv2.cvtColor(planets,cv2.COLOR_BGR2GRAY)#中值濾波基于排序統(tǒng)計理論的一種能夠有效抑制噪聲的非線性信號處理技術(shù)img=cv2.medianBlur(gray_img,5)#顏色轉(zhuǎn)換cimg=cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)#霍夫圓環(huán)檢測circles=cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,120,param1=100,param2=30,minRadius=0,maxRadius=0)circles=np.uint16(np.around(circles))foriincircles[0,:]:cv2.circle(planets,(i[0],i[1]),i[2],(0,255,0),2)cv2.circle(planets,(i[0],i[1]),2,(0,0,255),3)cv2.imwrite("planets_circles.jpg",planets)cv2.imshow("Houghcircles",planets)cv2.waitKey()cv2.destroyAllWindows()級聯(lián)在人臉檢測中,級聯(lián)的概念至關(guān)重要,它可以根據(jù)給定的圖像,為不同大小的區(qū)域生成相應(yīng)的特征集合。尤為值得一提的是,Haar級聯(lián)具備尺度不變性,這意味著在圖像尺度發(fā)生變化時,它仍能保持穩(wěn)健的性能,從而確保人臉檢測的準(zhǔn)確性和可靠性。此外,Haar級聯(lián)還提供了xml文件,這些文件包含了預(yù)先訓(xùn)練好的人臉檢測模型人臉檢測importcv2importsysimagePath="1.png"cascPath="haarcascade_frontalface_default.xml"#創(chuàng)建haar級聯(lián)faceCascade=cv2.CascadeClassifier(cascPath)#讀取圖片image=cv2.imread(imagePath)gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)#檢測圖片faces=faceCascade.detectMultiScale(gray,scaleFactor=1.1,minNeighbors=5,minSize=(30,30))print("發(fā)現(xiàn){0}臉!".format(len(faces)))for(x,y,w,h)infaces:cv2.rectangle(image,(x,y),(x+w,y+h),(0,255,0),2)cv2.imshow("Facesfound",image)cv2.waitKey(0)ROS應(yīng)用開發(fā)技術(shù)4.機器人感知-二維碼識別01OpenCVS識別二維碼02二維碼生成目錄CONTENTSOpenCVS識別二維碼庫安裝與二維碼識別020301安裝庫pipinstallnumpypipinstallpyzbarimg=cv2.imread('1.jpg')forbarcodeindecode(img):myData=barcode.data.decode('utf-8)print(myData)導(dǎo)入庫文件二維碼識別importcv2importnumpyasnpfrompyzbar.pyzbarimportdecodeROS攝像頭來識別圖片二維碼importcv2importnumpyasnpfrompyzbar.pyzbarimportdecodecap=cv2.VideoCapture(0)cap.set(3,640)cap.set(4,480)whileTrue:success,img=cap.read()forbarcodeindecode(img):myData=barcode.data.decode('utf-8')print(myData)pts=np.array([barcode.polygon],32)pts=pts.reshape((-1,1,2))cv2.polylines(img,[pts],True,(255,0,255),5)
pts2=barcode.rectcv2.putText(img,myData,(pts2[0],pts2[1]),cv2.FONT_HERSHEY_SIMPLEX,0.9,(255,0,255),2)cv2.imshow('Result',img)cv2.waitKey(1)二維碼生成下載安裝ar_track_alvar功能包sudoapt-getinstallros-melodic-ar-track-alvar安裝完成后,在ROS默認(rèn)安裝路徑下(/opt/ros/melodic/share)找到該功能包并進入launch文件夾,可以看到很多個launch文件。這些都是針對PR2機器人使用的二維碼識別例程二維碼創(chuàng)建020301指定AR_ID為0rosrunar_track_alvarcreateMarkerrosrunar_track_alvarcreateMarkerAR_ID參數(shù)查看創(chuàng)建二維碼標(biāo)簽rosrunar_track_alvarcreateMarker0攝像頭識別二維碼<launch><nodepkg="tf"type="static_transform_publisher"name="world_to_cam"args="000.501.570worldusb_cam10"/>
<argname="marker_size"default="5"/><argname="max_new_marker_error"default="0.08"/><argname="max_track_error"default="0.2"/><argname="cam_image_topic"default="/usb_cam/image_raw"/><argname="cam_info_topic"default="/usb_cam/camera_info"/><argname="output_frame"default="/usb_cam"/>
<nodename="ar_track_alvar"pkg="ar_track_alvar"type="individualMarkersNoKinect"respawn="false"output="screen">在robot_vision功能包launch文件下編寫ar_track_camera.launch攝像頭識別二維碼<paramname="marker_size"type="double"value="$(argmarker_size)"/><paramname="max_new_marker_error"type="double"value="$(argmax_new_marker_error)"/><paramname="max_track_error"type="double"value="$(argmax_track_error)"/><paramname="output_frame"type="string"value="$(argoutput_frame)"/><remapfrom="camera_image"to="$(argcam_image_topic)"/><remapfrom="camera_info"to="$(argcam_info_topic)"/></node><!--rvizview/--><nodepkg="rviz"type="rviz"name="rviz"args="-d$(findrobot_vision)/config/ar_track_camera.rviz"/></launch>在robot_vision功能包launch文件下編寫ar_track_camera.launch文件功能描述設(shè)置individualMarkerNoKinect節(jié)點所需要的參數(shù),主要是訂閱圖像數(shù)據(jù)的話題名,還有使用二維碼的實際尺寸,單位是厘米設(shè)置world與camera之間的坐標(biāo)變換啟動rviz界面,將識別結(jié)果可視化文件啟動roslaunchrobot_visionusb_cam_with_calibration.launch啟動AR標(biāo)記物跟蹤和攝像頭相關(guān)節(jié)點roslaunchrobot_visionar_track_camera.launch配置并啟動帶有校準(zhǔn)的USB攝像頭ROS應(yīng)用開發(fā)技術(shù)5.機器人感知-人臉識別01人臉識別介紹與步驟02代碼生成目錄CONTENTS人臉識別介紹與步驟Launch文件概念人臉識別是指一種通過計算機程序,能夠自動識別給定圖像或視頻流中人臉的技術(shù)。這種技術(shù)基于計算機視覺和模式識別的原理,可以實現(xiàn)對人臉的準(zhǔn)確檢測、定位和識別,具有廣泛的應(yīng)用前景。OpenCV人臉識別方法通過cv2.face.createFisherFaceRecognizer()創(chuàng)建,它基于線性判別分析(LDA)技術(shù),旨在尋找能最大化類間差異并最小化類內(nèi)差異的投影方向,以實現(xiàn)更為精確的人臉識別。FisherFaces借助cv2.face.createLBPHFaceRecognizer()創(chuàng)建,它利用局部二值模式(LBP)描述圖像的局部紋理特征,并通過直方圖統(tǒng)計這些特征來構(gòu)建人臉模型,進而完成人臉識別任務(wù)。使用cv2.face.createEigenFaceRecognizer()創(chuàng)建,它基于主成分分析(PCA)來構(gòu)建人臉的向量空間模型,進而實現(xiàn)人臉的識別。局部二值模式直方圖Eigenfaces人臉識別步驟準(zhǔn)備訓(xùn)練數(shù)據(jù)測試讀取每個人或主體的訓(xùn)練圖像及其標(biāo)簽,從每個圖像中檢測人臉并為每個檢測到的人臉分配其所屬人員的整數(shù)標(biāo)簽訓(xùn)練OpenCV的LBPH人臉識別器,為其提供我們在步驟1中準(zhǔn)備的數(shù)據(jù)訓(xùn)練人臉識別器將一些測試圖像傳遞給人臉識別器,并查看它是否能夠正確預(yù)測它們代碼生成數(shù)據(jù)準(zhǔn)備Haar級聯(lián)分類器文件可以直接復(fù)制OpenCV源代碼中訓(xùn)練好的Haar級聯(lián)分類器文件。我們只需要人臉標(biāo)記文件haarcascade_frontalface_alt.xml和側(cè)臉檢測文件haarcascade_profileface.xml代碼內(nèi)容importcv2importosimportnumpyasnpfromPILimportImage,ImageDraw,ImageFontsubjects=["","RamizRaja","catking"]defdetect_face(img):gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)face_cascade=cv2.CascadeClassifier('opencv-files/lbpcascade_frontalface.xml')faces=face_cascade.detectMultiScale(gray,scaleFactor=1.2,minNeighbors=5)if(len(faces)==0):returnNone,None(x,y,w,h)=faces[0]returngray[y:y+w,x:x+h],faces[0]代碼內(nèi)容defprepare_training_data(data_folder_path):dirs=os.listdir(data_folder_path)faces=[]labels=[]fordir_nameindirs:ifnotdir_name.startswith("s"):continue;label=int(dir_name.replace("s",""))subject_dir_path=data_folder_path+"/"+dir_namesubject_images_names=os.listdir(subject_dir_path)forimage_nameinsubject_images_names:ifimage_name.startswith("."):continue;image_path=subject_dir_path+"/"+image_nameimage=cv2.imread(image_path)cv2.imshow("Trainingonimage...",cv2.resize(image,(400,500)))cv2.waitKey(100)face,rect=detect_face(image)代碼內(nèi)容defprepare_training_data(data_folder_path):dirs=os.listdir(data_folder_path)faces=[]labels=[]fordir_nameindirs:ifnotdir_name.startswith("s"):continue;label=int(dir_name.replace("s",""))subject_dir_path=data_folder_path+"/"+dir_namesubject_images_names=os.listdir(subject_dir_path)forimage_nameinsubject_images_names:ifimage_name.startswith("."):continue;image_path=subject_dir_path+"/"+image_nameimage=cv2.imread(image_path)cv2.imshow("Trainingonimage...",cv2.resize(image,(400,500)))cv2.waitKey(100)face,rect=detect_face(image)代碼內(nèi)容defpredict(test_img):img=test_imgface,rect=detect_face(img)label,confidence=face_recognizer.predict(face)print(confidence)label_text=subjects[label]draw_rectangle(img,rect)frame_cv2=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)frame_pil=Image.fromarray(frame_cv2)#轉(zhuǎn)為PIL的圖片格式draw=ImageDraw.Draw(frame_pil)font=ImageFont.truetype("simhei.ttf",20,encoding="utf-8")ImageDraw.Draw(frame_pil).text((100,20),label_text,(0,0,255),font)frame_cv2=cv2.cvtColor(np.array(frame_pil),cv2.COLOR_RGB2BGR)returnframe_cv2代碼內(nèi)容test_img1=cv2.imread("test-data/1.jpg")predicted_img1=predict(test_img1)print("Predictioncomplete")cv2.imshow(subjects[1],predicted_img1)cv2.waitKey(0)cv2.destroyAllWindows()ROS應(yīng)用開發(fā)技術(shù)6.機器人感知-人臉標(biāo)記01代碼編寫02人臉標(biāo)記目錄CONTENTS代碼編寫face_detector.py文件編寫importrospyimportcv2importnumpyasnpfromsensor_msgs.msgimportImage,RegionOfInterestfromcv_bridgeimportCvBridge,CvBridgeErrorclassfaceDetector:def__init__(self):rospy.on_shutdown(self.cleanup);self.bridge=CvBridge()self.image_pub=rospy.Publisher("cv_bridge_image",Image,queue_size=1)cascade_1=rospy.get_param("~cascade_1","")cascade_2=rospy.get_param("~cascade_2","")self.cascade_1=cv2.CascadeClassifier(cascade_1)self.cascade_2=cv2.CascadeClassifier(cascade_2)self.haar_scaleFactor=rospy.get_param("~haar_scaleFactor",1.2)self.haar_minNeighbors=rospy.get_param("~haar_minNeighbors",2)self.haar_minSize=rospy.get_param("~haar_minSize",40)self.haar_maxSize=rospy.get_param("~haar_maxSize",60)進入robot_vision功能包scripts目錄下,編寫face_detector.pyface_detector.py文件編寫self.color=(50,255,50)self.image_sub=rospy.Subscriber("input_rgb_image",Image,self.image_callback,queue_size=1)defimage_callback(self,data):try:cv_image=self.bridge.imgmsg_to_cv2(data,"bgr8")frame=np.array(cv_image,dtype=np.uint8)excepte:print(e)grey_image=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)grey_image=cv2.equalizeHist(grey_image)faces_result=self.detect_face(grey_image)iflen(faces_result)>0:forfaceinfaces_result:x,y,w,h=facecv2.rectangle(cv_image,(x,y),(x+w,y+h),self.color,2)self.image_pub.publish(self.bridge.cv2_to_imgmsg(cv_image,"bgr8"))進入robot_vision功能包scripts目錄下,編寫face_detector.pyface_detector.py文件編寫defdetect_face(self,input_image):#首先匹配正面人臉的模型ifself.cascade_1:faces=self.cascade_1.detectMultiScale(input_image,self.haar_scaleFactor,self.haar_minNeighbors,cv2.CASCADE_SCALE_IMAGE,(self.haar_minSize,self.haar_maxSize))
#如果正面人臉匹配失敗,那么就嘗試匹配側(cè)面人臉的模型iflen(faces)==0andself.cascade_2:faces=self.cascade_2.detectMultiScale(input_image,self.haar_scaleFactor,self.haar_minNeighbors,cv2.CASCADE_SCALE_IMAGE,(self.haar_minSize,self.haar_maxSize))
returnfaces進入robot_vision功能包scripts目錄下,編寫face_detector.pyface_detector.py文件編寫defcleanup(self):print("Shuttingdownvisionnode.")cv2.destroyAllWindows()if__name__=='__main__':try:#初始化ros節(jié)點rospy.init_node("face_detector")faceDetector()rospy.loginfo("Facedetectorisstarted..")rospy.loginfo("PleasesubscribetheROSimage.")rospy.spin()
exceptKeyboardInterrupt:print("Shuttingdownfacedetectornode.")cv2.destroyAllWindows()進入robot_vision功能包scripts目錄下,編寫face_detector.py添加執(zhí)行權(quán)限使用chmod命令為Python文件添加可執(zhí)行權(quán)限。sudochmoda+xface_detector.py注意我們現(xiàn)在并不是root用戶,所以在使用命令添加可執(zhí)行的權(quán)限時得在命令前加上sudo,否則我們的操作將無法生效。人臉標(biāo)記文件夾準(zhǔn)備03010204進入robot_vision功能包cd~/ArTrack_ws/src/robot_vision創(chuàng)建data文件夾mkdirdata進入data文件夾cddatamkdirhaardetectors創(chuàng)建haar_detectors文件夾分類器準(zhǔn)備Haar級聯(lián)分類器文件可以直接復(fù)制OpenCV源代碼中訓(xùn)練好的Haar級聯(lián)分類器文件。我們只需要人臉標(biāo)記文件haarcascade_frontalface_alt.xml和側(cè)臉檢測文件haarcascade_profileface.xml啟動文件編寫<launch><nodepkg="robot_vision"name="face_detector"type="face_detector.py"output="screen"><remapfrom="input_rgb_image"to="/usb_cam/image_raw"/><rosparam>haar_scaleFactor:1.2haar_minNeighbors:2haar_minSize:40haar_maxSize:60</rosparam><paramname="cascade_1"value="$(findrobot_vision)/data/haar_detectors/haarcascade_frontalface_alt.xml"/><paramname="cascade_2"value="$(findrobot_vision)/data/haar_detectors/haarcascade_profileface.xml"/></node></launch>進入robot_vision功能包launch目錄下,編寫face_detector.launch程序啟動020301攝像頭連接roslaunchrobot_visionusb_cam.launchrqt_image_view啟動launch文件啟動RQT工具roslaunchrobot_visionface_detector.launchROS應(yīng)用開發(fā)技術(shù)7.機器人感知-物體跟蹤01代碼編寫02物體跟蹤目錄CONTENTS代碼編寫motion_detector.py文件編寫importrospyimportcv2importnumpyasnpfromsensor_msgs.msgimportImage,RegionOfInterestfromcv_bridgeimportCvBridge,CvBridgeErrorclassmotionDetector:def__init__(self):rospy.on_shutdown(self.cleanup);self.bridge=CvBridge()self.image_pub=rospy.Publisher("cv_bridge_image",Image,queue_size=1)self.minArea=rospy.get_param("~minArea",500)self.threshold=rospy.get_param("~threshold",25)self.firstFrame=Noneself.text="Unoccupied"self.image_sub=rospy.Subscriber("input_rgb_image",Image,self.image_callback,queue_size=1)進入robot_vision功能包scripts目錄下,編寫motion_detector.pymotion_detector.py文件編寫defimage_callback(self,data):try:cv_image=self.bridge.imgmsg_to_cv2(data,"bgr8")frame=np.array(cv_image,dtype=np.uint8)exceptCvBridgeErrorase:print(e)gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)gray=cv2.GaussianBlur(gray,(21,21),0)ifself.firstFrameisNone:self.firstFrame=grayreturnframeDelta=cv2.absdiff(self.firstFrame,gray)thresh=cv2.threshold(frameDelta,self.threshold,255,cv2.THRESH_BINARY)[1]thresh=cv2.dilate(thresh,None,iterations=2)cnts,hierarchy=cv2.findContours(thresh.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)進入robot_vision功能包scripts目錄下,編寫motion_detector.pymotion_detector.py文件編寫forcincnts:#如果檢測到的區(qū)域小于設(shè)置值,則忽略ifcv2.contourArea(c)<self.minArea:continue#在輸出畫面上框出識別到的物體(x,y,w,h)=cv2.boundingRect(c)cv2.rectangle(frame,(x,y),(x+w,y+h),(50,255,50),2)self.text="Occupied"#在輸出畫面上打當(dāng)前狀態(tài)和時間戳信息cv2.putText(frame,"Status:{}".format(self.text),(10,20),cv2.FONT_HERSHEY_SIMPLEX,0.5,(0,0,255),2)#將識別后的圖像轉(zhuǎn)換成ROS消息并發(fā)布self.image_pub.publish(self.bridge.cv2_to_imgmsg(frame,"bgr8"))defcleanup(self):print("Shuttingdownvisionnode.")cv2.destroyAllWindows()進入robot_vision功能包scripts目錄下,編寫motion_detector.pymotion_detector.py文件編寫if__name__=='__main__':try:#初始化ros節(jié)點rospy.init_node("motion_detector")rospy.loginfo("motion_detectornodeisstarted...")rospy.loginfo("PleasesubscribetheROSimage.")motionDetector()rospy.spin()exceptKeyboardInterrupt:print("Shuttingdownmotiondetectornode.")cv2.destroyAllWindows()進入robot_vision功能包scripts目錄下,編寫motion_detector.py添加執(zhí)行權(quán)限使用chmod命令為Python文件添加可執(zhí)行權(quán)限。sudochmoda+xmotion_detector.py注意我們現(xiàn)在并不是root用戶,所以在使用命令添加可執(zhí)行的權(quán)限時得在命令前加上sudo,否則我們的操作將無法生效。物體跟蹤啟動文件編寫<launch><nodepkg="robot_vision"name="motion_detector"type="motion_detector.py"output="screen"><remapfrom="input_rgb_image"to="/usb_cam/image_raw"/><rosparam>minArea:500threshold:25</rosparam></node></launch>進入robot_vision功能包launch目錄下,編寫motion_detector.launch程序啟動020301攝像頭連接roslaunchrobot_visionusb_cam.launchrqt_image_view啟動launch文件啟動RQT工具roslaunchrobot_visionmotion_detector.launchROS應(yīng)用開發(fā)技術(shù)8.機器人感知-目標(biāo)檢測01目標(biāo)檢測02R-CNN和YOLO算法介紹目錄CONTENTS目標(biāo)檢測目標(biāo)檢測相關(guān)知識030102識別圖像中物體的類別識別物體并預(yù)測位置信息目標(biāo)檢測目標(biāo)檢測的相關(guān)知識包括圖像分類、圖像定位和目標(biāo)檢測本身。圖像定位圖像分類定位圖片中的多個目標(biāo)物體常見算法020103VGG,GOOGLENET,RESNET介紹了圖像分類、圖像定位和目標(biāo)檢測的常見算法。圖像定位算法RCNN,FastRCNN,FasterRCNN目標(biāo)檢測算法RCNN,FastRCNN,FasterRCNN,YOLO圖像分類算法人類與計算機的目標(biāo)檢測0102面對RGB像素組成的矩陣人類通過感知圖片中不同顏色模塊定位并分類目標(biāo)物體,而計算機面對的是RGB像素組成的矩陣。通過感知圖片中不同顏色模塊人類目標(biāo)檢測計算機目標(biāo)檢測傳統(tǒng)目標(biāo)檢測0201多尺度形變部件模型DPM滑動窗口框架效果優(yōu)秀但檢測速度慢傳統(tǒng)目標(biāo)檢測采用滑動窗口框架,包括候選區(qū)域生成、特征提取和分類器識別。三個核心步驟基于深度學(xué)習(xí)的目標(biāo)檢測0102目標(biāo)檢測算法轉(zhuǎn)變深度學(xué)習(xí)模型優(yōu)化后,基于深度學(xué)習(xí)的目標(biāo)檢測算法超越了傳統(tǒng)算法。從傳統(tǒng)算法轉(zhuǎn)向深度學(xué)習(xí)奠定深度學(xué)習(xí)目標(biāo)檢測基礎(chǔ)R-CNN主流目標(biāo)檢測算法0201two-stage檢測算法主流目標(biāo)檢測算法分為two-stage和one-stage檢測算法。R-CNN、SPPNET、FastR-CNN、FasterR-CNNone-stage檢測算法SSD、YOLO、FPNR-CNN和YOLO算法介紹R-CNNR-CNN全稱是帶卷積神經(jīng)網(wǎng)絡(luò)特征的區(qū)域,是一種用于目標(biāo)檢測的深度學(xué)習(xí)模型。它是目標(biāo)檢測領(lǐng)域的重要里程碑,提出了一種基于區(qū)域的卷積神經(jīng)網(wǎng)絡(luò)方法,能夠有效地識別并定位圖像中的目標(biāo)物體。工作流程對于每個候選區(qū)域,使用預(yù)訓(xùn)練的卷積神經(jīng)網(wǎng)絡(luò)(如AlexNet、VGG等)提取特征特征提取對于每個候選區(qū)域,使用回歸器來微調(diào)邊界框的位置,以更準(zhǔn)確地擬合目標(biāo)的位置候選區(qū)域生成邊界框回歸使用選擇性搜索等算法生成數(shù)百到數(shù)千個候選區(qū)域,這些候選區(qū)域可能包含圖像中的目標(biāo)物體YOLOYOLO是一種快速而準(zhǔn)確的實時目標(biāo)檢測算法,與傳統(tǒng)的基于區(qū)域的方法不同,它采用了一種端到端的方式來同時預(yù)測圖像中所有目標(biāo)的類別和邊界框。YOLO特點03010204單次前向傳播YOLO將目標(biāo)檢測任務(wù)轉(zhuǎn)化為一個回歸問題,并通過單個卷積神經(jīng)網(wǎng)絡(luò)模型直接在整個圖像上進行預(yù)測網(wǎng)格劃分YOLO將圖像劃分為固定大小的網(wǎng)格,并每個網(wǎng)格負(fù)責(zé)預(yù)測包含該目標(biāo)的邊界框以及目標(biāo)的類別概率多尺度預(yù)測YOLO在多個不同層級的特征圖上進行目標(biāo)檢測預(yù)測,以便捕獲不同尺度的目標(biāo)YOLO使用自定義的損失函數(shù),綜合考慮了定位誤差和分類誤差,以確保同時精確地定位目標(biāo)位置和準(zhǔn)確地分類目標(biāo)損失函數(shù)設(shè)計ROS應(yīng)用開發(fā)技術(shù)9.機器人感知-目標(biāo)檢測案例01準(zhǔn)備工作與腳本編寫目錄CONTENTS準(zhǔn)備工作與腳本編寫準(zhǔn)備工作YOLO算法可用的類別名稱文件yolov3-320.cfgsyolov3.weights文件導(dǎo)入YOLO算法的配置文件YOLO算法權(quán)重文件目標(biāo)檢測腳本文件編寫importcv2ascvimportnumpyasnpfromPILimportImage,ImageDraw,ImageFontcap=cv.VideoCapture(0)whT=320confThreshold=0.5nmsThreshold=0.2#LOADMODEL#CocoNames#classesFile="s"classesFile="s"classNames=[]withopen(classesFile,'rt',encoding='utf-8')asf:classNames=f.read().rstrip('\n').split('\n')print(classNames)目標(biāo)檢測腳本文件編寫#ModelFilesmodelConfiguration="yolov3-320.cfg"modelWeights="yolov3.weights"#modelWeights="yolov3-tiny.weights"net=cv.dnn.readNetFromDarknet(modelConfiguration,modelWeights)net.setPreferableBackend(cv.dnn.DNN_BACKEND_OPENCV)net.setPreferableTarget(cv.dnn.DNN_TARGET_CPU)defcv2ImgAddText(img,text,left,top,textColor=(0,255,0),textSize=20):ifisinstance(img,np.ndarray):#判斷是否OpenCV圖片類型img=Image.fromarray(cv.cvtColor(img,cv.COLOR_BGR2RGB))draw=ImageDraw.Draw(img)#創(chuàng)建一個可以在給定圖像上繪圖的對象fontStyle=ImageFont.truetype("font/simhei.ttf",textSize,encoding="utf-8")#字體的格式draw.text((left,top),text,textColor,font=fontStyle)#繪制文本returncv.cvtColor(np.asarray(img),cv.COLOR_RGB2BGR)#轉(zhuǎn)換回OpenCV格式目標(biāo)檢測腳本文件編寫deffindObjects(outputs,img):hT,wT,cT=img.shapebbox=[]classIds=[]confs=[]foroutputinoutputs:fordetinoutput:scores=det[5:]#根據(jù)得分獲取IDclassId=np.argmax(scores)confidence=scores[classId]ifconfidence>confThreshold:w,h=int(det[2]*wT),int(det[3]*hT)x,y=int((det[0]*wT)-w/2),int((det[1]*hT)-h/2)bbox.append([x,y,w,h])classIds.append(classId)confs.append(float(confidence))#消除多余的盒子indices=cv.dnn.NMSBoxes(bbox,confs,confThreshold,nmsThreshold)ROS應(yīng)用開發(fā)技術(shù)10.機器人感知-語音01目的與組成02功能與模型目錄CONTENTS目的與組成ROS結(jié)合語音識別目的03010204實現(xiàn)自然交互語音作為一種自然的交互方式,能夠讓用戶更加輕松地與機器人進行溝通,無需復(fù)雜的用戶界面或物理操作設(shè)備提升用戶體驗語音識別可以提升用戶與機器人之間的交互體驗,使用戶感覺更加直觀和智能化,提高用戶滿意度拓展功能范圍通過語音指令,用戶可以方便地控制機器人執(zhí)行各種任務(wù),如導(dǎo)航、物品抓取、環(huán)境監(jiān)測等,拓展了機器人系統(tǒng)的功能范圍對于一些特殊群體,如殘障人士或老年人,語音識別可以提供更加友好和易用的交互方式,幫助他們更好地與機器人進行交互和操作輔助特殊群體組成部分05.01.03.04.02.使用隱馬爾可夫模型或深度學(xué)習(xí)模型對語音信號進行建模,包括語音信號的狀態(tài)轉(zhuǎn)移概率和觀測概率。用于約束語音識別結(jié)果的語法和語言結(jié)構(gòu),提高識別準(zhǔn)確性,常見的模型包括n元語法模型和遞歸神經(jīng)網(wǎng)絡(luò)。將連續(xù)的語音信號通過采樣、預(yù)加重、分幀、加窗等預(yù)處理操作轉(zhuǎn)化為離散的時間序列數(shù)據(jù)。特征提取信號預(yù)處理結(jié)合聲學(xué)模型和語言模型對提取的特征進行解碼,以得到最可能的文本輸出。從每個語音幀中提取特征參數(shù),如梅爾頻率倒譜系數(shù)、線性預(yù)測編碼系數(shù)等,這些特征能夠反映語音信號的頻譜特性。語言模型解碼器聲學(xué)模型功能與模型常用功能0204050301使用語音進行設(shè)備或系統(tǒng)的控制,例如通過語音命令控制智能家居、機器人等。情感識別語音識別將文本轉(zhuǎn)換為語音信號,生成自然流暢的人工語音。語音指令交互界面語音合成語音命令控制通過語音信號分析,識別說話者的情感狀態(tài),如喜怒哀樂等。創(chuàng)建可通過語音進行交互的用戶界面,使用戶可以通過語音進行信息檢索、任務(wù)執(zhí)行等。將語音信號轉(zhuǎn)換為文本,識別出說話者所言的話語內(nèi)容。常用深度學(xué)習(xí)模型Transformer模型卷積神經(jīng)網(wǎng)絡(luò)CNN同時結(jié)合CNN、RNN和自注意力機制的混合模型,在語音識別任務(wù)中表現(xiàn)出了很高的性能。混合模型循環(huán)神經(jīng)網(wǎng)絡(luò)RNNLSTM是RNN的一種改進,通過引入門控機制解決了傳統(tǒng)RNN的長期依賴問題。類似于LSTM,GRU也是一種改進的RNN結(jié)構(gòu),簡化了LSTM的結(jié)構(gòu),具有更高的計算效率。CNN在圖像領(lǐng)域取得了巨大成功,而在語音領(lǐng)域,CNN也被應(yīng)用于聲學(xué)特征的提取和語音識別任務(wù)中。門控循環(huán)單元網(wǎng)絡(luò)GRUTransformer模型在自然語言處理領(lǐng)域取得了巨大成功,近年來也開始在語音識別中得到應(yīng)用。長短時記憶網(wǎng)絡(luò)LSTMRNN被廣泛應(yīng)用于語音識別中,可以處理變長序列數(shù)據(jù),適合于語音信號這種時間序列數(shù)據(jù)。ROS應(yīng)用開發(fā)技術(shù)11.機器人感知-語音實訓(xùn)01pyttsx3庫02SpeechRecognition庫03Speech
API目錄CONTENTSpyttsx3庫麥克風(fēng)語音轉(zhuǎn)文字pyttsx3是一個Python庫,用于在各種平臺上實現(xiàn)文本到語音(Text-to-Speech,TTS)功能。它基于底層的TTS引擎,并提供了簡單易用的接口,可以將文本轉(zhuǎn)換為聲音輸出。功能用途05.01.03.04.02.pyttsx3庫允許用戶自定義語音屬性,如語速、音量、語調(diào)等,以定制生成的語音輸出效果,滿足實際應(yīng)用需求。pyttsx3支持異步操作,可以實現(xiàn)與其他任務(wù)的并行執(zhí)行,提高程序效率和響應(yīng)速度,使語音合成過程更加靈活高效。pyttsx3庫可以實現(xiàn)文本到語音的轉(zhuǎn)換,適用于語音助手、語音提示等場景,為用戶提供直觀的信息傳達(dá)方式。多種語音引擎支持文字到語音轉(zhuǎn)換pyttsx3庫具有跨平臺支持性,可以在Windows、Linux和macOS等多個操作系統(tǒng)上穩(wěn)定運行,為開發(fā)者提供廣泛的應(yīng)用場景。pyttsx3支持多種語音引擎,如SAPI5、nsss、espeak等,用戶可以根據(jù)需求選擇合適的引擎,以滿足不同的語音合成需求。異步文本到語音轉(zhuǎn)換跨平臺支持自定義語音輸
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024橋梁加固工程承包合同范本3篇
- 2024年高端養(yǎng)殖場土地租賃及合作開發(fā)合同3篇
- 2024年采沙場租賃協(xié)議3篇
- 2025標(biāo)識牌生產(chǎn)與安裝一體化工程合同范本3篇
- 2024年網(wǎng)絡(luò)劇制作剪輯師招聘與管理協(xié)議3篇
- 公路車知識培訓(xùn)課件
- 《現(xiàn)代物流管理教程》課件
- 2024年采購協(xié)議:原材料及產(chǎn)品3篇
- 2024校秋季春季學(xué)期小賣部飲品及零食供應(yīng)與營銷合同3篇
- 鄭州工業(yè)應(yīng)用技術(shù)學(xué)院《互換性與公差配合》2023-2024學(xué)年第一學(xué)期期末試卷
- 東風(fēng)集團新能源汽車培訓(xùn)
- 2024-2030年中國廣電技術(shù)行業(yè)現(xiàn)狀分析及未來發(fā)展趨勢預(yù)測報告
- 廣東省廣州市天河區(qū)2023-2024學(xué)年高一上學(xué)期期末考試數(shù)學(xué)試卷(解析版)
- 鋼構(gòu)樓板合同范例
- 2024-2025學(xué)年人教版(2024)信息技術(shù)四年級上冊 第11課 嘀嘀嗒嗒的秘密 說課稿
- 造影劑過敏的護理
- 物流管理概論 課件全套 王皓 第1-10章 物流與物流管理的基礎(chǔ)知識 - 物流系統(tǒng)
- 蘇教版六年級上冊分?jǐn)?shù)四則混合運算100題帶答案
- 潛水員潛水作業(yè)安全2024
- 以案促改心得體會
- 2024年公文寫作基礎(chǔ)知識競賽試題庫及答案(共130題)
評論
0/150
提交評論