基于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
相关产品推荐
相关产品推荐

