OpenCV视频学习笔记(19)-项目实战-目标追踪

十九、项目实战-目标追踪

步骤:
导入代码;
配置图片/视频参数,以及要使用的OpenCV中的算法(kcf算法);
可执行单任务单目标/多任务多目标的追踪;
Multi_object_tracking.py
import argparse
import time
import cv2
import numpy as np

// 配置参数
ap = argparse.ArgumentParser()
ap.add_argument("-v", “–video”, type=str,
help=“path to input video file”)
ap.add_argument("-t", “–tracker”, type=str, default=“kcf”,
help=“OpenCV object tracker type”)
args = vars(ap.parse_args())

// opencv已经实现了的追踪算法
OPENCV_OBJECT_TRACKERS = {
“csrt”: cv2.TrackerCSRT_create,
“kcf”: cv2.TrackerKCF_create, #基于相关滤波进行追踪
“boosting”: cv2.TrackerBoosting_create,
“mil”: cv2.TrackerMIL_create
“tld”: cv2.TrackerTLD_create,
“medianflow”: cv2.TrackerMedianFlow_create,
“mosse”: cv2.TrackerMOSSE_create
}

//实例化OpenCV’s multi-object tracker
trackers = cv2.MultiTracker_create()
vs = cv2.VideoCapture(args[“video”])

// 视频流
while True:
# 取当前帧
frame = vs.read()
# (true, data)
frame = frame[1]
# 到头了就结束
if frame is None:#判断是不是最后一帧
break

# resize每一帧,视频不能太大
(h, w) = frame.shape[:2]
width=600
r = width / float(w)#按照相应的比例进行放缩
dim = (width, int(h * r))
frame = cv2.resize(frame, dim, interpolation=cv2.INTER_AREA)

# 追踪结果
(success, boxes) = trackers.update(frame)

# 绘制区域
for box in boxes:
	(x, y, w, h) = [int(v) for v in box]
	cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)

# 显示
cv2.imshow("Frame", frame)
key = cv2.waitKey(100) & 0xFF

if key == ord("s"):
	# 选择一个区域,按s
	box = cv2.selectROI("Frame", frame, fromCenter=False,
		showCrosshair=True) #选择感兴趣的区域框出来 

	# 创建一个新的追踪器
	tracker = OPENCV_OBJECT_TRACKERS[args["tracker"]]()
	trackers.add(tracker, frame, box)

# 退出
elif key == 27:
	break

vs.release()
cv2.destroyAllWindows()
不能手动框选时,先对物体进行检测,再对物体进行跟踪,要用到caffe网络模型:
#导入工具包
from utils import FPS
import numpy as np
import argparse
import dlib
import cv2
“”"
–prototxt mobilenet_ssd/MobileNetSSD_deploy.prototxt
–model mobilenet_ssd/MobileNetSSD_deploy.caffemodel
–video race.mp4
“”"
// 参数
ap = argparse.ArgumentParser()
ap.add_argument("-p", “–prototxt”, required=True,
help=“path to Caffe ‘deploy’ prototxt file”)
ap.add_argument("-m", “–model”, required=True,
help=“path to Caffe pre-trained model”)
ap.add_argument("-v", “–video”, required=True,
help=“path to input video file”)
ap.add_argument("-o", “–output”, type=str,
help=“path to optional output video file”)
ap.add_argument("-c", “–confidence”, type=float, default=0.2,
help=“minimum probability to filter weak detections”)
args = vars(ap.parse_args())

//SSD标签
CLASSES = [“background”, “aeroplane”, “bicycle”, “bird”, “boat”,
“bottle”, “bus”, “car”, “cat”, “chair”, “cow”, “diningtable”,
“dog”, “horse”, “motorbike”, “person”, “pottedplant”, “sheep”,
“sofa”, “train”, “tvmonitor”]

// 读取网络模型
print("[INFO] loading model…")
net = cv2.dnn.readNetFromCaffe(args[“prototxt”], args[“model”])

// 初始化
print("[INFO] starting video stream…")
vs = cv2.VideoCapture(args[“video”])
writer = None

