-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmatch.py
More file actions
78 lines (61 loc) · 2.39 KB
/
Copy pathmatch.py
File metadata and controls
78 lines (61 loc) · 2.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import picarus_takeout
import time
import base64
import msgpack
import numpy as np
import cv2
import pylab
def fit_homography(p, thresh=45, min_inliers=4):
out = cv2.findHomography(np.ascontiguousarray(p[:, 2:]), np.ascontiguousarray(p[:, :2]), cv2.RANSAC, ransacReprojThreshold=thresh)
print(out)
b = project_points(np.ascontiguousarray(p[:, 2:]), out[0]).reshape((-1, 2))
print(np.hstack([b, p[:, :2]]))
if np.sum(out[1]) < min_inliers:
return None
print('Inliers: %f' % np.sum(out[1]))
return out[0]
def project_points(points, h):
return cv2.perspectiveTransform(points.reshape((1, -1, 2)), h)
def click_points(n, im):
fig = pylab.figure(1);
pylab.imshow(im)
def pick(event):
points.append((event.xdata, event.ydata))
print('Picked point %d of %d' % (len(points),n))
fig.canvas.mpl_connect('close_event', lambda _: sys.exit(1))
cid = fig.canvas.mpl_connect('button_press_event', pick)
points = []
print("Click %d points" % (n,))
while len(points) < n:
pylab.waitforbuttonpress()
print "Ok!", points
return points
def imdecode(data):
return cv2.imdecode(np.fromstring(data, dtype=np.uint8), 1)
def image_size(data):
return map(int, imdecode(data).shape)
class ImagePoints(object):
def __init__(self, verbose=False):
model = "kYKia3eDrXBhdHRlcm5fc2NhbGXLP/AAAAAAAACmdGhyZXNoFKdvY3RhdmVzAqRuYW1lu3BpY2FydXMuQlJJU0tJbWFnZUZlYXR1cmUyZA=="
self.model = picarus_takeout.ModelChain(base64.b64decode(model))
self.verbose = verbose
def __call__(self, image):
st = time.time()
try:
return self.model.process_binary(image)
finally:
if self.verbose:
print('ImagePoints[%f]' % (time.time() - st,))
class ImageMatch(object):
def __init__(self, verbose=False):
model = "kYKia3eDqG1heF9kaXN0eKttaW5faW5saWVycwqtcmVwcm9qX3RocmVzaMtAFAAAAAAAAKRuYW1l2gAkcGljYXJ1cy5JbWFnZUhvbW9ncmFwaHlSYW5zYWNIYW1taW5n"
self.model = picarus_takeout.ModelChain(base64.b64decode(model))
self.verbose = verbose
def __call__(self, p0, p1):
st = time.time()
try:
mat, sz = msgpack.loads(self.model.process_binary(msgpack.dumps([p0, p1])))
return np.array(mat).reshape(sz)
finally:
if self.verbose:
print('ImageMatch[%f]' % (time.time() - st,))