2019年11月25日開發手記
阿新 • • 發佈:2019-11-26
對濾波後的影象做行列投影,通過閾值得到運動影象橫縱座標點集。使用水平與豎直投影演算法,投影演算法的時間複雜度為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 似乎出現了一個新特點:運動的物體在運動的反方向一側的邊緣會出現高亮。
換而言之,影象出現了方向性,這對後面的分類與識別應該有些特殊的意義