Files
@ ffa9f7f12374
Branch filter:
Location: OneEye/exp/geometry.py - annotation
ffa9f7f12374
1.6 KiB
text/x-python
experimenting with own Hough transform
7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e ffa9f7f12374 ffa9f7f12374 ffa9f7f12374 ffa9f7f12374 ffa9f7f12374 ffa9f7f12374 ffa9f7f12374 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e 7dd3594c335e | import math
import numpy as np
from analyzer.epoint import EPoint, homogenize
from analyzer.grid import transformPoint
class Line():
def __init__(self,a,b):
self.a=a
self.b=b
self.points={a,b}
def getSortedPoints(self):
return tuple(sorted(self.points))
def computeAngle(self,line):
ab=self.a-self.b
cd=line.a-line.b
alpha=math.atan(ab.y/ab.x)
gamma=math.atan(cd.y/cd.x)
fi=max(alpha,gamma)-min(alpha,gamma)
return min(fi,math.pi-fi)
def intersect(self,line):
p=self.toProjective()
q=line.toProjective()
return EPoint.fromProjective(np.cross(p,q))
def toProjective(self):
return homogenize(np.cross(self.a.toProjective(),self.b.toProjective()))
def transform(self,matrix):
a=EPoint.fromProjective(transformPoint(self.a.toProjective(),matrix))
b=EPoint.fromProjective(transformPoint(self.b.toProjective(),matrix))
if a is None or b is None: return None
return Line(a,b)
def score(self,points):
score=len(self.points)
for a in self.points:
closest=sorted(points,key=lambda b: a.dist(b))[:4]
score+=sum(0.01 for b in closest if b in self.points)
return score
def __str__(self): return "({0},{1})".format(self.a,self.b)
def __repr__(self): return "Line({0},{1})".format(repr(self.a),repr(self.b))
def point2lineDistance(a,b,p):
# https://en.wikipedia.org/wiki/Point-line_distance#Line_defined_by_two_points
ab=b-a
num=abs(ab.y*p.x - ab.x*p.y + b.x*a.y - a.x*b.y)
denum=math.sqrt(ab.y**2+ab.x**2)
return num/denum # double_area / side_length == height
def angleDiff(alpha,beta):
diff=abs(alpha-beta)
if diff>math.pi: diff=2*math.pi-diff
return diff
|