import cv2,numpy as np,json,sys
# trajectory of the logo anchor: tracker where it holds, the raw magenta patch where it does not; then smoothed
T=json.load(open(sys.argv[1])); d=sys.argv[2]; ax,ay=float(sys.argv[3]),float(sys.argv[4]); a0,a1=int(sys.argv[5]),int(sys.argv[6]); out=sys.argv[7]
P={}
for k,M in T.items():
    M=np.array(M); c=M@[ax,ay,1]; s=float(np.sqrt(abs(np.linalg.det(M[:2,:2])))); th=float(np.arctan2(M[1,0],M[0,0]))
    P[int(k)]=[c[0],c[1],s,th]
first=min(P)
if first>a0:   # patch-anchored lead-in
    def patch(i):
        fr=cv2.imread(f'{d}/f{i:03d}.png').astype(np.float32); b,g,r=fr[...,0],fr[...,1],fr[...,2]
        mg=((r-g>50)&(b-g>30)&(r>140)).astype(np.uint8); mg[:150]=0
        n,l,st,c=cv2.connectedComponentsWithStats(mg); k=1+np.argmax(st[1:,4]); return c[k],st[k][3]
    (pc,ph)=patch(first-1); ref=P[first]; off=(np.array(ref[:2])-pc)/ref[2]
    for i in range(first-1,a0-1,-1):
        c,h=patch(i); s=ref[2]*h/ph; P[i]=[c[0]+off[0]*s,c[1]+off[1]*s,s,ref[3]]
ks=list(range(a0,a1+1)); A=np.array([P[k] for k in ks])
# smooth: scale/angle hard (noisy), position lightly
def g(x,sig):
    r=int(3*sig); w=np.exp(-np.arange(-r,r+1)**2/(2*sig*sig)); xp=np.pad(x,(r,r),mode='edge'); return np.convolve(xp,w/w.sum(),'valid')
S=np.exp(g(np.log(A[:,2]),3.0)); TH=g(A[:,3],4.0); X=g(A[:,0],1.0); Y=g(A[:,1],1.0)
json.dump({k:[X[j],Y[j],S[j],TH[j]] for j,k in enumerate(ks)},open(out,'w'))
for j,k in enumerate(ks[::8]): print(k,[round(v,2) for v in A[j*8]],round(X[j*8]),round(Y[j*8]),round(S[j*8],3))
