diff --git a/exp/hough.py b/exp/hough.py --- a/exp/hough.py +++ b/exp/hough.py @@ -19,16 +19,16 @@ class LineBag: def __init__(self): self._lines=[] - def put(self,score,alpha,beta): - self._lines.append((score,alpha,beta)) + def put(self,score,alpha,beta,peaks): + self._lines.append((score,alpha,beta,peaks)) def pull(self,count): self._lines.sort(reverse=True) res=[] - for (score,alpha,beta) in self._lines: - if any(abs(alpha-gamma)<10 and abs(beta-delta)<10 for (_,gamma,delta) in res): continue - if any((beta-delta)!=0 and (alpha-gamma)/(beta-delta)<0 for (_,gamma,delta) in res): continue - res.append((score,alpha,beta)) + for (score,alpha,beta,peaks) in self._lines: + if any(abs(alpha-gamma)<10 and abs(beta-delta)<10 for (_,gamma,delta,_) in res): continue + if any((beta-delta)!=0 and (alpha-gamma)/(beta-delta)<0 for (_,gamma,delta,_) in res): continue + res.append((score,alpha,beta,peaks)) if len(res)>=count: break return res @@ -46,11 +46,14 @@ class HoughTransform: def extract(self): img=self._createImg() + self.show(img) (ab,cd)=self._detectLines() - for (score,alpha,beta) in (ab,cd): + i=0 + for (score,alpha,beta,peaks) in (ab,cd): log.debug("score: %s",score) log.debug("alpha, beta: %s, %s",alpha,beta) - cv.line(img,(0,alpha),(self._diagLen-1,beta),(0,255,255)) + self._drawLine(img,alpha,beta,peaks,i) + i+=1 self.show(img) @@ -112,24 +115,23 @@ class HoughTransform: def _detectLines(self): bag=LineBag() - for alpha in range(0,180,2): - for beta in range(alpha-45,alpha+45,2): - accLine=self._readLine(alpha,beta) + for alpha in range(0,180,3): + for beta in range(min(alpha-60,0),alpha+60,3): + accLine=[self._acc[key] for key in self._readLineKeys(alpha,beta)] (peaks,props)=scipy.signal.find_peaks(accLine,prominence=0) - prominences=sorted(props["prominences"],reverse=True)[:19] - bag.put(sum(prominences),alpha,beta) + (prominences,peaks)=zip(*sorted(zip(props["prominences"],peaks),reverse=True)[:19]) + bag.put(sum(prominences),alpha,beta,peaks) return bag.pull(2) - def _readLine(self,alpha,beta): + def _readLineKeys(self,alpha,beta): n=self._diagLen-1 res=[] for i in range(n+1): k=round((alpha*(n-i)+beta*i)/n) if k<0 or k>=180: - if k<-180 or k>360: print(alpha,beta,i,k) k=k%180 i=n+1-i - res.append(self._acc[k][i]) + res.append((k,i)) return res def _computeGridParams(self,lines): @@ -178,12 +180,24 @@ class HoughTransform: if y=h: continue + img[y,x]=color + for k in peaks: + (y,x)=keys[k] + cv.drawMarker(img,(x,y),color,cv.MARKER_TILTED_CROSS,8) + def drawLine(self,img,line,colorKey=0): colors=[[0,255,255],[255,0,255],[255,255,0]] color=colors[colorKey] (h,w)=img.shape[:2] (a,b,c)=line.toNormal() - print("%",a,b,c) if b==0: return for x in range(1,w,3): y=round((-c-a*x)/b) + (0 if b>=0 else 180)