OpenCv-Python 目标跟踪
·
一 、参考资料
文档
OpenCV官方教程中文版(For Python)段力辉 译 (2014)
博客
camshift原理解析 鲸失
https://blog.csdn.net/wolflikeinnocence/article/details/89762848
卡尔曼滤波器和连续自适应漂移组合进行目标跟踪:kalman+camshift
二、
camshift原理解析
1.运行程序,出现show窗口;
2.按下鼠标左键,拖选目标区域;
3.show1窗口为目标截图,show2窗口为亮度,show窗口出现绿色检测框
4.按下Esc,退出程序
(会出现警告:SourceReaderCB::~SourceReaderCB terminating async callback)# 不重要
import cv2
import numpy as np
xs, ys, ws, hs = 0, 0, 0, 0 # selection.x selection.y
xo, yo = 0, 0 # origin.x origin.y
selectObject = False
trackObject = 0
HasFirst = False
def on_mouse(event, x, y, flags, params):
global xs, ys, ws, hs, selectObject, xo, yo, trackObject
if selectObject is True:
xs = min(x, xo)
ys = min(y, yo)
ws = abs(x - xo)
hs = abs(y - yo)
if event == cv2.EVENT_LBUTTONDOWN:
xo, yo = x, y
xs, ys, ws, hs = x, y, 0, 0
selectObject = True
elif event == cv2.EVENT_LBUTTONUP:
selectObject = False
trackObject = -1
cap = cv2.VideoCapture(0)
ret, frame = cap.read()
cv2.namedWindow('show')
cv2.setMouseCallback('show', on_mouse)
term_criteria = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1)
while True:
ret, frame = cap.read()
if trackObject != 0:
hsv = cv2.cvtColor(frame, cv2.COLOR_RGB2HSV)
mask = cv2.inRange(hsv, np.array((0., 30., 10.)), np.array((180., 256., 255.)))
if trackObject == -1:
track_window = (xs, ys, ws, hs)
mask_roi = mask[ys:ys + hs, xs:xs + ws]
hsv_roi = hsv[ys:ys + hs, xs:xs + ws]
roi_hist = cv2.calcHist([hsv_roi], [0], mask_roi, [180], [0, 180])
cv2.normalize(roi_hist, roi_hist, 0, 255, cv2.NORM_MINMAX)
trackObject = 1
dst = cv2.calcBackProject([hsv], [0], roi_hist, [0, 180], 1)
dst &= mask
cv2.imshow("show2", dst)
ret, track_window = cv2.CamShift(dst, track_window, term_criteria)
cv2.rectangle(frame, (track_window[0], track_window[1]),
(track_window[0] + track_window[2], track_window[1] + track_window[3]), (0, 255, 0), 2)
pts = cv2.boxPoints(ret)
pts = np.int0(pts)
if selectObject is True and ws > 0 and hs > 0:
cv2.imshow('show1', frame[ys:ys + hs, xs:xs + ws])
cv2.bitwise_not(frame[ys:ys + hs, xs:xs + ws], frame[ys:ys + hs, xs:xs + ws])
cv2.imshow('show', frame)
if cv2.waitKey(10) == 27:
break
cap.release()
cv2.destroyAllWindows()
kalman+camshift
1.视频文件girl.mp4存放在py文件同目录下
2.运行程序,出现image窗口,鼠标左键点击 目标的左上点和右下点
3.按下C(其他键也行),弹出带蓝框的img窗口,和带检测的img2窗口
4.视频文件来源:http://cvlab.hanyang.ac.kr/tracker_benchmark/datasets.html
5.结果

import cv2
import numpy as np
#调用本地摄像头
cap = cv2.VideoCapture('girl.mp4')
#获取第一帧图像
ret, frame = cap.read()
a =[]#横坐标
b = []#纵坐标
#鼠标左键按下记录坐标
def on_EVENT_LBUTTONDOWN(event, x, y,flags, param):
if event == cv2.EVENT_LBUTTONDOWN:
xy = "%d,%d" % (x, y)
a.append(x)
b.append(y)
cv2.namedWindow("image")
cv2.setMouseCallback("image", on_EVENT_LBUTTONDOWN)
cv2.imshow("image", frame)
cv2.waitKey(0)
print(a,b)
r, h, c, w = a[0], a[1]-a[0],b[0], b[1]-b[0] # simply hardcoded the values
# 画出矩形框
cv2.rectangle(frame,(r,c),(r+h,c+w),(255,0,0),2)
cv2.imshow('img',frame)
cv2.waitKey(2000)
track_window = (c, r, w, h)
roi = frame[r:r + h, c:c + w]
hsv_roi = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv_roi, np.array((160., 30., 32.)), np.array((180., 120., 255.)))
roi_hist = cv2.calcHist([hsv_roi], [0], mask, [180], [0, 180])
cv2.normalize(roi_hist, roi_hist, 0, 255, cv2.NORM_MINMAX)
term_crit = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1)
kalman = cv2.KalmanFilter(4, 2)
kalman.measurementMatrix = np.array([[1, 0, 0, 0], [0, 1, 0, 0]], np.float32)
kalman.transitionMatrix = np.array([[1, 0, 1, 0], [0, 1, 0, 1], [0, 0, 1, 0], [0, 0, 0, 1]], np.float32)
kalman.processNoiseCov = np.array([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]], np.float32) * 0.03
measurement = np.array((2, 1), np.float32)
prediction = np.zeros((2, 1), np.float32)
def center(points):
x = (points[0][0] + points[1][0] + points[2][0] + points[3][0]) / 4.0
y = (points[0][1] + points[1][1] + points[2][1] + points[3][1]) / 4.0
return np.array([np.float32(x), np.float32(y)], np.float32)
while (1):
ret, frame = cap.read()
if ret == True:
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
dst = cv2.calcBackProject([hsv], [0], roi_hist, [0, 180], 1)
ret, track_window = cv2.CamShift(dst, track_window, term_crit)
pts = cv2.boxPoints(ret)
pts = np.int0(pts)
(cx, cy), radius = cv2.minEnclosingCircle(pts)
kalman.correct(center(pts))
img2 = cv2.polylines(frame, [pts], True, 255, 2)
prediction = kalman.predict()
cv2.circle(frame, (prediction[0], prediction[1]), int(radius), (0, 255, 0))
cv2.imshow('img2', img2)
k = cv2.waitKey(60) & 0xff
if k == 27:
break
else:
break
cap.release()
cv2.destroyAllWindows()
存档
更多推荐
所有评论(0)