You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
118 lines
2.8 KiB
118 lines
2.8 KiB
import sys
|
|
from PIL import Image
|
|
from numpy import *
|
|
from matplotlib.pyplot import *
|
|
|
|
|
|
def show_correspondences( img0, img1, corr ):
|
|
assert corr.shape[-1]==6
|
|
corr = corr[corr[:,4]>0,:]
|
|
|
|
# make beautiful colors
|
|
center = corr[:,[1,0]].mean(axis=0) # array(img0.shape[:2])/2 #
|
|
corr[:,5] = arctan2(*(corr[:,[1,0]] - center).T)
|
|
corr[:,5] = int32(64*corr[:,5]/pi) % 128
|
|
|
|
set_max = set(corr[:,5])
|
|
colors = {m:i for i,m in enumerate(set_max)}
|
|
colors = {m:cm.hsv(i/float(len(colors))) for m,i in colors.items()}
|
|
|
|
def motion_notify_callback(event):
|
|
if event.inaxes==None: return
|
|
numaxis = event.inaxes.numaxis
|
|
if numaxis<0: return
|
|
x,y = event.xdata, event.ydata
|
|
ax1.lines = []
|
|
ax2.lines = []
|
|
n = sum((corr[:,2*numaxis:2*(numaxis+1)] - [x,y])**2,1).argmin() # find nearest point
|
|
x,y = corr[n,0:2]
|
|
ax1.plot(x,y,'+',ms=10,mew=2,color='blue',scalex=False,scaley=False)
|
|
x,y = corr[n,2:4]
|
|
ax2.plot(x,y,'+',ms=10,mew=2,color='red',scalex=False,scaley=False)
|
|
# we redraw only the concerned axes
|
|
renderer = fig.canvas.get_renderer()
|
|
ax1.draw(renderer)
|
|
ax2.draw(renderer)
|
|
fig.canvas.blit(ax1.bbox)
|
|
fig.canvas.blit(ax2.bbox)
|
|
|
|
def noticks():
|
|
xticks([])
|
|
yticks([])
|
|
clf()
|
|
ax1 = subplot(221)
|
|
ax1.numaxis = 0
|
|
imshow(img0,interpolation='nearest')
|
|
noticks()
|
|
ax2 = subplot(222)
|
|
ax2.numaxis = 1
|
|
imshow(img1,interpolation='nearest')
|
|
noticks()
|
|
|
|
ax = subplot(223)
|
|
ax.numaxis = -1
|
|
imshow(img0,interpolation='nearest')
|
|
for m in set_max:
|
|
plot(corr[corr[:,5]==m,0],corr[corr[:,5]==m,1],'+',ms=10,mew=2,color=colors[m],scalex=0,scaley=0)
|
|
noticks()
|
|
|
|
ax = subplot(224)
|
|
ax.numaxis = -1
|
|
imshow(img1,interpolation='nearest')
|
|
for m in set_max:
|
|
plot(corr[corr[:,5]==m,2],corr[corr[:,5]==m,3],'+',ms=10,mew=2,color=colors[m],scalex=0,scaley=0)
|
|
noticks()
|
|
show()
|
|
subplots_adjust(left=0.01, bottom=0.01, right=0.99, top=0.99,
|
|
wspace=0.02, hspace=0.02)
|
|
|
|
fig = get_current_fig_manager().canvas.figure
|
|
cid_move = fig.canvas.mpl_connect('motion_notify_event',motion_notify_callback)
|
|
|
|
show()
|
|
fig.canvas.mpl_disconnect(cid_move)
|
|
|
|
|
|
|
|
if __name__=='__main__':
|
|
args = sys.argv[1:]
|
|
img0 = array(Image.open(args[0]).convert('RGB'))
|
|
img1 = array(Image.open(args[1]).convert('RGB'))
|
|
|
|
retained_matches = []
|
|
for line in sys.stdin:
|
|
line = line.split()
|
|
if not line or len(line)!=6 or not line[0][0].isdigit(): continue
|
|
x0, y0, x1, y1, score, index = line
|
|
retained_matches.append((float(x0),float(y0),float(x1),float(y1),float(score),float(index)))
|
|
|
|
assert retained_matches, 'error: no matches piped to this program'
|
|
show_correspondences(img0, img1, array(retained_matches))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|