版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机视觉--OpenCV图像处理教程第六章目标检测OBJECTDETECTION内容要点:目标检测任务、模板匹配、特征匹配、人脸检测、疲劳检测建议课时:10课时讲课人:宋桂岭讲课时间:2026年5月18日目录6.1目标检测概述理论讲解6.2模板匹配理论+实操6.3特征匹配理论+实操6.4疲劳驾驶检测项目实战6.5小结及作业理论讲解016.1目标检测概述理论讲解6.1目标检测概述目标检测ObjectDetection目标检测是计算机视觉领域的核心问题之一,其任务就是找出图像中所有感兴趣的目标,确定他们的类别和位置。目标检测包含两层含义:①判定图像上有哪些目标物体,解决目标物体存在性的问题;②判定图像中目标物体的具体位置,解决目标物体在哪里的问题。目标检测026.2模板匹配理论+实操6.2模板匹配模板匹配TemplateMatching模板匹配是在图像中寻找目标的方法之一。模板是值一副已知的小图像。模板匹配就是在一副大图像中搜寻目标,已知该图中有要找的目标,且该目标同模板有相同的尺寸、方向和图像元素,通过一定的算法可以在图中找到目标,确定其坐标位置。模板包含待检测目标的大图从左向右,从上到下,逐块匹配滑动窗口6.2模板匹配①下载图片:/sgl_666/opencv/tree/master/code/chp6/data/image_1_template.pngimportcv2#读取大图src=cv2.imread('data/image_1.png',1)cv2.imshow("ori",src)imgGray=cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)#读取模板图template=cv2.imread('data/image_1_template.png',0)#模板匹配res=cv2.matchTemplate(imgGray,template,cv2.TM_CCOEFF_NORMED)②创建template_matching.pycv2.TM_SQDIFF平方差匹配法:该方法采用平方差来进行匹配;最好的匹配值为0;匹配越差,匹配值越大。cv2.TM_CCORR相关匹配法:该方法采用乘法操作;数值越大表明匹配程度越好。cv2.TM_CCOEFF相关系数匹配法:1表示完美的匹配;-1表示最差的匹配。cv2.TM_SQDIFF_NORMED归一化平方差匹配法cv2.TM_CCORR_NORMED归一化相关匹配法。cv2.TM_CCOEFF_NORMED归一化相关系数匹配法6.2模板匹配③显示结果#显示匹配结果min_val,max_val,min_loc,max_loc=cv2.minMaxLoc(res)top_left=max_loch,w=template.shape[:2]bottom_right=(top_left[0]+w,top_left[1]+h)cv2.rectangle(src,top_left,bottom_right,(0,255,0),2)#绘制匹配矩形cv2.imshow("result",src)cv2.waitKey(0)当前的模板匹配方法具有一定的局限性,主要表现在它只能进行平行移动,若原图像中的匹配目标发生旋转或大小变化,该算法无效6.2模板匹配④改进方案/cozheyuanzhangde/Invariant-TemplateMatching036.3特征匹配理论+实操6.3.1图像特征图像特征ImageFeatures图像特征是图像中独特的,易于跟踪和比较的特定模板或特定结构。图像特征提取与匹配是计算机视觉中的一个关键问题,在目标检测、物体识别、三维重建、图像配准、图像理解等具体应用中发挥着重要作用。颜色特征纹理特征形状特征空间关系特征6.3.2OpenCV-HOG特征方向梯度直方图(HOG)特征描述方向梯度直方图(Histogramoforientedgradient,简称HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子,要用来提取形状特征,它通过计算和统计图像局部区域的梯度直方图来构成特征灰度化(将图像看做一个x,y,z(灰度)的三维图像);采用Gamma校正法对输入图像进行颜色空间的标准化(归一化);计算图像每个像素的梯度(包括大小和方向);将图像划分成小cells;统计每个cell的梯度直方图(不同梯度的个数),得到cell的描述子;将每几个cell组成一个block,得到block的描述子;将图像image内的所有block的HOG特征descriptor串联起来就可以得到HOG特征,该特征向量就是用来目标检测或分类的特征6.3.2OpenCV-HOG特征利用HOG特征实现行人检测:importcv2
#判断矩形i是否完全包含在矩形o中defis_inside(o,i):ox,oy,ow,oh=oix,iy,iw,ih=ireturnox>ixandoy>iyandox+ow<ix+iwandoy+oh<iy+ih
#对人体绘制颜色框defdraw_person(image,person):x,y,w,h=personcv2.rectangle(image,(x,y),(x+w,y+h),(0,255,255),2)
img=cv2.imread("data/people.jpeg")hog=cv2.HOGDescriptor()#启动检测器对象hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())#指定检测器类型为人体found,w=hog.detectMultiScale(img,0.1,(2,2))#加载并检测图像print(found)print(w)#丢弃某些完全被其它矩形包含在内的矩形found_filtered=[]forri,rinenumerate(found):forqi,qinenumerate(found):ifri!=qiandis_inside(r,q):break
else:found_filtered.append(r)print(found_filtered)#对不包含在内的有效矩形进行颜色框定forpersoninfound_filtered:draw_person(img,person)cv2.imshow("peopledetection",img)cv2.waitKey(0)cv2.destroyAllWindows()6.3.2OpenCV-HOG特征运行结果:由于目标遮挡和特征描述能力不足,存在漏检和误检,后续章节将讲述更为准确的检测方法6.3.3OpenCV-Harr特征Haar特征分为4种类型:边缘特征、线性特征、中心特征和对角线特征。将这些特征组合成特征模板,特征模板内有白色和黑色两种矩形,并定义该模板的特征值为白色矩形像素之和减去黑色矩形像素之和。LienhartR.等人对Haar-like矩形特征库做了进一步
扩展,扩展后的特征大致分为4种类型——边缘特征、线性特征、圆心环绕特征和特定方向特征Harr特征6.3.3OpenCV-Harr特征案例:Harr特征进行人脸检测(OpenCV官方案例)importcv2ascvimportargparsedefdetectAndDisplay(frame):frame_gray=cv.cvtColor(frame,cv.COLOR_BGR2GRAY)frame_gray=cv.equalizeHist(frame_gray)#--Detectfacesfaces=face_cascade.detectMultiScale(frame_gray)for(x,y,w,h)infaces:center=(x+w//2,y+h//2)frame=cv.ellipse(frame,center,(w//2,h//2),0,0,360,(255,0,255),4)faceROI=frame_gray[y:y+h,x:x+w]#--Ineachface,detecteyeseyes=eyes_cascade.detectMultiScale(faceROI)for(x2,y2,w2,h2)ineyes:eye_center=(x+x2+w2//2,y+y2+h2//2)radius=int(round((w2+h2)*0.25))frame=cv.circle(frame,eye_center,radius,(255,0,0),4)cv.imshow('Capture-Facedetection',frame)parser=argparse.ArgumentParser(description='CodeforCascadeClassifiertutorial.')parser.add_argument('--face_cascade',help='Pathtofacecascade.',default='data/haarcascades/haarcascade_frontalface_alt.xml')parser.add_argument('--eyes_cascade',help='Pathtoeyescascade.’,default='data/haarcascades/haarcascade_eye_tree_eyeglasses.xml')parser.add_argument('--camera',help='Cameradividenumber.',type=int,default=0)args=parser.parse_args()face_cascade_name=args.face_cascadeeyes_cascade_name=args.eyes_cascadeface_cascade=cv.CascadeClassifier()eyes_cascade=cv.CascadeClassifier()#--1.Loadthecascadesifnotface_cascade.load(cv.samples.findFile(face_cascade_name)):print('--(!)Errorloadingfacecascade')exit(0)ifnoteyes_cascade.load(cv.samples.findFile(eyes_cascade_name)):print('--(!)Errorloadingeyescascade')exit(0)camera_device=args.camera#--2.Readthevideostreamcap=cv.VideoCapture(camera_device)ifnotcap.isOpened:print('--(!)Erroropeningvideocapture')exit(0)6.3.3OpenCV-Harr特征案例:Harr特征进行人脸检测(OpenCV官方案例)whileTrue:ret,frame=cap.read()ifframeisNone:print('--(!)Nocapturedframe--Break!')breakdetectAndDisplay(frame)ifcv.waitKey(10)==27:break检测结果6.3.4OpenCV-角点特征角点对应于物体的拐角,道路的十字路口、丁字路口等。从图像分析的角度来定义角点可以有以下两种定义:两个边缘的交点:通过图像边缘计算邻域内具有两个主方向的特征点:基于图像灰度的方法通过计算点的曲率及梯度来检测角点角点所具有的特征:轮廓之间的交点对于同一场景,即使视角发生变化,通常具备稳定性质的特征各类角点6.3.4OpenCV-角点特征OpenCV提供了Harris、Shi-Tomasi、SIFT、SURF和ORB等多种角点描述方法,
下为ORB角点检测方法:importcv2
img=cv2.imread('data/blox.jpg',0)#InitiateORBdetectororb=cv2.ORB_create()#findthekeypointswithORBkp=orb.detect(img,None)#computethedescriptorswithORBkp,des=pute(img,kp)#drawonlykeypointslocation,notsizeandorientationimg2=cv2.drawKeypoints(img,kp,None,color=(0,255,0),flags=0)cv2.imshow("corners",img2)cv2.waitKey(0)角点检测6.3.5基于特征匹配的目标检测任务:视角变换的情况下进行目标检测(OpenCV官方)模板图待测图像6.3.5基于特征匹配的目标检测①
创建“feature_matching.py”②SIFT(Scale-invariantfeaturetransform)特征提取importnumpyasnpimportcv2ascvfrommatplotlibimportpyplotasplt
MIN_MATCH_COUNT=10img1=cv.imread('data/box.png',0)#模板图像img2=cv.imread('data/box_in_scene.png',0)#待测图像
#初始化特征检测器sift=cv.SIFT_create()
#查找参考图和目标图的SIFT关键点和描述器kp1,des1=sift.detectAndCompute(img1,None)kp2,des2=sift.detectAndCompute(img2,None)6.3.5基于特征匹配的目标检测③
特征可视化kp_img1=cv.drawKeypoints(img1,kp1,None,color=(0,255,0),flags=0)cv.imshow("kp1",kp_img1)kp_img2=cv.drawKeypoints(img2,kp2,None,color=(0,255,0),flags=0)cv.imshow("kp2",kp_img2)cv.waitKey(0)6.3.5基于特征匹配的目标检测④模板特征匹配#查找两幅图像的最佳匹配点FLANN_INDEX_KDTREE=1index_params=dict(algorithm=FLANN_INDEX_KDTREE,trees=5)search_params=dict(checks=50)flann=cv.FlannBasedMatcher(index_params,search_params)matches=flann.knnMatch(des1,des2,k=2)#保存匹配度较高的点good=[]form,ninmatches:ifm.distance<0.7*n.distance:good.append(m)6.3.5基于特征匹配的目标检测⑤匹配过滤#保存10个匹配点iflen(good)>MIN_MATCH_COUNT:src_pts=np.float32([kp1[m.queryIdx].ptformingood]).reshape(-1,1,2)dst_pts=np.float32([kp2[m.trainIdx].ptformingood]).reshape(-1,1,2)M,mask=cv.findHomography(src_pts,dst_pts,cv.RANSAC,5.0)matchesMask=mask.ravel().tolist()h,w=img1.shapepts=np.float32([[0,0],[0,h-1],[w-1,h-1],[w-1,0]]).reshape(-1,1,2)dst=cv.perspectiveTransform(pts,M)result=cv.cvtColor(img2,cv.COLOR_GRAY2BGR)result=cv.polylines(result,[32(dst)],True,(0,255,0),3,cv.LINE_AA)cv.imshow("img2",result)cv.waitKey(0)else:print("Notenoughmatchesarefound-{}/{}".format(len(good),MIN_MATCH_COUNT))matchesMask=Nonecv.findHomography:查找两个点集合间的透视变换矩阵cv.
perspectiveTransform:执行坐标间的透视变换,从而定位目标位置6.3.5基于特征匹配的目标检测⑥运行结果6.3.5基于特征匹配的目标检测⑦对应关系可视化:draw_params=dict(matchColor=(0,255,0),#drawmatchesingreencolorsinglePointColor=None,matchesMask=matchesMask,#drawonlyinliersflags=2)img3=cv.drawMatches(img1,kp1,img2,kp2,good,None,**draw_params)cv.imshow("featurematching",img3)cv.waitKey(0)6.3.5基于特征匹配的目标检测⑤匹配过滤#保存10个匹配点iflen(good)>MIN_MATCH_COUNT:src_pts=np.float32([kp1[m.queryIdx].ptformingood]).reshape(-1,1,2)dst_pts=np.float32([kp2[m.trainIdx].ptformingood]).reshape(-1,1,2)M,mask=cv.findHomography(src_pts,dst_pts,cv.RANSAC,5.0)matchesMask=mask.ravel().tolist()h,w=img1.shapepts=np.float32([[0,0],[0,h-1],[w-1,h-1],[w-1,0]]).reshape(-1,1,2)dst=cv.perspectiveTransform(pts,M)result=cv.cvtColor(img2,cv.COLOR_GRAY2BGR)result=cv.polylines(result,[32(dst)],True,(0,255,0),3,cv.LINE_AA)cv.imshow("img2",result)cv.waitKey(0)else:print("Notenoughmatchesarefound-{}/{}".format(len(good),MIN_MATCH_COUNT))matchesMask=None046.4疲劳驾驶检测项目实战6.4疲劳驾驶检测人脸定位眼睛定位眨眼频率判断结果输出6.4.1人脸及五官定位https://ibug.doc.ic.ac.uk/resources/facial-point-annotations/人脸特征标注:(a)-(d)AnnotatedimagesfromMultiPIE,XM2VTS,AR,FRGCVer.2databases,and(e)examplesfromXM2VTSwithinaccurateannotations。6.4.1人脸及五官定位下载人脸库dlib,本教程中采用了OpenCV3.9,可以从代码网址“/sgl_666/opencv/blob/master/code/chp6/data/dlib-19.23.0-cp39-cp39-win_amd64.whl”下载dlib-19.23.0-cp39-cp39-win_amd64.whl,其他版本的OpenCV可从/simple/dlib/下载对应的whl文件①人脸库安装condaactivateopencv4.7pipinstalldlib-19.23.0-cp39-cp39-win_amd64.whl运行:6.4.1人脸及五官定位代码位于:/sgl_666/opencv/blob/master/code/chp6/face_detect.py②人脸检测运行需要配置参数:或者pythonface_detect.py-pdata/shape_predictor_68_face_landmarks.dat-idata/lena.jpeg6.4.1人脸及五官定位③运行结果6.4.2疲劳检测①创建“detect_blinks.py”论文:ftp://cmp.felk.cvut.cz/pub/cmp/articles/cech/Soukupova-TR-2016-05.pdf②导入工具包fromscipy.spatialimportdistanceasdistfromcollectionsimportOrderedDictimportnumpyasnpimportargparseimporttimeimportdlibimportcv26.4.2疲劳检测③定义人脸landmark索引:ACIAL_LANDMARKS_68_IDXS=OrderedDict([("mouth",(48,68)),("right_eyebrow",(17,22)),("left_eyebrow",(22,27)),("right_eye",(36,42)),("left_eye",(42,48)),("nose",(27,36)),("jaw",(0,17))])6.4.2疲劳检测④眼睛比例判断,用于判定是否眨眼:defeye_aspect_ratio(eye):#计算距离,竖直的A=dist.euclidean(eye[1],eye[5])B=dist.euclidean(eye[2],eye[4])#计算距离,水平的C=dist.euclidean(eye[0],eye[3])#ear值ear=(A+B)/(2.0*C)returneardefshape_to_np(shape,dtype="int"):#创建68*2coords=np.zeros((shape.num_parts,2),dtype=dtype)#遍历每一个关键点#得到坐标foriinrange(0,shape.num_parts):coords[i]=(shape.part(i).x,shape.part(i).y)returncoords6.4.2疲劳检测⑤检测代码、全局参数设置:#设置判断参数EYE_AR_THRESH=0.3EYE_AR_CONSEC_FRAMES=3
#初始化计数器COUNTER=0TOTAL=0
#检测与定位工具print("[INFO]loadingfaciallandmarkpredictor...")detector=dlib.get_frontal_face_detector()predictor=dlib.shape_predictor(args["shape_predictor"])
#分别取两个眼睛区域(lStart,lEnd)=FACIAL_LANDMARKS_68_IDXS["left_eye"](rStart,rEnd)=FACIAL_LANDMARKS_68_IDXS["right_eye"]6.4.2疲劳检测⑥读取视频print("[INFO]startingvideostreamthread...")vs=cv2.VideoCapture(args["video"])#vs=FileVideoStream(args["video"]).start()time.sleep(1.0)6.4.2疲劳检测⑦视频逐帧检测:whileTrue:#预处理frame=vs.read()[1]ifframeisNone:break
(h,w)=frame.shape[:2]width=1200r=width/float(w)dim=(width,int(h*r))frame=cv2.resize(frame,dim,interpolation=cv2.INTER_AREA)gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
#检测人脸rects=detector(gray,0)
6.4.2疲劳检测⑦视频逐帧检测:#遍历每一个检测到的人脸forrectinrects:#获取坐标shape=predictor(gray,rect)shape=shape_to_np(shape)
#分别计算ear值leftEye=shape[lStart:lEnd]rightEye=shape[rStart:rEnd]leftEAR=eye_aspect_ratio(leftEye)rightEAR=eye_aspect_ratio(rightEye)
#算一个平均的ear=(leftEAR+rightEAR)/2.0
#绘制眼睛区域leftEyeHull=cv2.convexHull(leftEye)rightEyeHull=cv2.convexHull(rightEye)c
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026陕西中考试题及答案政治
- (二模)杭州市2026年4月高三年级教学质量检测政治试题卷(含答案及解析)
- 医学26年:消化专科医师培训要点 查房课件
- 生态旅游度假区生态旅游环保旅游购物设施建设可行性报告
- 2026年智慧农业智能管理平台创新报告
- 热区中暑事件医疗应急通信响应方案
- 气候变化慢性病远程监测数据安全策略
- 聚焦2026年智能仓储AGV小车产业化项目可行性评估
- 第四节 欧姆定律说课稿2025年初中物理九年级全册(2024)北师大版(2024·郭玉英)
- Reading and interaction说课稿2025学年高中英语沪教版2020选择性必修第一册-沪教版2020
- GA/T 1390.8-2025信息安全技术网络安全等级保护基本要求第8部分:IPv6网络安全扩展要求
- 经销商管理系统
- AI赋能园艺景观设计:从技术到实践
- 2026年初中安全急救培训
- JG/T 368-2012钢筋桁架楼承板
- ISO27001-2022信息安全管理体系内审全套记录表格
- NY/T 388-1999畜禽场环境质量标准
- LY/T 1000-2013容器育苗技术
- GB/T 14486-2008塑料模塑件尺寸公差
- 阿片类药物的麻醉应用-课件
- 输电线路跨越铁路施工方案(跨越架搭设跨越)
评论
0/150
提交评论