1. 程式人生 > >2019年11月25日開發手記

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 似乎出現了一個新特點:運動的物體在運動的反方向一側的邊緣會出現高亮。
換而言之,影象出現了方向性,這對後面的分類與識別應該有些特殊的意義