版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
ROS应用开发技术1.机器人感知-ROS中的图像01机器视觉02cv_bridge目录CONTENTS机器视觉机器视觉介绍机器视觉是一项运用摄像头、传感器等先进设备来捕获图像或视频数据的技术。通过精心设计的算法和模型,这些数据得以被深入分析和精确理解,从而实现高效的图像和视频处理。应用领域农业领域安防监控助力车辆实现精准的环境感知和自动导航,提升驾驶的安全性和效率。帮助农民更精准地监测农作物生长和检测病虫害,提升了农业生产效率。工业自动化自动驾驶帮助实现身份验证、门禁控制等任务,提高了安全性和便利性。提供智能的解决方案,实时识别异常行为或物体,提升安全性。助力完成质量控制、产品检测和物体识别等任务,提高生产效率和产品精度。帮助医生更快速、更准确地分析医学影像,为疾病诊断和治疗计划制定提供支持。人脸识别医疗ROS中的图像数据格式主要图像数据格式是sensor_msgs/Image消息类型header字段提供图像数据的时间戳和坐标系信息height和width字段分别表示图像的高度和宽度,单位是像素encoding字段指定了图像像素的编码方式,比如RGB8、BGR8或MONO8等创建编码step字段表示一行像素在内存中的字节数,通常是图像的宽度乘以每个像素的字节数data字段是一个字节数组,它存储了图像的像素值。图像数据的处理和分析ROS主要图像数据格式了解了这些图像数据的组成部分后,我们就可以更好地处理和分析这些数据了,例如进行图像处理算法、目标检测、图像识别等应用。文件创建OpenCV提供了C++和Python等多种编程语言的接口,方便在常用的编程语言中调用OpenCV进行图像处理工作。OpenCV库多语言接口GUI系统cdsOpenCV对商业应用和非商业应用都是免费的,因此在产品开发中也可以选择使用OpenCV来完成图像处理任务。免费使用cdrobot_vOpenCV是一个开放的机器视觉处理库,可以跨平台完成机器视觉处理工作。OpenCV还提供了一个简单的GUI系统,用于实现可视化显示,帮助更直观地展示图像处理的结果。在ROS中安装OpenCV在ROS中安装OpenCV也非常简单,只需使用apt-getinstall命令即可完成OpenCV的安装。sudoapt-getinstallros-kinetic-vision-opencvlibopencv-devpython-opencvcv_bridgecv_bridge介绍cv_bridge是一个通用的库,用于在ROS和OpenCV之间进行图像数据的转换。cv_bridge提供了一系列的函数和类,可以将ROS中的图像消息转换为OpenCV格式的图像,或者将OpenCV处理过后的图像转换为ROS格式的图像消息,以便在ROS节点之间传输。功能介绍将OpenCV图像转换为ROS图像消息将ROS图像消息转换为OpenCV图像实现ROS节点之间的图像传输ROS应用开发技术2.机器人感知-cv_bring库01准备工作02文件编写03效果展示目录CONTENTS准备工作功能包创建060402050301sensor_msgsstd_msgs包含传感器数据的消息定义image_transportrospyROS的C++客户端库用于在OpenCV图像和ROS图像消息之间进行转换的包在工作空间的src文件夹下新建一个功能包robot_vision,该功能包将专门用于我们的机器视觉实验catkin_create_pkgrobot_visioncv_bridgeimage_transportroscpprospysensor_msgsstd_msgsroscpp包含标准消息定义,如字符串、浮点数、整数等cv_bridge用于发布和订阅图像数据的包,它处理图像的传输和压缩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开发者为我们提供了与OpenCV的接口功能包——cv_bridge。我们可以通过该功能包将ROS中的图像数据转换成OpenCV格式的图像,并且调用OpenCV库进行各种图像处理sudoapt-getinstallros-melodic-vision-opencvlibopencv-devpython-opencv文件编写文件创建mkdirscriots进入robot_vision功能包创建scripts文件夹编写cv_bridge_test.py文件cdscriots进入scripts文件夹cdrobot_visionvicv_bridge_test.py文件内容importrospyimportcv2fromcv_bridgeimportCvBridge,CvBridgeErrorfromsensor_msgs.msgimportImageclassimage_converter:def__init__(self):#创建cv_bridge,声明图像的发布者和订阅者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的图像数据转换成OpenCV的图像格式try:cv_image=self.bridge.imgmsg_to_cv2(data,"bgr8")exceptCvBridgeErrorase:print(e)文件内容#在opencv的显示窗口中绘制一个圆,作为标记(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格式额数据转换成rosimage格式的数据发布try:self.image_pub.publish(self.bridge.cv2_to_imgmsg(cv_image,"bgr8"))exceptCvBridgeErrorase:print(e)文件内容if__name__=='__main__':try:#初始化ros节点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>返回功能包命令,创建scripts文件夹,编写usb_cam.launch效果展示结果展示020301连接摄像头roslaunchrobot_visionusb_cam.launchrqt_image_view启动Python脚本启动RQT工具rosrunrobot_visioncv_bridge_test.pyROS应用开发技术3.机器人感知-OpenCV学习(上)01图像处理目录CONTENTS图像处理学习任务03010204借助OpenCV库实现图像的读取运用高斯模糊滤波器对图像中的噪声进行消除拓展功能执行边缘检测等操作以优化图像质量范围提取图像中的关键特征图像读取importcv2img=cv2.imread("0.jpg")cv2.imshow("name",img)cv2.waitKey()cv2.destroyAllWindows()傅里叶变换傅里叶变换由18世纪法国数学家傅里叶提出,它认为信号可由波形描述。在图像处理中,利用傅里叶变换分析图像信号强弱,标记不同区域。图像由多频率信号组成,分离频率有助于理解图像并提取数据。傅里叶变换在图像处理中重要,助力深入理解与分析。高通滤波器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()边缘检测介绍边缘检测通过识别图像中的灰度突变确定物体边界,常用于识别和分析图像内容。常用的边缘检测算法包括Sobel、Prewitt和Canny。进行边缘检测能提取物体轮廓信息,助力形状识别和目标检测等任务,广泛应用于图像分割和特征提取。图像读取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应用开发技术3.机器人感知-OpenCV学习(下)01图像处理目录CONTENTS图像处理学习任务圆检测直线检测人脸检测直线检测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)#中值滤波基于排序统计理论的一种能够有效抑制噪声的非线性信号处理技术img=cv2.medianBlur(gray_img,5)#颜色转换cimg=cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)#霍夫圆环检测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()级联在人脸检测中,级联的概念至关重要,它可以根据给定的图像,为不同大小的区域生成相应的特征集合。尤为值得一提的是,Haar级联具备尺度不变性,这意味着在图像尺度发生变化时,它仍能保持稳健的性能,从而确保人脸检测的准确性和可靠性。此外,Haar级联还提供了xml文件,这些文件包含了预先训练好的人脸检测模型人脸检测importcv2importsysimagePath="1.png"cascPath="haarcascade_frontalface_default.xml"#创建haar级联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("发现{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应用开发技术4.机器人感知-二维码识别01OpenCVS识别二维码02二维码生成目录CONTENTSOpenCVS识别二维码库安装与二维码识别020301安装库pipinstallnumpypipinstallpyzbarimg=cv2.imread('1.jpg')forbarcodeindecode(img):myData=barcode.data.decode('utf-8)print(myData)导入库文件二维码识别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默认安装路径下(/opt/ros/melodic/share)找到该功能包并进入launch文件夹,可以看到很多个launch文件。这些都是针对PR2机器人使用的二维码识别例程二维码创建020301指定AR_ID为0rosrunar_track_alvarcreateMarkerrosrunar_track_alvarcreateMarkerAR_ID参数查看创建二维码标签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文件功能描述设置individualMarkerNoKinect节点所需要的参数,主要是订阅图像数据的话题名,还有使用二维码的实际尺寸,单位是厘米设置world与camera之间的坐标变换启动rviz界面,将识别结果可视化文件启动roslaunchrobot_visionusb_cam_with_calibration.launch启动AR标记物跟踪和摄像头相关节点roslaunchrobot_visionar_track_camera.launch配置并启动带有校准的USB摄像头ROS应用开发技术5.机器人感知-人脸识别01人脸识别介绍与步骤02代码生成目录CONTENTS人脸识别介绍与步骤Launch文件概念人脸识别是指一种通过计算机程序,能够自动识别给定图像或视频流中人脸的技术。这种技术基于计算机视觉和模式识别的原理,可以实现对人脸的准确检测、定位和识别,具有广泛的应用前景。OpenCV人脸识别方法通过cv2.face.createFisherFaceRecognizer()创建,它基于线性判别分析(LDA)技术,旨在寻找能最大化类间差异并最小化类内差异的投影方向,以实现更为精确的人脸识别。FisherFaces借助cv2.face.createLBPHFaceRecognizer()创建,它利用局部二值模式(LBP)描述图像的局部纹理特征,并通过直方图统计这些特征来构建人脸模型,进而完成人脸识别任务。使用cv2.face.createEigenFaceRecognizer()创建,它基于主成分分析(PCA)来构建人脸的向量空间模型,进而实现人脸的识别。局部二值模式直方图Eigenfaces人脸识别步骤准备训练数据测试读取每个人或主体的训练图像及其标签,从每个图像中检测人脸并为每个检测到的人脸分配其所属人员的整数标签训练OpenCV的LBPH人脸识别器,为其提供我们在步骤1中准备的数据训练人脸识别器将一些测试图像传递给人脸识别器,并查看它是否能够正确预测它们代码生成数据准备Haar级联分类器文件可以直接复制OpenCV源代码中训练好的Haar级联分类器文件。我们只需要人脸标记文件haarcascade_frontalface_alt.xml和侧脸检测文件haarcascade_profileface.xml代码内容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]代码内容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)代码内容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)代码内容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)#转为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代码内容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应用开发技术6.机器人感知-人脸标记01代码编写02人脸标记目录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))
#如果正面人脸匹配失败,那么就尝试匹配侧面人脸的模型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节点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添加执行权限使用chmod命令为Python文件添加可执行权限。sudochmoda+xface_detector.py注意我们现在并不是root用户,所以在使用命令添加可执行的权限时得在命令前加上sudo,否则我们的操作将无法生效。人脸标记文件夹准备03010204进入robot_vision功能包cd~/ArTrack_ws/src/robot_vision创建data文件夹mkdirdata进入data文件夹cddatamkdirhaardetectors创建haar_detectors文件夹分类器准备Haar级联分类器文件可以直接复制OpenCV源代码中训练好的Haar级联分类器文件。我们只需要人脸标记文件haarcascade_frontalface_alt.xml和侧脸检测文件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应用开发技术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:#如果检测到的区域小于设置值,则忽略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"#在输出画面上打当前状态和时间戳信息cv2.putText(frame,"Status:{}".format(self.text),(10,20),cv2.FONT_HERSHEY_SIMPLEX,0.5,(0,0,255),2)#将识别后的图像转换成ROS消息并发布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节点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添加执行权限使用chmod命令为Python文件添加可执行权限。sudochmoda+xmotion_detector.py注意我们现在并不是root用户,所以在使用命令添加可执行的权限时得在命令前加上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应用开发技术8.机器人感知-目标检测01目标检测02R-CNN和YOLO算法介绍目录CONTENTS目标检测目标检测相关知识030102识别图像中物体的类别识别物体并预测位置信息目标检测目标检测的相关知识包括图像分类、图像定位和目标检测本身。图像定位图像分类定位图片中的多个目标物体常见算法020103VGG,GOOGLENET,RESNET介绍了图像分类、图像定位和目标检测的常见算法。图像定位算法RCNN,FastRCNN,FasterRCNN目标检测算法RCNN,FastRCNN,FasterRCNN,YOLO图像分类算法人类与计算机的目标检测0102面对RGB像素组成的矩阵人类通过感知图片中不同颜色模块定位并分类目标物体,而计算机面对的是RGB像素组成的矩阵。通过感知图片中不同颜色模块人类目标检测计算机目标检测传统目标检测0201多尺度形变部件模型DPM滑动窗口框架效果优秀但检测速度慢传统目标检测采用滑动窗口框架,包括候选区域生成、特征提取和分类器识别。三个核心步骤基于深度学习的目标检测0102目标检测算法转变深度学习模型优化后,基于深度学习的目标检测算法超越了传统算法。从传统算法转向深度学习奠定深度学习目标检测基础R-CNN主流目标检测算法0201two-stage检测算法主流目标检测算法分为two-stage和one-stage检测算法。R-CNN、SPPNET、FastR-CNN、FasterR-CNNone-stage检测算法SSD、YOLO、FPNR-CNN和YOLO算法介绍R-CNNR-CNN全称是带卷积神经网络特征的区域,是一种用于目标检测的深度学习模型。它是目标检测领域的重要里程碑,提出了一种基于区域的卷积神经网络方法,能够有效地识别并定位图像中的目标物体。工作流程对于每个候选区域,使用预训练的卷积神经网络(如AlexNet、VGG等)提取特征特征提取对于每个候选区域,使用回归器来微调边界框的位置,以更准确地拟合目标的位置候选区域生成边界框回归使用选择性搜索等算法生成数百到数千个候选区域,这些候选区域可能包含图像中的目标物体YOLOYOLO是一种快速而准确的实时目标检测算法,与传统的基于区域的方法不同,它采用了一种端到端的方式来同时预测图像中所有目标的类别和边界框。YOLO特点03010204单次前向传播YOLO将目标检测任务转化为一个回归问题,并通过单个卷积神经网络模型直接在整个图像上进行预测网格划分YOLO将图像划分为固定大小的网格,并每个网格负责预测包含该目标的边界框以及目标的类别概率多尺度预测YOLO在多个不同层级的特征图上进行目标检测预测,以便捕获不同尺度的目标YOLO使用自定义的损失函数,综合考虑了定位误差和分类误差,以确保同时精确地定位目标位置和准确地分类目标损失函数设计ROS应用开发技术9.机器人感知-目标检测案例01准备工作与脚本编写目录CONTENTS准备工作与脚本编写准备工作YOLO算法可用的类别名称文件yolov3-320.cfgsyolov3.weights文件导入YOLO算法的配置文件YOLO算法权重文件目标检测脚本文件编写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)目标检测脚本文件编写#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)#创建一个可以在给定图像上绘图的对象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)#转换回OpenCV格式目标检测脚本文件编写deffindObjects(outputs,img):hT,wT,cT=img.shapebbox=[]classIds=[]confs=[]foroutputinoutputs:fordetinoutput:scores=det[5:]#根据得分获取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应用开发技术10.机器人感知-语音01目的与组成02功能与模型目录CONTENTS目的与组成ROS结合语音识别目的03010204实现自然交互语音作为一种自然的交互方式,能够让用户更加轻松地与机器人进行沟通,无需复杂的用户界面或物理操作设备提升用户体验语音识别可以提升用户与机器人之间的交互体验,使用户感觉更加直观和智能化,提高用户满意度拓展功能范围通过语音指令,用户可以方便地控制机器人执行各种任务,如导航、物品抓取、环境监测等,拓展了机器人系统的功能范围对于一些特殊群体,如残障人士或老年人,语音识别可以提供更加友好和易用的交互方式,帮助他们更好地与机器人进行交互和操作辅助特殊群体组成部分05.01.03.04.02.使用隐马尔可夫模型或深度学习模型对语音信号进行建模,包括语音信号的状态转移概率和观测概率。用于约束语音识别结果的语法和语言结构,提高识别准确性,常见的模型包括n元语法模型和递归神经网络。将连续的语音信号通过采样、预加重、分帧、加窗等预处理操作转化为离散的时间序列数据。特征提取信号预处理结合声学模型和语言模型对提取的特征进行解码,以得到最可能的文本输出。从每个语音帧中提取特征参数,如梅尔频率倒谱系数、线性预测编码系数等,这些特征能够反映语音信号的频谱特性。语言模型解码器声学模型功能与模型常用功能0204050301使用语音进行设备或系统的控制,例如通过语音命令控制智能家居、机器人等。情感识别语音识别将文本转换为语音信号,生成自然流畅的人工语音。语音指令交互界面语音合成语音命令控制通过语音信号分析,识别说话者的情感状态,如喜怒哀乐等。创建可通过语音进行交互的用户界面,使用户可以通过语音进行信息检索、任务执行等。将语音信号转换为文本,识别出说话者所言的话语内容。常用深度学习模型Transformer模型卷积神经网络CNN同时结合CNN、RNN和自注意力机制的混合模型,在语音识别任务中表现出了很高的性能。混合模型循环神经网络RNNLSTM是RNN的一种改进,通过引入门控机制解决了传统RNN的长期依赖问题。类似于LSTM,GRU也是一种改进的RNN结构,简化了LSTM的结构,具有更高的计算效率。CNN在图像领域取得了巨大成功,而在语音领域,CNN也被应用于声学特征的提取和语音识别任务中。门控循环单元网络GRUTransformer模型在自然语言处理领域取得了巨大成功,近年来也开始在语音识别中得到应用。长短时记忆网络LSTMRNN被广泛应用于语音识别中,可以处理变长序列数据,适合于语音信号这种时间序列数据。ROS应用开发技术11.机器人感知-语音实训01pyttsx3库02SpeechRecognition库03Speech
API目录CONTENTSpyttsx3库麦克风语音转文字pyttsx3是一个Python库,用于在各种平台上实现文本到语音(Text-to-Speech,TTS)功能。它基于底层的TTS引擎,并提供了简单易用的接口,可以将文本转换为声音输出。功能用途05.01.03.04.02.pyttsx3库允许用户自定义语音属性,如语速、音量、语调等,以定制生成的语音输出效果,满足实际应用需求。pyttsx3支持异步操作,可以实现与其他任务的并行执行,提高程序效率和响应速度,使语音合成过程更加灵活高效。pyttsx3库可以实现文本到语音的转换,适用于语音助手、语音提示等场景,为用户提供直观的信息传达方式。多种语音引擎支持文字到语音转换pyttsx3库具有跨平台支持性,可以在Windows、Linux和macOS等多个操作系统上稳定运行,为开发者提供广泛的应用场景。pyttsx3支持多种语音引擎,如SAPI5、nsss、espeak等,用户可以根据需求选择合适的引擎,以满足不同的语音合成需求。异步文本到语音转换跨平台支持自定义语音输
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年哈尔滨客运资格证软件下载
- 2024年海口道路运输客运从业资格证考试题库及答案
- 2024年塔城烟台客运上岗证考试题
- 2023年北京市初三一模道德与法治试题汇编:追求民主价值
- 吉首大学《美国文学》2021-2022学年第一学期期末试卷
- 吉首大学《动画合成与剪辑》2021-2022学年第一学期期末试卷
- 《机加工艺方案设计与实施》考试卷及答案A卷
- 吉林艺术学院《影视艺术概论》2021-2022学年第一学期期末试卷
- 吉林艺术学院《视听基础》2021-2022学年第一学期期末试卷
- 遗产分割赠予协议书范本范本
- 四川阿坝茂县考调机关事业单位工作人员30人2355笔试题库含答案解析
- 设计构成基础课件 1-点线面
- 2022年高考语文真题试卷(全国乙卷 )讲评教学专用课件
- 咯血的介入治疗
- 教师专业成长概述教师专业发展途径PPT培训课件
- 球磨机安装专项施工方案
- 阀门压力等级对照表优质资料
- GMP质量管理体系文件 中药材干燥SOP
- YY/T 0874-2013牙科学旋转器械试验方法
- GB/T 25217.10-2019冲击地压测定、监测与防治方法第10部分:煤层钻孔卸压防治方法
- GB/T 21010-2007土地利用现状分类
评论
0/150
提交评论