研一真的很迷茫啊啊啊
不过既然分到了计算机视觉组,就安下心来慢慢学习吧。欢迎评论指正互相学习啊
--------------------------分割线-----------------------------------
今天听了博士学长的毕业预答辩,做的是目标跟踪方向,目前目标跟踪大致分为三类:
1.生成式目标跟踪方法
2.判别性目标跟踪方法
3.深度学习目标跟踪方法
而meanshift算法属于生成式的目标跟踪方法。
其思路很简单,就是通过概率密度的梯度爬升来寻找局部最优解。
原理我就不赘述了(csdn上讲解还是蛮多的)
直接上代码吧
import cv2
import numpy as np
img1 = cv2.imread("./img/image1.jpg")
img2 = cv2.imread("./img/image2.jpg")
# 目标所在框
frame = img1[270:330, 65:125]
# 跟踪框
track_window = (45, 240, 60, 60)
# roi区域的hsv图像
hsv_roi = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# 取值hsv值在(0,60,32)到(180,255,255)之间的部分
mask = cv2.inRange(hsv_roi, np.array((30., 30., 30.)), np.array((180., 255., 255.)))
# 计算直方图,参数为 图片(可多),通道数,蒙板区域,直方图长度,范围
roi_hist = cv2.calcHist([hsv_roi], [0], mask, [180], [0, 180])
# 归一化
cv2.normalize(roi_hist, roi_hist, 0, 255, cv2.NORM_MINMAX)
# 设置终止条件,迭代10次或者至少移动1次
term_crit = ( cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1)
# 计算每一帧的hsv图像
hsv = cv2.cvtColor(img2, cv2.COLOR_BGR2HSV)
# 计算反向投影
dst = cv2.calcBackProject([hsv], [0], roi_hist, [0,180], 1)
# 调用meanShift算法在dst中寻找目标窗口,找到后返回目标窗口
ret, track_window = cv2.meanShift(dst, track_window, term_crit)
# Draw it on image
x, y, w, h = track_window
print(x, y, w, h)
img2 = cv2.rectangle(img2, (x,y), (x+w,y+h), 255,2)
cv2.imwrite("./img/image2_new.jpg", img2)
cv2.imwrite("./img/new.jpg", dst)
cv2.imwrite("./img/new2.jpg", mask)
因为opencv里已经有了封装好的meanshift函数,所以我们只需要将其应用到目标跟踪上就好了。
具体流程:
1.指定要追踪物体的所在位置
2.求出该物体的反向投影图,大概是这样:
原图:
反向投影图:
可以看到,在反向投影图中,跟踪的物体已经变成了一些与背景有明显区别的像素点
3.接下来就可以使用meanshift算法进行目标跟踪啦
结果:
我这是用两张图片模拟了视频的两帧
1.跟踪物体与环境的区别要很大,而且最好不是黑色(我用黑色检测不出来。。。),
2.物体移动的距离不要太大,不然也追踪不到
----------分割线-------------
视觉这块感觉自己是个小白,求大神给建议。。。。