利用numpy的矩阵加法函数,成功实现矩阵行列相加,返回投影值,在效果相同的基础上把时间降到了30ms左右。
接下来要将投影值进行聚类,从而达到检测多个运动目标的目的。
def line_trans(img):
l = Stack()
h_1= Stack()
l.isEmpty()
h_1.isEmpty()
#ret, thresh1 = cv2.threshold(img, 25, 255, cv2.THRESH_BINARY) # 将图片进行二值化(130,255)之间的点均变为255(背景)
(h, w) = img.shape # 返回高和宽
a = [0 for z in range(0, w)]
# 记录每一列的波峰
#print(img[74, 103])
for j in range(0, w): # 遍历一列
a[j] = sum(img[:, j])
if a[j]>0:
l.push(j)
for i in range(0, h): # 遍历一列
a[i] = sum(img[i, :])
if a[i]>0:
h_1.push(i)
if len(h_1.stack) != 0 and len(l.stack) != 0:
max_h=h_1.stack[len(h_1.stack)-1]
min_h=h_1.stack[0]
max_l=l.stack[len(l.stack)-1]
min_l=l.stack[0]
return min_h,min_l,max_h,max_l
else:
return 0,0,0,0
接下来对已选定的点集进行聚类,对比一下mean shift与dbscan在处理相同数据集时的速度以及效果。
……
去TMD聚类算法,所有的聚类算法都是基于二维平面的,但我们的算法是利用投影法求得的点集,点集里都是横纵坐标,但这些横纵坐标都不是关联的,也就是说,点集不是二维而是一维的,从某种意义上来说这是一件好事,聚类算法的设计难度降低了——如果从头设计的话,但这对于一个只会造轮子的我来说,绝对不是个好消息。
对于单个或少量运动物体而言,一维的聚类非常简单——只要把间隔足够远的横纵坐标区域当做运动投影即可,但一旦运动区域在横纵坐标重合,那么问题将变得非常麻烦——我们没有办法将重合的横纵点集分开——也不一定,关键在于投影值,重合区域的投影值肯定更大——至少大于两边,可以设计一个阈值,将大于阈值的部分作为重合点,以此为分界点分割目标——但这又受物体大小的影响,emmmm,先弄出来这个再说吧,其他的以后再说。