import subprocess, sys
# 在指定区域取连续帧差分图，做自相关：比较垂直/水平方向的相关峰强度
W,H=480,270
def load(f, xf0,yf0,xf1,yf1):
    vf="scale=%d:%d,crop=%d:%d:%d:%d"%(W,H,int(W*(xf1-xf0)),int(H*(yf1-yf0)),int(W*xf0),int(H*yf0))
    raw=subprocess.run(["ffmpeg","-v","error","-i",f,"-vf",vf,"-pix_fmt","gray","-f","rawvideo","-"],
                       capture_output=True).stdout
    cw=int(W*(xf1-xf0)); ch=int(H*(yf1-yf0)); fs=cw*ch
    return [raw[i*fs:(i+1)*fs] for i in range(len(raw)//fs) if len(raw[i*fs:(i+1)*fs])==fs], cw, ch
def ac(d, cw, ch, dx, dy):
    tot=0;cnt=0
    for y in range(max(0,-dy), min(ch,ch-dy)):
        for x in range(max(0,-dx), min(cw,cw-dx)):
            tot += d[y*cw+x]*d[(y+dy)*cw+(x+dx)]; cnt+=1
    return tot/max(cnt,1)
for f in sys.argv[1:]:
    fr,cw,ch = load(f, 0.30,0.78, 0.70,0.95)      # 远景屋顶区（雪在深色屋顶上可见）
    vs=[];hs=[];z=[]
    for i in range(1, min(len(fr),16)):
        d=bytes(abs(a-b) for a,b in zip(fr[i-1],fr[i]))
        z.append(ac(d,cw,ch,0,0))
        vs.append(max(ac(d,cw,ch,0,k) for k in (1,2,3,4)))
        hs.append(max(ac(d,cw,ch,k,0) for k in (1,2,3,4)))
    mv=sum(vs)/len(vs); mh=sum(hs)/len(hs); mz=sum(z)/len(z)
    print("%-40s 垂直相关峰=%.1f 水平相关峰=%.1f (零延迟=%.1f) => %s" %
          (f.split('/')[-1], mv, mh, mz, "垂直为主 ⬇" if mv>mh*1.15 else ("水平为主 ➡" if mh>mv*1.15 else "两向接近/杂乱")))
