123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- import numpy as np
- def pline(x1, y1, x2, y2, x, y):
- px = x2 - x1
- py = y2 - y1
- dd = px * px + py * py
- u = ((x - x1) * px + (y - y1) * py) / max(1e-9, float(dd))
- dx = x1 + u * px - x
- dy = y1 + u * py - y
- return dx * dx + dy * dy
- def psegment(x1, y1, x2, y2, x, y):
- px = x2 - x1
- py = y2 - y1
- dd = px * px + py * py
- u = max(min(((x - x1) * px + (y - y1) * py) / float(dd), 1), 0)
- dx = x1 + u * px - x
- dy = y1 + u * py - y
- return dx * dx + dy * dy
- def plambda(x1, y1, x2, y2, x, y):
- px = x2 - x1
- py = y2 - y1
- dd = px * px + py * py
- return ((x - x1) * px + (y - y1) * py) / max(1e-9, float(dd))
- def postprocess(lines, scores, threshold=0.01, tol=1e9, do_clip=False):
- nlines, nscores = [], []
- for (p, q), score in zip(lines, scores):
- start, end = 0, 1
- for a, b in nlines:
- if (
- min(
- max(pline(*p, *q, *a), pline(*p, *q, *b)),
- max(pline(*a, *b, *p), pline(*a, *b, *q)),
- )
- > threshold ** 2
- ):
- continue
- lambda_a = plambda(*p, *q, *a)
- lambda_b = plambda(*p, *q, *b)
- if lambda_a > lambda_b:
- lambda_a, lambda_b = lambda_b, lambda_a
- lambda_a -= tol
- lambda_b += tol
- # case 1: skip (if not do_clip)
- if start < lambda_a and lambda_b < end:
- continue
- # not intersect
- if lambda_b < start or lambda_a > end:
- continue
- # cover
- if lambda_a <= start and end <= lambda_b:
- start = 10
- break
- # case 2 & 3:
- if lambda_a <= start and start <= lambda_b:
- start = lambda_b
- if lambda_a <= end and end <= lambda_b:
- end = lambda_a
- if start >= end:
- break
- if start >= end:
- continue
- nlines.append(np.array([p + (q - p) * start, p + (q - p) * end]))
- nscores.append(score)
- return np.array(nlines), np.array(nscores)
- def postprocess_keypoint(lines, scores, threshold=0.01, tol=1e9, do_clip=False):
- nlines, nscores = [], []
- for (p, q), score in zip(lines, scores):
- start, end = 0, 1
- for a, b in nlines:
- if (
- min(
- max(pline(*p, *q, *a), pline(*p, *q, *b)),
- max(pline(*a, *b, *p), pline(*a, *b, *q)),
- )
- > threshold ** 2
- ):
- continue
- lambda_a = plambda(*p, *q, *a)
- lambda_b = plambda(*p, *q, *b)
- if lambda_a > lambda_b:
- lambda_a, lambda_b = lambda_b, lambda_a
- lambda_a -= tol
- lambda_b += tol
- # case 1: skip (if not do_clip)
- if start < lambda_a and lambda_b < end:
- continue
- # not intersect
- if lambda_b < start or lambda_a > end:
- continue
- # cover
- if lambda_a <= start and end <= lambda_b:
- start = 10
- break
- # case 2 & 3:
- if lambda_a <= start and start <= lambda_b:
- start = lambda_b
- if lambda_a <= end and end <= lambda_b:
- end = lambda_a
- if start >= end:
- break
- if start >= end:
- continue
- nlines.append(np.array([p + (q - p) * start, p + (q - p) * end]))
- nscores.append(min(score[0],score[1]))
- return np.array(nlines), np.array(nscores)
|