一 、参考资料

文档

OpenCV官方教程中文版(For Python)段力辉 译 (2014)

博客

camshift原理解析 鲸失

https://blog.csdn.net/wolflikeinnocence/article/details/89762848

卡尔曼滤波器和连续自适应漂移组合进行目标跟踪:kalman+camshift

https://blog.csdn.net/mago2015/article/details/81566298

二、

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.结果
图片1

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()

存档
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