//一会要追踪多个目标
trackers = []
labels = []

// 计算FPS
fps = FPS().start()

while True:
# 读取一帧
(grabbed, frame) = vs.read()

# 是否是最后了
if frame is None:
	break

# 预处理操作
(h, w) = frame.shape[:2]
width=600
r = width / float(w)
dim = (width, int(h * r))
frame = cv2.resize(frame, dim, interpolation=cv2.INTER_AREA)
rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

# 如果要将结果保存的话
if args["output"] is not None and writer is None:
	fourcc = cv2.VideoWriter_fourcc(*"MJPG")
	writer = cv2.VideoWriter(args["output"], fourcc, 30,
		(frame.shape[1], frame.shape[0]), True)

# 先检测 再追踪
if len(trackers) == 0:
	# 获取blob数据
	(h, w) = frame.shape[:2]
	blob = cv2.dnn.blobFromImage(frame, 0.007843, (w, h), 127.5)

	# 得到检测结果
	net.setInput(blob)
	detections = net.forward()

	# 遍历得到的检测结果
	for i in np.arange(0, detections.shape[2]):
		# 能检测到多个结果,只保留概率高的
		confidence = detections[0, 0, i, 2]

		# 过滤
		if confidence > args["confidence"]:
			# extract the index of the class label from the
			# detections list
			idx = int(detections[0, 0, i, 1])
			label = CLASSES[idx]

			# 只保留人的
			if CLASSES[idx] != "person":
				continue

			# 得到BBOX
			#print (detections[0, 0, i, 3:7])
			box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
			(startX, startY, endX, endY) = box.astype("int")

			# 使用dlib来进行目标追踪
			#http://dlib.net/python/index.html#dlib.correlation_tracker
			t = dlib.correlation_tracker()
			rect = dlib.rectangle(int(startX), int(startY), int(endX), int(endY))
			t.start_track(rgb, rect)

			# 保存结果
			labels.append(label)
			trackers.append(t)

			# 绘图
			cv2.rectangle(frame, (startX, startY), (endX, endY),
				(0, 255, 0), 2)
			cv2.putText(frame, label, (startX, startY - 15),
				cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 255, 0), 2)

# 如果已经有了框,就可以直接追踪了
else:
	# 每一个追踪器都要进行更新
	for (t, l) in zip(trackers, labels):
		t.update(rgb)
		pos = t.get_position()

		# 得到位置
		startX = int(pos.left())
		startY = int(pos.top())
		endX = int(pos.right())
		endY = int(pos.bottom())

		# 画出来
		cv2.rectangle(frame, (startX, startY), (endX, endY),
			(0, 255, 0), 2)
		cv2.putText(frame, l, (startX, startY - 15),
			cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 255, 0), 2)

# 也可以把结果保存下来
if writer is not None:
	writer.write(frame)

# 显示
cv2.imshow("Frame", frame)
key = cv2.waitKey(1) & 0xFF

# 退出
if key == 27:
	break

# 计算FPS
fps.update()

fps.stop()
print("[INFO] elapsed time: {:.2f}".format(fps.elapsed()))
print("[INFO] approx. FPS: {:.2f}".format(fps.fps()))

if writer is not None:
writer.release()

cv2.destroyAllWindows()
vs.release()
优化追踪器为多进程:
from utils import FPS
import multiprocessing
import numpy as np
import argparse
import dlib
import cv2
#perfmon

def start_tracker(box, label, rgb, inputQueue, outputQueue):
t = dlib.correlation_tracker()
rect = dlib.rectangle(int(box[0]), int(box[1]), int(box[2]), int(box[3]))
t.start_track(rgb, rect)

while True:
	# 获取下一帧
	rgb = inputQueue.get()

	# 非空就开始处理
	if rgb is not None:
		# 更新追踪器
		t.update(rgb)
		pos = t.get_position()

		startX = int(pos.left())
		startY = int(pos.top())
		endX = int(pos.right())
		endY = int(pos.bottom())

		# 把结果放到输出q
		outputQueue.put((label, (startX, startY, endX, endY)))

