2019年11月25日开发手记
对滤波后的图像做行列投影,通过阈值得到运动图像横纵坐标点集。使用水平与竖直投影算法,投影算法的时间复杂度为O(x2),哪怕进行优化也最多可变为O(xlogx),时间上无法接受。再次使用傅里叶变换?还是将目标放在轮廓点整合?
使用竖直投影法的话还不如直接遍历所有点找轮廓,这对后面进行聚类也比较方便。
决定采用竖直投影+遍历,只进行一次投影,在投影过程中将点逐个遍历,高亮点的横纵坐标压入栈,输出横纵坐标的最大值和最小值。
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)]
# 记录每一列的波峰
for j in range(0, w): # 遍历一列
q_1=0
for i in range(0, h): # 遍历一行
#print(1)
#print(img[i, j])
if img[i, j] !=0: # 如果该点为白点
print(1)
if q_1 ==0:
i_1=i
i_2=i
q_1=1
a[j] += 1 # 该列的计数器加一计数
if q_1!=0:
l.push(j)
h_1.push(i_1)
h_1.push(i_2)
if len(h_1.stack) != 0 and len(l.stack) != 0:
max=h_1.stack[0]
min=h_1.stack[0]
for i in range(len(h_1.stack)):
if h_1.stack[i]>max:
max=h_1.stack[i]
if h_1.stack[i]<min:
min=h_1.stack[i]
return min,l.stack[0],max,l.stack[len(l.stack)-1]
else:
return 0,0,0,0
问题:似乎进不去判断函数,也就是img中所有点都为0,但在调试中img确有非0点。
问题解决:缩进错误
新算法的效果确实变得更好了,但速度也变得更慢了,为80ms左右。尝试使用python的切片操作,对二维数组进行横向累加,从而达到减少迭代次数的目的。
在滤波函数中加上一句:iimg[index,:][iimg[index, :] > 200] = 0 似乎出现了一个新特点:运动的物体在运动的反方向一侧的边缘会出现高亮。
换而言之,图像出现了方向性,这对后面的分类与识别应该有些特殊的意义。