對濾波後的影象做行列投影,通過閾值得到運**像橫縱座標點集。使用水平與豎直投影演算法,投影演算法的時間複雜度為o(x2),哪怕進行優化也最多可變為o(xlogx),時間上無法接受。再次使用傅利葉變換?還是將目標放在輪廓點整合?
使用豎直投影法的話還不如直接遍歷所有點找輪廓,這對後面進行聚類也比較方便。
決定採用豎直投影+遍歷,只進行一次投影,在投影過程中將點逐個遍歷,高亮點的橫縱座標壓入棧,輸出橫縱座標的最大值和最小值。
defline_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=1a[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=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 似乎出現了乙個新特點:運動的物體在運動的反方向一側的邊緣會出現高亮。
換而言之,影象出現了方向性,這對後面的分類與識別應該有些特殊的意義。
2023年11月20日開發手記
兩種運動檢測演算法的介紹 幀差法 二維頻域運動目標檢測 通過對動態影象的行列分解,將三維頻域內的運動檢測問題轉化到兩組二維頻域內進行,從而降低了濾波器設計的難度。給出了一種提取主運動能量的自適應濾波演算法,通過剔除背景和雜訊的頻率成分,有效地檢測出運動目標。複雜度分析 針對幀差法進行分析,複雜度主要...
2023年11月21日開發手記
更改了幾處bug 1 將棧由全域性變數變為區域性變數,修正了起始點不變的問題。2 將低通濾波器改為高通濾波器,修正了壓入棧的資料過多問題。f np.fft.fft2 new gray array rows,cols f.shape f 0 fftadd 0 f rows fftadd rows 0 ...
2023年11月28日開發手記
為了方便後面目標識別的處理,將投影求分類的函式嵌入進fft濾波函式中,共同組成fttmovedetect函式,利用python的切片功能實現投影 arryallw arryallw arryh arryallh arryallh arryl 為在投影中分割多目標區域,引入兩個變數 yindexh 與...