• yolov8使用opencv2实时检测,两种物品,左上角显示信息


    效果为:
    左上角显示
    帧率:FPS
    序列号:SN
    两种物品的检测数量和总数

    可以应用于工业检测

    在这里插入图片描述

    import cv2
    from ultralytics import YOLO
    from cv2 import getTickCount, getTickFrequency
    # 加载 YOLOv8 模型
    model = YOLO("weights/yolov8s.pt")
    SN = '123'
    male_dic = ['123','124','125']
    female_dic = ['223','224','225']
    # 获取摄像头内容,参数 0 表示使用默认的摄像头
    cap = cv2.VideoCapture(0)
    
    
    def showFPS(frame,FPS):
        # 在图像左上角添加FPS文本
        fps_text = f"FPS: {FPS:.2f}"
        font = cv2.FONT_HERSHEY_SIMPLEX
        font_scale = 1
        font_thickness = 2
        text_color = (0, 0, 255)  # 红色
        text_position = (10, 30)  # 左上角位置
    
        cv2.putText(frame, fps_text, text_position, font, font_scale, text_color, font_thickness)
        
        return frame
    def showSN(frame,SN):
    
        # 在图像左上角添加FPS文本
        SN_text = 'SN: '+SN
        font = cv2.FONT_HERSHEY_SIMPLEX
        font_scale = 1
        font_thickness = 2
        text_color = (0, 0, 255)  # 红色
        text_position = (10, 60)  # 左上角位置
    
        cv2.putText(frame, SN_text, text_position, font, font_scale, text_color, font_thickness)
        
        return frame
    def showOKNG(frame,OKNG):
        # 在图像左上角添加FPS文本
        OKNG_text = 'result: '+OKNG
        font = cv2.FONT_HERSHEY_SIMPLEX
        font_scale = 1
        font_thickness = 2
        text_color = (0, 0, 255)  # 红色
        text_position = (10, 120)  # 左上角位置
    
        cv2.putText(frame, OKNG_text, text_position, font, font_scale, text_color, font_thickness)
        return frame
    def showClassNum(frame,results):
        #公的数量,母的数量,一共检测到多少个东西
        male_num = 0
        female_num = 0
        total_dets = len(results[0].boxes)
        for i in range(total_dets):
            det_cls = results[0].boxes[i].cls
            print("一轮for i")
            print("results[0].boxes[i].cls=",results[0].boxes[i].cls)
            if int(det_cls)==0:
                male_num +=1
            if int(det_cls) ==41:
                female_num +=1 
            
    
        # 在图像左上角添加FPS文本
        ClassNum_text = 'male:'+str(male_num)+'|female:"'+str(female_num)+'|total:'+str(total_dets)
        font = cv2.FONT_HERSHEY_SIMPLEX
        font_scale = 1
        font_thickness = 2
        text_color = (0, 0, 255)  # 红色
        text_position = (10, 90)  # 左上角位置
    
        cv2.putText(frame, ClassNum_text, text_position, font, font_scale, text_color, font_thickness)
    
        return frame,male_num,female_num
    def isOKorNG(male_num,female_num,SN):
        OK_or_NG = False
        if SN in male_dic:
            if male_num>0 and female_num<1:
                OK_or_NG = True
        elif SN in female_dic:
            if female_num>0 and male_num<1:
                OK_or_NG = True
    
        return OK_or_NG
    
              
    
    
    while cap.isOpened():
        loop_start = getTickCount()
        success, frame = cap.read()  # 读取摄像头的一帧图像
    
        if success:
            results = model.predict(source=frame) # 对当前帧进行目标检测并显示结果
        annotated_frame = results[0].plot()
    
        # 计算FPS
        loop_time = getTickCount() - loop_start
        total_time = loop_time / (getTickFrequency())
        FPS = int(1 / total_time)
        frame = showFPS(annotated_frame,FPS)
        #显示序列号
        frame = showSN(frame,SN)
        #显示总检测数量:
        frame,male_num,female_num = showClassNum(frame,results)
        #显示返回状态:
        state = isOKorNG(male_num,female_num,SN)
        frame = showOKNG(frame,str(state))
        cv2.imshow('img', frame)
    
        # 通过按下 'q' 键退出循环
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    
    cap.release()  # 释放摄像头资源
    cv2.destroyAllWindows()  # 关闭OpenCV窗口
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
  • 相关阅读:
    高通导航器软件开发包使用指南(14)
    KdMapper扩展实现之REALiX(hwinfo64a.sys)
    尿频中医如何辩证治疗
    分布式存储分层:构建高效可靠的数据存储体系
    python在导入模块时,即import时究竟有哪些动作?
    ElasticSearch索引数据备份与恢复
    【并发编程】Condition条件锁源码详解
    ArcGis将同一图层的多个面要素合并为一个面要素
    go~在阿里mse上使用redis.call
    Python 中堪称神仙的6个内置函数
  • 原文地址:https://blog.csdn.net/weixin_44298961/article/details/134504064