importcv2importtorchimportnumpyasnpimporttime# -------------------------- 请修改这3个参数(必改)--------------------------model_path="best.pt"# YOLOv5模型路径(与代码同一目录填"best.pt")video_path=0# 0=默认摄像头,可替换为视频路径(如:"test.mp4")save_video=True# 是否保存检测结果视频(True=保存,False=不保存)# --------------------------------------------------------------------------# -------------------------- 可选参数(按需修改)--------------------------conf_threshold=0.4# 置信度阈值(3.31优化技巧)track_distance=50# 追踪距离阈值(避免重复计数)alarm_line=(200,350,1080,350)# 越线报警线(x1,y1,x2,y2)# --------------------------------------------------------------------------# 1. 初始化所有模块(整合本周所有核心功能)# 1.1 加载YOLOv5模型(优化后,兼容所有版本)model=torch.hub.load('ultralytics/yolov5','custom',path=model_path,force_reload=True)model.conf=conf_threshold# 应用优化技巧,过滤无效框class_names=['cat','dog']# 类别的,与数据集一致colors=[(255,0,0),(0,0,255)]# 颜色(猫=蓝,狗=红)# 1.2 初始化视频读取与保存(4.2进阶功能)cap=cv2.VideoCapture(video_path)cap.set(cv2.CAP_PROP_FRAME_WIDTH,1280)cap.set(cv2.CAP_PROP_FRAME_HEIGHT,720)# 初始化视频写入器fourcc=cv2.VideoWriter_fourcc(*'mp4v')fps=cap.get(cv2.CAP_PROP_FPS)frame_width=int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))frame_height=int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))out=Noneifsave_video:out=cv2.VideoWriter('complete_project_result.mp4',fourcc,fps,(frame_width,frame_height))# 1.3 初始化计数、追踪、报警相关变量(4.1+4.2功能整合)total_cat=0# 总猫数total_dog=0# 总狗数current_cat=0# 当前帧猫数current_dog=0# 当前帧狗数tracks={}# 目标追踪字典track_id=0# 目标唯一IDcrossed_ids=set()# 已越线目标ID(避免重复报警)alarm_flag=False# 报警标志# 2. 项目核心循环(整合所有功能,一步到位)whilecap.isOpened():ret,frame=cap.read()ifnotret:break# 视频读取完毕,退出循环# 重置当前帧计数current_cat=0current_dog=0# 3. 模块1:OpenCV图像预处理(3.27轮廓检测+画面优化)# 灰度处理+轮廓提取(可选,可按需开启)gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)blur=cv2.GaussianBlur(gray,(5,5),0)# 模糊去噪ret,thresh=cv2.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. 模块2:YOLOv5目标检测(3.30+3.31优化功能)results=model(frame)detections=results.pandas().xyxy[0].values# 提取检测结果# 5. 模块3:目标追踪与计数(4.1基础功能)current_tracks=[]fordetindetections:xmin,ymin,xmax,ymax,conf,cls,name=det center_x=int((xmin+xmax)/2)center_y=int((ymin+ymax)/2)cls=int(cls)# 当前帧计数ifcls==0:current_cat+=1else:current_dog+=1# 目标追踪逻辑(优化后,更稳定)matched=Falsefortrack_id_exist,(track_center_x,track_center_y,track_cls)intracks.items():distance=np.sqrt((center_x-track_center_x)**2+(center_y-track_center_y)**2)ifdistance<track_distanceandtrack_cls==cls:tracks[track_id_exist]=(center_x,center_y,cls)current_tracks.append(track_id_exist)matched=True# 模块4:越线报警(4.2进阶功能)line_y=alarm_line[1]iftrack_center_y>line_yandtrack_id_existnotincrossed_ids:crossed_ids.add(track_id_exist)alarm_flag=True# 报警可视化+控制台提示cv2.putText(frame,f"ALARM:{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)ifcls==0:total_cat+=1else:total_dog+=1track_id+=1# 删除消失的目标轨迹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,name=det xmin,ymin,xmax,ymax=int(xmin),int(ymin),int(xmax),int(ymax)cls=int(cls)cv2.rectangle(frame,(xmin,ymin),(xmax,ymax),colors[cls],2)label=f"{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_exist>0:prev_center=tracks.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,f"Total Cat:{total_cat}",(20,40),cv2.FONT_HERSHEY_SIMPLEX,1,(255,0,0),2)cv2.putText(frame,f"Total Dog:{total_dog}",(20,80),cv2.FONT_HERSHEY_SIMPLEX,1,(0,0,255),2)cv2.putText(frame,f"Current Cat:{current_cat}",(1000,40),cv2.FONT_HERSHEY_SIMPLEX,1,(255,0,0),2)cv2.putText(frame,f"Current 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_flag=False# 保存检测结果视频(模块4功能)ifsave_videoandoutisnotNone:out.write(frame)# 显示完整项目画面cv2.imshow("Complete Vision Project (OpenCV + YOLOv5)",frame)# 按「q」键退出ifcv2.waitKey(1)&0xFF==ord('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.mp4)'ifsave_videoelse'未保存'}")print(f"项目运行状态:成功完成")print("="*60)从OpenCV到YOLOv5,手把手整合完整视觉项目完整代码
张小明
前端开发工程师
LongCat-Image-Edit与Node.js集成:动物图片处理API服务
LongCat-Image-Edit与Node.js集成:动物图片处理API服务 1. 引言 你有没有遇到过这样的场景:用户上传了一张可爱的猫咪照片,想要给它加上一顶小帽子,或者把背景换成星空?传统的图片处理需要专业的设计技能,…
终极ReTerraForged地形生成模组:5步快速构建专业级Minecraft世界
终极ReTerraForged地形生成模组:5步快速构建专业级Minecraft世界 【免费下载链接】ReTerraForged a 1.19 port of https://github.com/TerraForged/TerraForged 项目地址: https://gitcode.com/gh_mirrors/re/ReTerraForged ReTerraForged是一款专为Minecraf…
PyTorch 2.8镜像新手入门:无需配置,直接开启你的AI项目实战
PyTorch 2.8镜像新手入门:无需配置,直接开启你的AI项目实战 1. 为什么选择PyTorch 2.8预置镜像? 深度学习项目最让人头疼的往往不是算法本身,而是环境配置。不同版本的PyTorch、CUDA、cuDNN之间的兼容性问题,足以让一…
造相-Z-Image创意工作流:结合MidJourney提示词逻辑,优化中文生成效果
造相-Z-Image创意工作流:结合MidJourney提示词逻辑,优化中文生成效果 你是不是也遇到过这样的问题:用中文描述了半天,AI生成的图片却总是“货不对板”?要么是细节缺失,要么是风格跑偏,感觉AI完…
像素史诗效果展示:支持多语言术语表注入的专业领域研报生成实录
像素史诗效果展示:支持多语言术语表注入的专业领域研报生成实录 1. 产品概览:当学术研究遇上像素冒险 像素史诗(Pixel Epic)是一款革命性的研究报告辅助工具,它将枯燥的学术研究过程转化为一场充满探索乐趣的像素RPG冒险。基于AgentCPM-Rep…
像素史诗·智识终端前端设计(Frontend-Design)实战:UI组件智能生成
像素史诗智识终端前端设计实战:UI组件智能生成 1. 前端设计的效率革命 想象一下这样的场景:产品经理刚描述完需求,设计稿和前端代码就已经自动生成。这听起来像是科幻情节,但借助像素史诗智识终端的前端设计能力,这种…