You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于OpenCV和Python的目标识别代码自定义:实现特定物体检测状态提示

OpenCV目标检测自定义打印逻辑修改方案

结论

完全可以直接修改现有代码实现你的需求,无需更换技术方案,你只需要在现有代码的主循环中增加简单的判断逻辑即可。

修改步骤

  • 第一步:确认你的指定目标名称,必须和coco.names文件里的类别拼写完全一致(比如person对应行人、car对应汽车、cup对应杯子),注意区分大小写。
  • 第二步:调用getObjects函数时传入你要检测的目标列表,让模型只返回你关心的目标结果,减少不必要的计算。
  • 第三步:在主循环中根据返回的objectInfo长度判断是否检测到目标,分别打印对应内容即可。

完整修改后代码(以检测行人为例)

import cv2
import time

classNames = []
classFile = "/home/pi/Desktop/Object_Detection_Files/coco.names"
with open(classFile,"rt") as f:
    classNames = f.read().rstrip("\n").split("\n")

configPath = "/home/pi/Desktop/Object_Detection_Files/ssd_mobilenet_v3_large_coco_2020_01_14.pbtxt"
weightsPath = "/home/pi/Desktop/Object_Detection_Files/frozen_inference_graph.pb"

net = cv2.dnn_DetectionModel(weightsPath,configPath)
net.setInputSize(320,320)
net.setInputScale(1.0/ 127.5)
net.setInputMean((127.5, 127.5, 127.5))
net.setInputSwapRB(True)


def getObjects(img, thres, nms, draw=True, objects=[]):
    classIds, confs, bbox = net.detect(img,confThreshold=thres,nmsThreshold=nms)
    if len(objects) == 0: objects = classNames
    objectInfo =[]
    if len(classIds) != 0:
        for classId, confidence,box in zip(classIds.flatten(),confs.flatten(),bbox):
            className = classNames[classId - 1]
            if className in objects: 
                objectInfo.append([box,className])
                if (draw):
                    cv2.rectangle(img,box,color=(0,255,0),thickness=2)
                    cv2.putText(img,classNames[classId-1].upper(),(box[0]+10,box[1]+30),
                    cv2.FONT_HERSHEY_COMPLEX,1,(0,255,0),2)
                    cv2.putText(img,str(round(confidence*100,2)),(box[0]+200,box[1]+30),
                    cv2.FONT_HERSHEY_COMPLEX,1,(0,255,0),2)
    
    return img,objectInfo


if __name__ == "__main__":
    # 在这里定义你要检测的指定目标,多个目标可以写为["person", "cup", "car"]
    TARGET_OBJECT = ["person"]

    cap = cv2.VideoCapture(0)
    cap.set(3,640)
    cap.set(4,480)
    
    while True:
        success, img = cap.read()
        # 传入要检测的目标列表
        result, objectInfo = getObjects(img,0.45,0.2, objects=TARGET_OBJECT)
        
        # 新增的判断打印逻辑
        if len(objectInfo) > 0:
            print("检测到指定目标物体")
            # 你也可以自定义打印内容,比如打印检测到的数量:print(f"检测到{len(objectInfo)}个目标")
        else:
            print("未检测到指定目标物体")
        
        # 如果觉得打印太快刷屏,可以加下面这行控制每秒最多打印1次
        # time.sleep(1)

        cv2.imshow("Output",img)
        cv2.waitKey(1)

注意事项

  • 如果出现漏检可以把getObjects的第二个参数(0.45)适当调低,出现误检可以适当调高。
  • 请确认代码开头的三个文件路径和你本地的实际存储路径完全一致,否则会运行报错。

内容的提问来源于stack exchange,提问作者Mir Muhammad Abidul Haq Ahnaf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 05:24:07