如何解决在OpenCV中设置投资回报率
我对OpenCV和Python非常陌生。我已经按照教程使用yolov3-tiny使用YOLO。它可以很好地检测到车辆。但是我需要完成的项目是计算通过特定车道的车辆数量。如果我使用检测到车辆的方法(会出现边界框)进行计数,那么计数会变得非常不准确,因为边界框会不断闪烁(这意味着它将继续定位同一辆车,有时最多定位5次),所以这不是一个好方法。因此,我想了一下,如果到了某个点,我只算一辆车怎么办。我看过很多代码似乎可以做到这一点,但是由于我是初学者,所以我真的很难理解,更不用说在系统中运行它了。他们的样本需要安装很多我做不到的事情,因为它会引发错误。 请在下面查看我的示例代码:
cap = cv2.VideoCapture('rtsp://username:password@xxx.xxx.xxx.xxx:xxx/cam/realmonitor?channel=1')
whT = 320
confThreshold = 0.75
nmsThreshold = 0.3
list_of_vehicles = ["bicycle","car","motorbike","bus","truck"]
classesFile = 'coco.names'
classNames = []
with open(classesFile,'r') as f:
classNames = f.read().rstrip('\n').split('\n')
modelConfiguration = 'yolov3-tiny.cfg'
modelWeights = 'yolov3-tiny.weights'
net = cv2.dnn.readNetFromDarknet(modelConfiguration,modelWeights)
net.setPreferableBackend(cv2.dnn.DNN_BACKEND_OPENCV)
net.setPreferableTarget(cv2.dnn.DNN_TARGET_CPU)
total_vehicle_count = 0
def getVehicleCount(boxes,class_name):
global total_vehicle_count
dict_vehicle_count = {}
if(class_name in list_of_vehicles):
total_vehicle_count += 1
# print(total_vehicle_count)
return total_vehicle_count,dict_vehicle_count
def findObjects(ouputs,img):
hT,wT,cT = img.shape
bbox = []
classIds = []
confs = []
for output in outputs:
for det in output:
scores = det[5:]
classId = np.argmax(scores)
confidence = scores[classId]
if confidence > confThreshold:
w,h = int(det[2] * wT),int(det[3] * hT)
x,y = int((det[0] * wT) - w/2),int((det[1] * hT) - h/2)
bbox.append([x,y,w,h])
classIds.append(classId)
confs.append(float(confidence))
indices = cv2.dnn.NMSBoxes(bbox,confs,confThreshold,nmsThreshold)
for i in indices:
i = i[0]
box = bbox[i]
getVehicleCount(bbox,classNames[classIds[i]])
x,h = box[0],box[1],box[2],box[3]
cv2.rectangle(img,(x,y),(x+w,y+h),(255,255),1)
cv2.putText(img,f'{classNames[classIds[i]].upper()} {int(confs[i]*100)}%',y-10),cv2.FONT_HERSHEY_SIMPLEX,0.6,2)
while True:
success,img = cap.read()
blob = cv2.dnn.blobFromImage(img,1/255,(whT,whT),[0,0],1,crop=False)
net.setInput(blob)
layerNames = net.getLayerNames()
outputnames = [layerNames[i[0]-1] for i in net.getUnconnectedOutLayers()]
# print(outputnames)
outputs = net.forward(outputnames)
findObjects(outputs,img)
cv2.imshow('Image',img)
if cv2.waitKey(1) & 0XFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
使用此代码,根据大小,有时会最多计算1辆车辆的数量,这是非常不准确的。您能告诉我如何创建投资回报率,以便当检测到的车辆通过该点时,这将是唯一的时间。非常感谢。
解决方法
首先,我建议您考虑使用视觉跟踪器来跟踪每个检测到的矩形。即使您有ROI在靠近计数区/线的位置裁剪图像,这也很重要。这是因为即使ROI已本地化,检测也可能会闪烁几次,从而导致计数错误。如果其他车辆可以在第一个仍通过的情况下进入ROI,则尤其有效。
我建议使用广泛使用的dlib
库提供的易于使用的跟踪器。有关使用方法,请参考此example。
您需要定义一条ROI行(在ROI内),而不是在ROI中对检测进行计数。然后,轨迹检测矩形在每个帧中居中。最后,一旦矩形中心通过ROI线,就增加计数器。
关于如何计算通过ROI线的矩形:
- 选择两个点以定义ROI线。
- 使用您的点来找到常规线型公式
ax + by + c = 0
的参数 - 对于每帧,在公式中插入矩形中心坐标,并跟踪结果的符号。
- 如果结果的符号改变,则表示矩形中心已通过线。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。