# HG changeset patch # User Laman # Date 2019-02-07 11:27:25 # Node ID 6d4447a2e0509128d3567db00bff34d823890f71 # Parent ffa9f7f12374f95efd6869191cd62c4d93c0fffb filtering close points, detecting dominant angles diff --git a/exp/hough.py b/exp/hough.py --- a/exp/hough.py +++ b/exp/hough.py @@ -1,5 +1,7 @@ +import sys +sys.path.append("../src") + import os -import sys import math from datetime import datetime import logging as log @@ -8,6 +10,7 @@ import numpy as np import cv2 as cv from annotations import DataFile,computeBoundingBox +from analyzer.epoint import EPoint class HoughTransform: @@ -23,7 +26,12 @@ class HoughTransform: maxVal=self._acc.max() arr=np.expand_dims(np.uint8(255*self._acc//maxVal),axis=2) img=np.concatenate((arr,arr,arr),axis=2) - log.debug(sorted(list(findPeaks(self._acc)),key=lambda rc: self._acc[rc],reverse=True)[:2*19]) + peaks=sorted(list(findPeaks(self._acc)),key=lambda rc: self._acc[rc],reverse=True)[:2*19] + peaks=self._filterClose(peaks) + peaks=[(alpha,d) if alpha<180 else (alpha-180,-d) for (alpha,d) in peaks] + peaks.sort(key=lambda rc: rc[0]) + log.debug("detected peaks: %s",peaks) + self._detectDominantAngles(peaks) show(img,"Hough transform accumulator") def update(self,img,weight=1): @@ -43,8 +51,44 @@ class HoughTransform: d=dx*math.cos(alphaRad)+dy*math.sin(alphaRad) return int(d) + def _filterClose(self,peaks): # a naive implementation + minDist=10 + center=EPoint(*self._center) + res=[] + for (alphaDeg,d) in peaks: + alphaRad=alphaDeg*math.pi/180 + point=EPoint.fromPolar((alphaRad,d),center) + ctrl=True + for (betaDeg,e) in peaks: + betaRad=betaDeg*math.pi/180 + point_=EPoint.fromPolar((betaRad,e),center) + if point.dist(point_)angles[k2]) or (k2>=n and angles[k1]+bandwidth>angles[k2%n]+180): + k2+=1 + histogram.append((angles[k1],k2-k1)) + k1+=1 + log.debug("angles histogram: %s",histogram) + dominantAngles=sorted(histogram,key=lambda xy: xy[1],reverse=True) + alpha=dominantAngles[0] + dominantAngles=[beta for beta in dominantAngles if 165>abs(alpha[0]-beta[0])>15] + beta=dominantAngles[0] + log.debug("dominant angles: %s, %s",alpha,beta) + return (alpha[0],beta[0]) + + +def findPeaks(arr2d): # a naive implementation (h,w)=arr2d.shape neighbours=[(-1,-1),(-1,0),(-1,1),(0,-1),(0,1),(1,-1),(1,0),(1,1)] for r in range(h):