从OpenCV到YOLOv5,手把手整合完整视觉项目完整代码

张开发
2026/4/5 23:38:29 15 分钟阅读

分享文章

从OpenCV到YOLOv5,手把手整合完整视觉项目完整代码
importcv2importtorchimportnumpyasnpimporttime# -------------------------- 请修改这3个参数必改--------------------------model_pathbest.pt# YOLOv5模型路径与代码同一目录填best.ptvideo_path0# 0默认摄像头可替换为视频路径如test.mp4save_videoTrue# 是否保存检测结果视频True保存False不保存# --------------------------------------------------------------------------# -------------------------- 可选参数按需修改--------------------------conf_threshold0.4# 置信度阈值3.31优化技巧track_distance50# 追踪距离阈值避免重复计数alarm_line(200,350,1080,350)# 越线报警线x1,y1,x2,y2# --------------------------------------------------------------------------# 1. 初始化所有模块整合本周所有核心功能# 1.1 加载YOLOv5模型优化后兼容所有版本modeltorch.hub.load(ultralytics/yolov5,custom,pathmodel_path,force_reloadTrue)model.confconf_threshold# 应用优化技巧过滤无效框class_names[cat,dog]# 类别的与数据集一致colors[(255,0,0),(0,0,255)]# 颜色猫蓝狗红# 1.2 初始化视频读取与保存4.2进阶功能capcv2.VideoCapture(video_path)cap.set(cv2.CAP_PROP_FRAME_WIDTH,1280)cap.set(cv2.CAP_PROP_FRAME_HEIGHT,720)# 初始化视频写入器fourcccv2.VideoWriter_fourcc(*mp4v)fpscap.get(cv2.CAP_PROP_FPS)frame_widthint(cap.get(cv2.CAP_PROP_FRAME_WIDTH))frame_heightint(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))outNoneifsave_video:outcv2.VideoWriter(complete_project_result.mp4,fourcc,fps,(frame_width,frame_height))# 1.3 初始化计数、追踪、报警相关变量4.14.2功能整合total_cat0# 总猫数total_dog0# 总狗数current_cat0# 当前帧猫数current_dog0# 当前帧狗数tracks{}# 目标追踪字典track_id0# 目标唯一IDcrossed_idsset()# 已越线目标ID避免重复报警alarm_flagFalse# 报警标志# 2. 项目核心循环整合所有功能一步到位whilecap.isOpened():ret,framecap.read()ifnotret:break# 视频读取完毕退出循环# 重置当前帧计数current_cat0current_dog0# 3. 模块1OpenCV图像预处理3.27轮廓检测画面优化# 灰度处理轮廓提取可选可按需开启graycv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)blurcv2.GaussianBlur(gray,(5,5),0)# 模糊去噪ret,threshcv2.threshold(blur,127,255,cv2.THRESH_BINARY)contours,_cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)# 绘制轮廓可选可视化预处理效果cv2.drawContours(frame,contours,-1,(0,255,0),1)# 4. 模块2YOLOv5目标检测3.303.31优化功能resultsmodel(frame)detectionsresults.pandas().xyxy[0].values# 提取检测结果# 5. 模块3目标追踪与计数4.1基础功能current_tracks[]fordetindetections:xmin,ymin,xmax,ymax,conf,cls,namedet center_xint((xminxmax)/2)center_yint((yminymax)/2)clsint(cls)# 当前帧计数ifcls0:current_cat1else:current_dog1# 目标追踪逻辑优化后更稳定matchedFalsefortrack_id_exist,(track_center_x,track_center_y,track_cls)intracks.items():distancenp.sqrt((center_x-track_center_x)**2(center_y-track_center_y)**2)ifdistancetrack_distanceandtrack_clscls:tracks[track_id_exist](center_x,center_y,cls)current_tracks.append(track_id_exist)matchedTrue# 模块4越线报警4.2进阶功能line_yalarm_line[1]iftrack_center_yline_yandtrack_id_existnotincrossed_ids:crossed_ids.add(track_id_exist)alarm_flagTrue# 报警可视化控制台提示cv2.putText(frame,fALARM:{name}crossed line!,(500,40),cv2.FONT_HERSHEY_SIMPLEX,1,(0,0,255),3)print(f【报警】{name}越过报警线时间{time.strftime(%H:%M:%S)})break# 新目标计数ifnotmatched:tracks[track_id](center_x,center_y,cls)current_tracks.append(track_id)ifcls0:total_cat1else:total_dog1track_id1# 删除消失的目标轨迹tracks{k:vfork,vintracks.items()ifkincurrent_tracks}# 6. 模块5可视化展示整合所有可视化元素# 绘制报警线cv2.line(frame,(alarm_line[0],alarm_line[1]),(alarm_line[2],alarm_line[3]),(0,255,0),2)cv2.putText(frame,Alarm Line,(alarm_line[0],alarm_line[1]-10),cv2.FONT_HERSHEY_SIMPLEX,0.5,(0,255,0),2)# 绘制检测框、类别、置信度fordetindetections:xmin,ymin,xmax,ymax,conf,cls,namedet xmin,ymin,xmax,ymaxint(xmin),int(ymin),int(xmax),int(ymax)clsint(cls)cv2.rectangle(frame,(xmin,ymin),(xmax,ymax),colors[cls],2)labelf{name}{conf:.2f}cv2.putText(frame,label,(xmin,ymin-10),cv2.FONT_HERSHEY_SIMPLEX,0.5,colors[cls],2)# 绘制目标轨迹fortrack_id_exist,(center_x,center_y,cls)intracks.items():cv2.circle(frame,(center_x,center_y),5,colors[cls],-1)iftrack_id_exist0:prev_centertracks.get(track_id_exist-1,None)ifprev_centerandprev_center[2]cls:cv2.line(frame,(prev_center[0],prev_center[1]),(center_x,center_y),colors[cls],2)# 绘制计数信息总计数当前帧计数cv2.putText(frame,fTotal Cat:{total_cat},(20,40),cv2.FONT_HERSHEY_SIMPLEX,1,(255,0,0),2)cv2.putText(frame,fTotal Dog:{total_dog},(20,80),cv2.FONT_HERSHEY_SIMPLEX,1,(0,0,255),2)cv2.putText(frame,fCurrent Cat:{current_cat},(1000,40),cv2.FONT_HERSHEY_SIMPLEX,1,(255,0,0),2)cv2.putText(frame,fCurrent Dog:{current_dog},(1000,80),cv2.FONT_HERSHEY_SIMPLEX,1,(0,0,255),2)# 绘制报警提示持续3秒ifalarm_flag:cv2.putText(frame,ALARM! Target Crossed Line,(400,700),cv2.FONT_HERSHEY_SIMPLEX,1.5,(0,0,255),3)alarm_flagFalse# 保存检测结果视频模块4功能ifsave_videoandoutisnotNone:out.write(frame)# 显示完整项目画面cv2.imshow(Complete Vision Project (OpenCV YOLOv5),frame)# 按「q」键退出ifcv2.waitKey(1)0xFFord(q):break# 释放所有资源避免内存泄漏cap.release()ifsave_videoandoutisnotNone:out.release()cv2.destroyAllWindows()# 打印最终项目统计结果便于汇报、整理数据print(*60)print(完整视觉项目 - 最终统计结果)print(*60)print(f总检测到猫{total_cat}只)print(f总检测到狗{total_dog}只)print(f越线目标数量{len(crossed_ids)}个)print(f检测结果视频{已保存complete_project_result.mp4ifsave_videoelse未保存})print(f项目运行状态成功完成)print(*60)

更多文章