通过opencv基础知识和一些模型可以实现对生活中的一些物体的检测,并返回相应的名称。
其原理是:利用opencv中的dnn.detectionmodel模型函数和网络中下载的种类数据集和一些模型参数即可实现对现实中一些物品的检测,通过函数返回的类别索引,置信度,坐标,对物体进行框选和判断,通过调用摄像头和设置窗口,以及简单的if语句就可以实现这个系统。
下面是整体代码:
import cv2
cap=cv2.VideoCapture(0)
#设置视频的长和宽
cap.set(3,640)
cap.set(4,480)
#创建一个空列表
class_name_list=[]
#导入类别的数据
class_name_path='opencv_data_ku/coco.names'
#读取文件内容
with open(class_name_path,'rt') as file:
class_name_list=file.read().rstrip('\n').split('\n')
#导入模型文件的参数
con_path='opencv_data_ku/ssd_mobilenet_v3_large_coco_2020_01_14.pbtxt'
weight_path='opencv_data_ku/frozen_inference_graph.pb'
#导入神经网络对象检测的模型
net=cv2.dnn.DetectionModel(weight_path,con_path)
#设置宽度高度
net.setInputSize(320,320)
net.setInputScale(1.0/ 127.5)
net.setInputMean((127.5, 127.5, 127.5))
net.setInputSwapRB(True)
while True:
success,img = cap.read()
#检测函数(返回的是类别索引,置信度,框的坐标)
classIds, confs, bbox = net.detect(img,confThreshold=0.4)#设置的阈值
print(classIds,bbox)
if len(classIds) != 0:
for classId, confidence,box in zip(classIds.flatten(),confs.flatten(),bbox):
cv2.rectangle(img,box,color=(0,255,0),thickness=2)
#返回类别的名字
cv2.putText(img,class_name_list[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)
else:
print('没有检测到对象类别')
cv2.putText(img,'Objects disappear',(100,260),cv2.FONT_HERSHEY_COMPLEX,4,(0,40,255),4)
cv2.imshow("Output",img)
cv2.waitKey(1)
经过运行,可以检测到对应的物体,并输出对应的名称,但有时会出现一个物体显示多个框和多种名称,经调试发现是置信度问题,没有很好的进行甄选,下次会就置信度的阈值问题进行讨论并使用非最大值抑制对代码就行优化。
大家也可以试着尝试不一样的物品,看看会有什么不足之处。
仅供学习参考,如有不足,敬请指正!