ap = argparse.ArgumentParser()
ap.add_argument("-p", “–prototxt”, required=True,
help=“path to Caffe ‘deploy’ prototxt file”)
ap.add_argument("-m", “–model”, required=True,
help=“path to Caffe pre-trained model”)
ap.add_argument("-v", “–video”, required=True,
help=“path to input video file”)
ap.add_argument("-o", “–output”, type=str,
help=“path to optional output video file”)
ap.add_argument("-c", “–confidence”, type=float, default=0.2,
help=“minimum probability to filter weak detections”)
args = vars(ap.parse_args())

//一会要放多个追踪器
inputQueues = []
outputQueues = []

CLASSES = [“background”, “aeroplane”, “bicycle”, “bird”, “boat”,
“bottle”, “bus”, “car”, “cat”, “chair”, “cow”, “diningtable”,
“dog”, “horse”, “motorbike”, “person”, “pottedplant”, “sheep”,
“sofa”, “train”, “tvmonitor”]

print("[INFO] loading model…")
net = cv2.dnn.readNetFromCaffe(args[“prototxt”], args[“model”])

print("[INFO] starting video stream…")
vs = cv2.VideoCapture(args[“video”])
writer = None

fps = FPS().start()

if name == ‘main’:

while True:
	(grabbed, frame) = vs.read()

	if frame is None:
		break

	(h, w) = frame.shape[:2]
	width=600
	r = width / float(w)
	dim = (width, int(h * r))
	frame = cv2.resize(frame, dim, interpolation=cv2.INTER_AREA)
	rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

	if args["output"] is not None and writer is None:
		fourcc = cv2.VideoWriter_fourcc(*"MJPG")
		writer = cv2.VideoWriter(args["output"], fourcc, 30,
			(frame.shape[1], frame.shape[0]), True)

	#首先检测位置
	if len(inputQueues) == 0:
		(h, w) = frame.shape[:2]
		blob = cv2.dnn.blobFromImage(frame, 0.007843, (w, h), 127.5)
		net.setInput(blob)
		detections = net.forward()
		for i in np.arange(0, detections.shape[2]):
			confidence = detections[0, 0, i, 2]
			if confidence > args["confidence"]:
				idx = int(detections[0, 0, i, 1])
				label = CLASSES[idx]
				if CLASSES[idx] != "person":
					continue
				box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
				(startX, startY, endX, endY) = box.astype("int")
				bb = (startX, startY, endX, endY)

				# 创建输入q和输出q
				iq = multiprocessing.Queue()
				oq = multiprocessing.Queue()
				inputQueues.append(iq)
				outputQueues.append(oq)
				
				# 多核
				p = multiprocessing.Process(
					target=start_tracker,
					args=(bb, label, rgb, iq, oq))
				p.daemon = True
				p.start()
				
				cv2.rectangle(frame, (startX, startY), (endX, endY),
					(0, 255, 0), 2)
				cv2.putText(frame, label, (startX, startY - 15),
					cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 255, 0), 2)

	else:
		# 多个追踪器处理的都是相同输入
		for iq in inputQueues:
			iq.put(rgb)

		for oq in outputQueues:
			# 得到更新结果
			(label, (startX, startY, endX, endY)) = oq.get()

			# 绘图
			cv2.rectangle(frame, (startX, startY), (endX, endY),
				(0, 255, 0), 2)
			cv2.putText(frame, label, (startX, startY - 15),
				cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 255, 0), 2)

	if writer is not None:
		writer.write(frame)

	cv2.imshow("Frame", frame)
	key = cv2.waitKey(1) & 0xFF
	if key == 27:
		break

	fps.update()
fps.stop()
print("[INFO] elapsed time: {:.2f}".format(fps.elapsed()))
print("[INFO] approx. FPS: {:.2f}".format(fps.fps()))

if writer is not None:
	writer.release()

cv2.destroyAllWindows()
vs.release()
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值