In [24]:
# visualize important points optical flow

import os, json, math
from collections import Counter
import cv2
import numpy as np

root = "analysis/optical-flow/"
fns = [root + f for f in os.listdir(root) if f[0] != "."][7:]

for flow_fn in fns:
    with open(flow_fn) as f: 
        j = json.load(f)
        
        fn = "videos/" + flow_fn.split(".json")[0].split("/")[-1] + ".mp4"
        print fn
        
        cap = cv2.VideoCapture(fn)
        fps = cap.get(cv2.CAP_PROP_FPS)

        # Create some random colors
        color = np.random.randint(0,255,(100,3))
        ret, old_frame = cap.read()
        # mask = np.zeros_like(old_frame)

        frame_count = 0
        unique_frames = sorted(list(set([c["frame"] for c in j])))

        while(1):
            frame_count += 1

            ret,frame = cap.read()
            
            lower_frames = [u for u in unique_frames if u <= frame_count]
            upper_frames = [u for u in unique_frames if u > frame_count]
            if not lower_frames: 
                lower_frames = [0]
            if not upper_frames:
                upper_frames = [10000]
                
            lower_bound_frame = lower_frames[-1]
            upper_bound_frame = upper_frames[0]

            if frame != None and frame.any() and frame_count % 5: 
                frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
                rel_feats = [feat for feat in j if feat["frame"] == lower_bound_frame]
                for feat in rel_feats:
                    
                    a = int(feat["b"][0])
                    b = int(feat["b"][1])
                    c = int(feat["a"][0])
                    d = int(feat["a"][1])
                    
                    # mask = cv2.line(mask, (a,b),(c,d), color[i].tolist(), 2)
                    frame = cv2.circle(frame,(a,b),5,color[int(feat["feature"])].tolist(),-1)
                    
                img = frame
                cv2.imshow('frame',img)
            
                k = cv2.waitKey(30) & 0xff
                if k == 27:
                    break

        cv2.waitKey(1)
        cv2.destroyAllWindows()
        cv2.waitKey(1)
        cap.release()


videos/probation-reg-small.mp4
/usr/local/lib/python2.7/site-packages/ipykernel/__main__.py:44: FutureWarning: comparison to `None` will result in an elementwise object comparison in the future.
---------------------------------------------------------------------------
KeyboardInterrupt                         Traceback (most recent call last)
<ipython-input-24-663036bbc57a> in <module>()
     58                 cv2.imshow('frame',img)
     59 
---> 60                 k = cv2.waitKey(30) & 0xff
     61                 if k == 27:
     62                     break

KeyboardInterrupt: 

In [ ]:
# find clusters from optical flow files

import os, json, math
from collections import Counter,defaultdict
import cv2
import numpy as np

from sklearn.cluster import KMeans

root = "analysis/optical-flow/"
fns = [root + f for f in os.listdir(root) if f[0] != "."][1:]
clusters = defaultdict(dict)

for flow_fn in fns:
    with open(flow_fn) as f: 
        j = json.load(f)
        print flow_fn
        
        unique_frames = sorted(list(set([k["frame"] for k in j])))
        
        clusters[flow_fn] = []
        
        for frame in unique_frames: 
            rel = [k for k in j if k["frame"] == frame]
            points = np.array([(k["b"][0], k["b"][1]) for k in rel])
            
            # print np.array(points[0:20])

            if len(points) > 1:
                km = KMeans(n_clusters=2, random_state=0).fit(points)
                labels = km.labels_
                cl1 = [points[i] for i in range(len(points)) if i in np.where(labels == 0)[0]]
                cl2 = [points[i] for i in range(len(points)) if i in np.where(labels == 1)[0]]
                
                # also want to record which features comprise the clusters
                cl_features = [[],[]]
                cl_list = [cl1, cl2]
                
                for i in range(len(cl_list)):
                    cl = cl_list[i]
                    for p in cl: 
                        rel_feat = [k for k in rel if k["b"][0] == p[0] and k["b"][1] == p[1]][0]["feature"]
                        cl_features[i].append(rel_feat)
                
                
                clusters[flow_fn].append({
                        "cluster-centers": km.cluster_centers_,
                        "scores": [np.std(cl1), np.std(cl2), km.score(points)],
                        "frame": frame,
                        "cluster-features": cl_features,
                    })       

# turns out what we actually want to do is cluster features together for the whole movie
# not to cluster together features in each frame

In [6]:
clusters["analysis/optical-flow/equation-small.json"]


Out[6]:
[{'cluster-centers': array([[ 409.35868835,  158.5582962 ],
         [ 477.42402954,  213.89624939]]),
  'frame': 29,
  'scores': [126.51721304553926, 132.40169501347756, -2810.4452298578108]},
 {'cluster-centers': array([[ 354.49961045,  159.67385146],
         [ 171.51803373,  147.74359538]]),
  'frame': 58,
  'scores': [111.51496126066371, 49.216091147492101, -237029.85366509156]},
 {'cluster-centers': array([[ 292.99374945,  129.5480527 ],
         [ 230.16553752,  155.16824849]]),
  'frame': 87,
  'scores': [81.827348900731764, 39.166225314929186, -1143.0729974563146]},
 {'cluster-centers': array([[ 296.11710982,  130.21087022],
         [ 220.58319528,  145.85986764]]),
  'frame': 116,
  'scores': [83.023065374798676, 38.172291659132433, -1112.6235809101345]},
 {'cluster-centers': array([[ 303.47573547,  129.57158356],
         [ 217.06578827,  145.59887505]]),
  'frame': 145,
  'scores': [87.037571920407018, 36.478577352748211, -1158.4151952475368]},
 {'cluster-centers': array([[ 218.15341187,  149.68967183],
         [ 215.38937378,  138.98683929]]),
  'frame': 174,
  'scores': [34.290150182417889, 38.363463427982282, -123.30890676322451]},
 {'cluster-centers': array([[ 217.0369517 ,  150.00282288],
         [ 214.32514445,  140.55855815]]),
  'frame': 203,
  'scores': [33.577531258783345, 37.049598859242643, -98.11476307407429]},
 {'cluster-centers': array([[ 223.30038888,  141.89027405],
         [ 213.35049438,  164.1655426 ]]),
  'frame': 348,
  'scores': [41.072385449354407, 24.592475891113281, -420.54806091341015]},
 {'cluster-centers': array([[ 216.90951538,  166.09040833],
         [ 239.705012  ,  141.24258677]]),
  'frame': 377,
  'scores': [25.409553527832031, 50.017085296141239, -935.958310595277]},
 {'cluster-centers': array([[ 243.93926239,  152.13304138],
         [ 279.62646484,  180.98313904]]),
  'frame': 406,
  'scores': [47.644663578355136, 49.321662902832031, -1303.3473083071876]},
 {'cluster-centers': array([[ 254.6974762 ,  157.24398499],
         [ 306.54525757,  128.31388855]]),
  'frame': 435,
  'scores': [51.853601114447834, 89.115684509277344, -3145.002112362039]},
 {'cluster-centers': array([[ 294.89529142,  132.49856706],
         [ 250.13244629,  153.00220871]]),
  'frame': 464,
  'scores': [81.237466437826953, 50.43354516593503, -1619.516245565741]},
 {'cluster-centers': array([[ 251.93968201,  157.79248352],
         [ 285.8104248 ,  134.46028553]]),
  'frame': 493,
  'scores': [50.233094691101094, 75.72518322126362, -3241.3191754118452]},
 {'cluster-centers': array([[ 292.29206987,  135.39545787],
         [ 235.93677139,  152.88729858]]),
  'frame': 522,
  'scores': [78.527959374386697, 43.552175847384142, -1654.9874742842076]},
 {'cluster-centers': array([[ 303.02233887,  136.16298329],
         [ 238.49770355,  146.5593605 ]]),
  'frame': 551,
  'scores': [83.563669591589971, 46.1019026691555, -590.03186170253321]},
 {'cluster-centers': array([[ 307.49346924,  152.09796143],
         [ 304.03027344,  137.42172241]]),
  'frame': 580,
  'scores': [77.69775390625, 83.304824464532388, -0.36584148602560163]},
 {'cluster-centers': array([[ 241.40872192,  146.55367279],
         [ 211.78816223,  170.63632202]]),
  'frame': 609,
  'scores': [47.570033746650417, 20.575920104980469, -108.30419309786521]},
 {'cluster-centers': array([[ 301.16562999,  131.85155973],
         [ 229.86901347,  148.8534139 ]]),
  'frame': 667,
  'scores': [84.806804446252897, 42.230961657117327, -2269.2379687169159]},
 {'cluster-centers': array([[ 226.14215851,  148.33556366],
         [ 238.68518066,  146.4861908 ]]),
  'frame': 696,
  'scores': [38.966923074775515, 46.161857988894731, -42.832972960313782]},
 {'cluster-centers': array([[ 224.84638214,  153.70253372],
         [ 299.63550313,  137.61603038]]),
  'frame': 725,
  'scores': [37.261885240647636, 81.55188461538917, -3099.8703048005409]},
 {'cluster-centers': array([[ 293.73973846,  143.30181503],
         [ 232.27493795,  147.44084167]]),
  'frame': 754,
  'scores': [76.24758568785586, 42.561387395242427, -1320.0113195307204]},
 {'cluster-centers': array([[ 237.5244812 ,  143.91135559],
         [ 209.26734924,  171.7263031 ]]),
  'frame': 783,
  'scores': [47.145035052017299, 18.770523071289062, -318.00008421074017]},
 {'cluster-centers': array([[ 233.82863235,  143.24804688],
         [ 279.76660156,  179.22843933]]),
  'frame': 812,
  'scores': [45.638102327139855, 50.269081115722656, -253.00614047626732]},
 {'cluster-centers': array([[ 277.49740601,  175.0982666 ],
         [ 229.73617554,  148.10860443]]),
  'frame': 841,
  'scores': [51.199569702148438, 40.890134943371528, -24.95217809046153]},
 {'cluster-centers': array([[ 304.75484212,  136.352673  ],
         [ 239.08735657,  176.96375275]]),
  'frame': 870,
  'scores': [84.383398467664961, 37.874416721331528, -2431.7789394645806]},
 {'cluster-centers': array([[ 259.19714355,  178.07275391],
         [ 306.14564006,  144.9418335 ]]),
  'frame': 899,
  'scores': [40.56219482421875, 80.705242455641638, -100.01608515779662]},
 {'cluster-centers': array([[ 304.2761261 ,  138.11057892],
         [ 255.00622559,  174.0561676 ]]),
  'frame': 928,
  'scores': [83.147023207960743, 40.475028991699219, -213.604018467071]},
 {'cluster-centers': array([[ 302.7611145 ,  142.92276917],
         [ 234.44697571,  151.80758231]]),
  'frame': 957,
  'scores': [80.004896064861754, 43.154587499747393, -2444.1999045881676]},
 {'cluster-centers': array([[ 233.96387373,  153.28932844],
         [ 299.34180705,  143.15886095]]),
  'frame': 986,
  'scores': [42.758875744142209, 78.107087142453338, -2861.0626464418019]},
 {'cluster-centers': array([[ 301.0190094 ,  149.34510803],
         [ 248.15614319,  180.06991577]]),
  'frame': 1015,
  'scores': [75.993652653283505, 34.043113708496094, -475.84309204146848]},
 {'cluster-centers': array([[ 237.87459183,  155.92569733],
         [ 315.09851074,  159.48449707]]),
  'frame': 1044,
  'scores': [42.63840774794182, 77.8070068359375, -1113.0279024536139]},
 {'cluster-centers': array([[ 240.23223495,  146.80950928],
         [ 213.86550903,  169.56497192]]),
  'frame': 1131,
  'scores': [46.911696371775371, 22.1502685546875, -150.04670579795493]},
 {'cluster-centers': array([[ 251.06445312,  191.80665588],
         [ 251.4706014 ,  145.91377767]]),
  'frame': 1160,
  'scores': [29.628898620605469, 53.022590332903285, -155.00595956746838]},
 {'cluster-centers': array([[ 254.34833781,  142.52550252],
         [ 240.63897705,  178.68587494]]),
  'frame': 1189,
  'scores': [56.286487052994076, 35.504164759589528, -1456.4880111747916]},
 {'cluster-centers': array([[ 297.3862648 ,  155.35797691],
         [ 240.64390259,  141.72213135]]),
  'frame': 1218,
  'scores': [71.915817083166473, 49.983768439041768, -2581.9967171440949]},
 {'cluster-centers': array([[ 298.42702637,  151.55725708],
         [ 242.67117615,  145.80686951]]),
  'frame': 1247,
  'scores': [74.140932424128096, 49.997914055609449, -3625.0909088374756]},
 {'cluster-centers': array([[ 288.50632935,  148.4319809 ],
         [ 218.82255554,  152.3009491 ]]),
  'frame': 1276,
  'scores': [71.437439094216131, 35.172543087303872, -5008.6526684430719]},
 {'cluster-centers': array([[ 314.2718811 ,  161.14126587],
         [ 251.97720337,  148.73020554]]),
  'frame': 1305,
  'scores': [76.5653076171875, 53.236196203577755, -1352.855566647544]},
 {'cluster-centers': array([[ 233.35617828,  154.64067841],
         [ 260.46084595,  146.42884827]]),
  'frame': 1334,
  'scores': [39.908599496277816, 58.097301150365382, -921.48899715789594]},
 {'cluster-centers': array([[ 301.60158963,  147.56692505],
         [ 251.40480804,  150.18542099]]),
  'frame': 1363,
  'scores': [77.148300088018971, 52.303025691387539, -1757.5565445868415]},
 {'cluster-centers': array([[ 254.67272186,  138.2166748 ],
         [ 238.48364258,  148.56175232]]),
  'frame': 1392,
  'scores': [58.277448587108054, 44.960945129394531, -23.033158892416395]},
 {'cluster-centers': array([[ 268.78387451,  162.84017944],
         [ 251.78709412,  139.11857605]]),
  'frame': 1479,
  'scores': [52.971847534179688, 56.334259033203125, -0.0]},
 {'cluster-centers': array([[ 278.48416138,  172.67230225],
         [ 246.56424713,  143.76499176]]),
  'frame': 1508,
  'scores': [52.905929565429688, 51.722776109787631, -133.29536916152574]},
 {'cluster-centers': array([[ 243.41938019,  146.695755  ],
         [ 278.72955322,  169.88534546]]),
  'frame': 1537,
  'scores': [49.559263269385944, 54.422103881835938, -938.04526931070723]},
 {'cluster-centers': array([[ 332.60061646,  174.91027832],
         [ 304.28268433,  152.48910522]]),
  'frame': 1566,
  'scores': [78.845169067382812, 75.898930598630059, -1.3000076003372669]},
 {'cluster-centers': array([[ 407.8192749 ,  152.91496277],
         [ 267.68486459,  150.55221558]]),
  'frame': 1595,
  'scores': [127.45215606689453, 62.448396522426329, -6577.0300683224195]},
 {'cluster-centers': array([[ 224.07254333,  161.84272766],
         [ 455.57609558,  191.72733307]]),
  'frame': 1624,
  'scores': [51.09902235537561, 134.27012720623296, -18927.424720444076]},
 {'cluster-centers': array([[ 232.52329712,  168.17546082],
         [ 486.56049194,  204.03161621]]),
  'frame': 1653,
  'scores': [57.41718156922613, 142.44427029946328, -25963.004656011617]},
 {'cluster-centers': array([[ 191.00251328,  150.88544223],
         [ 346.46060885,  159.8930488 ]]),
  'frame': 1682,
  'scores': [47.654164887806033, 109.98360647888269, -159263.61622035032]},
 {'cluster-centers': array([[ 485.78155518,  189.6210556 ],
         [ 249.25500488,  152.96091461]]),
  'frame': 1711,
  'scores': [149.98878247462724, 51.62605682174118, -5052.3922671567416]},
 {'cluster-centers': array([[ 255.40219116,  196.23880005],
         [ 491.16017151,  186.34622955]]),
  'frame': 1740,
  'scores': [29.581695556640625, 154.84631908178886, -2997.99092222529]},
 {'cluster-centers': array([[ 254.40947723,  149.64645767],
         [ 484.04196167,  155.6043396 ]]),
  'frame': 1769,
  'scores': [54.044077665117506, 164.21881103515625, -1415.5181099874317]},
 {'cluster-centers': array([[ 266.82394409,  180.73342896],
         [ 256.48733521,  137.76622009]]),
  'frame': 1798,
  'scores': [43.045257568359375, 59.360557556152344, -0.0]},
 {'cluster-centers': array([[ 266.31051636,  191.62417603],
         [ 257.67549896,  134.96146393]]),
  'frame': 1827,
  'scores': [37.343170166015625, 61.380592080083588, -11.573942036600783]},
 {'cluster-centers': array([[ 261.80599976,  173.52935791],
         [ 481.79971313,  150.86605835]]),
  'frame': 1856,
  'scores': [44.138320922851562, 165.46682739257812, -0.0]},
 {'cluster-centers': array([[ 491.93087769,  186.64250946],
         [ 257.03179932,  136.4130249 ]]),
  'frame': 1885,
  'scores': [154.9768639399507, 60.30938720703125, -2870.3256531051593]},
 {'cluster-centers': array([[ 491.83988953,  186.79408264],
         [ 261.16996765,  137.46574402]]),
  'frame': 1914,
  'scores': [154.78496306708612, 61.872519919899993, -2790.694809095934]},
 {'cluster-centers': array([[ 491.17218018,  188.01970673],
         [ 263.00115967,  151.12753805]]),
  'frame': 1943,
  'scores': [153.76553283356952, 57.075464416533585, -3446.025199393087]},
 {'cluster-centers': array([[ 499.75799561,  223.71723938],
         [ 262.76531982,  136.79064941]]),
  'frame': 1972,
  'scores': [138.02037811279297, 63.005687702886895, -9.2491467073559761]},
 {'cluster-centers': array([[ 266.06890869,  137.65940857],
         [ 262.47879028,  139.39605713]]),
  'frame': 2001,
  'scores': [64.204750061035156, 61.541366577148438, -0.0]},
 {'cluster-centers': array([[ 259.54125977,  154.42510376],
         [ 498.63476562,  223.74365234]]),
  'frame': 2059,
  'scores': [55.120515726932737, 137.445556640625, -2759.1969064099394]},
 {'cluster-centers': array([[ 303.68891737,  140.04841275],
         [ 263.16018982,  123.58455353]]),
  'frame': 2088,
  'scores': [81.95001860555837, 72.726130344750771, -4570.038231075363]},
 {'cluster-centers': array([[ 320.37288557,  136.37421526],
         [ 497.24911499,  223.76496887]]),
  'frame': 2117,
  'scores': [93.137283232332024, 136.74207305908203, -5898.9240617819596]},
 {'cluster-centers': array([[ 337.08824019,  144.38710716],
         [ 325.44517008,  108.47370911]]),
  'frame': 2146,
  'scores': [96.471901037999771, 108.9525929658689, -1123.7952427100972]},
 {'cluster-centers': array([[ 330.55202738,  134.35625776],
         [ 495.56906128,  223.64421082]]),
  'frame': 2175,
  'scores': [98.976930951791559, 135.96242523193359, -4157.708535978978]},
 {'cluster-centers': array([[ 325.5236969 ,   99.20295715],
         [ 329.82588959,  133.9540329 ]]),
  'frame': 2204,
  'scores': [113.16889783892348, 98.204200135010055, -428.67142039723694]},
 {'cluster-centers': array([[ 335.37359064,  144.92498918],
         [ 319.74858602,  109.46458944]]),
  'frame': 2262,
  'scores': [95.349929666944945, 105.65487801060686, -1175.3966867772397]},
 {'cluster-centers': array([[ 325.65729632,  138.15530178],
         [ 488.73760986,  187.02578227]]),
  'frame': 2291,
  'scores': [94.747014827619523, 152.41780364104901, -8099.0060585844622]},
 {'cluster-centers': array([[ 314.0257176 ,  139.2884576 ],
         [ 501.22000122,  223.32266235]]),
  'frame': 2320,
  'scores': [88.560679955292429, 138.94866943359375, -5872.0627273118589]},
 {'cluster-centers': array([[ 317.2834974 ,  138.55973707],
         [ 492.69490051,  187.09104919]]),
  'frame': 2349,
  'scores': [90.484261278607903, 154.99735440478321, -8354.9710936823394]},
 {'cluster-centers': array([[ 499.2805481 ,  223.9637146 ],
         [ 481.3031311 ,  151.73677063]]),
  'frame': 2378,
  'scores': [137.65841674804688, 164.78318023681641, -0.0]},
 {'cluster-centers': array([[ 490.51712036,  223.24638367],
         [ 485.72772217,  169.91216278]]),
  'frame': 2407,
  'scores': [133.63536834716797, 158.3677661891023, -581.92991985019762]},
 {'cluster-centers': array([[ 313.1592509 ,  144.87777456],
         [ 300.96716309,   98.77735901]]),
  'frame': 2465,
  'scores': [84.461018475628265, 101.10570105586589, -1304.7300054032821]},
 {'cluster-centers': array([[ 298.62562779,  137.65038354],
         [ 489.17694092,  223.19242859]]),
  'frame': 2494,
  'scores': [81.645968783415256, 132.99225616455078, -5258.5932917422324]},
 {'cluster-centers': array([[ 250.12525431,  132.74152713],
         [ 300.49937221,  148.48954555]]),
  'frame': 2523,
  'scores': [61.013495118966247, 76.083259892419221, -5169.2294273826556]},
 {'cluster-centers': array([[ 220.13912092,  105.88851166],
         [ 209.97411262,  149.56776428]]),
  'frame': 2552,
  'scores': [58.021433057030116, 31.681556542943188, -3091.4150213377361]},
 {'cluster-centers': array([[ 192.96373177,  105.10988331],
         [ 185.13065338,  145.66630554]]),
  'frame': 2581,
  'scores': [44.761467972301986, 22.009653301454303, -3465.8171059994929]},
 {'cluster-centers': array([[ 201.82709503,  105.24143791],
         [ 193.77605438,  146.60184479]]),
  'frame': 2610,
  'scores': [49.032272232617522, 26.306353230001054, -4407.6078606347437]},
 {'cluster-centers': array([[ 196.60196877,  107.43869209],
         [ 194.49002923,  145.67090691]]),
  'frame': 2639,
  'scores': [45.339980186238115, 26.203480664273894, -2725.3842394284729]},
 {'cluster-centers': array([[ 195.66015625,  149.0091095 ],
         [ 192.09503174,   96.72949219]]),
  'frame': 2668,
  'scores': [23.325523376464844, 47.806106066193941, -47.108975037117489]},
 {'cluster-centers': array([[ 185.48014832,  154.29748027],
         [ 483.92976888,  187.75524394]]),
  'frame': 2697,
  'scores': [16.387450204245379, 149.72122109674589, -3072.3934074491044]},
 {'cluster-centers': array([[ 186.45427496,  142.7040218 ],
         [ 481.63535563,  188.44640096]]),
  'frame': 2726,
  'scores': [25.112788205862447, 148.13095417157737, -6063.914101032773]},
 {'cluster-centers': array([[ 486.43133545,  188.35175578],
         [ 183.56710698,  144.35960388]]),
  'frame': 2755,
  'scores': [150.54473996282542, 26.280959160336007, -10671.083886427616]},
 {'cluster-centers': array([[ 181.27048165,  143.96543993],
         [ 488.1342926 ,  189.23127747]]),
  'frame': 2784,
  'scores': [23.849318269349652, 151.70224293086574, -8895.7261116535083]},
 {'cluster-centers': array([[ 195.75448608,  108.73967319],
         [ 179.28938511,  159.13490077]]),
  'frame': 2813,
  'scores': [44.304700615636975, 17.575641836145127, -4163.1507234379533]},
 {'cluster-centers': array([[ 181.14712306,  133.95845322],
         [ 474.23168945,  154.34883118]]),
  'frame': 2842,
  'scores': [29.248923289228433, 159.94142913818359, -12549.888676515271]},
 {'cluster-centers': array([[ 184.5076917 ,  122.55181058],
         [ 474.31378174,  155.61260986]]),
  'frame': 2871,
  'scores': [33.436520979777455, 159.3505859375, -3800.8352143241209]},
 {'cluster-centers': array([[ 148.66941071,  168.687603  ],
         [ 486.82633464,  188.97233073]]),
  'frame': 2900,
  'scores': [58.853164702971014, 150.37310491681674, -29505.016548687767]},
 {'cluster-centers': array([[ 195.44380951,  107.66738796],
         [ 179.10850961,  143.06595067]]),
  'frame': 2929,
  'scores': [44.603800968051537, 18.791322122372996, -1410.0460809760334]},
 {'cluster-centers': array([[ 195.60877991,  112.99050395],
         [ 481.5620575 ,  171.3353653 ]]),
  'frame': 2958,
  'scores': [41.415045038907408, 155.51269745157757, -548.76217096511391]},
 {'cluster-centers': array([[ 190.30511475,  101.77674866],
         [ 479.52883911,  170.89205933]]),
  'frame': 2987,
  'scores': [44.56231394932135, 154.73025915788995, -668.0421036806656]},
 {'cluster-centers': array([[ 182.74489369,  126.68204723],
         [ 477.80374146,  170.80376434]]),
  'frame': 3016,
  'scores': [33.881425761392364, 153.90782172927979, -12815.955400144572]},
 {'cluster-centers': array([[ 189.35566766,  134.44614955],
         [ 479.66246033,  170.95858002]]),
  'frame': 3045,
  'scores': [44.187020176681109, 154.78265598427831, -50879.212868432078]},
 {'cluster-centers': array([[ 202.39519586,  108.48337809],
         [ 171.77407015,  146.6150454 ]]),
  'frame': 3074,
  'scores': [47.605996714656378, 19.336942970451268, -6714.0278253002907]},
 {'cluster-centers': array([[ 173.49882625,  148.92965346],
         [ 200.68187714,  103.5365715 ]]),
  'frame': 3103,
  'scores': [19.155991386972754, 49.147548084522292, -6291.2110952322691]},
 {'cluster-centers': array([[ 195.17959595,  108.05739763],
         [ 174.59557648,  164.14383698]]),
  'frame': 3132,
  'scores': [44.329455579981179, 20.4470843781144, -9031.0337965743311]},
 {'cluster-centers': array([[ 177.33750661,  174.79342651],
         [ 195.57527161,  103.91544088]]),
  'frame': 3161,
  'scores': [14.0108183379336, 46.464373650190375, -3038.9018518962694]},
 {'cluster-centers': array([[ 158.58750153,  170.63347626],
         [ 487.71176147,  189.2678833 ]]),
  'frame': 3190,
  'scores': [17.293251143955608, 151.46715563295524, -3751.5691559978295]},
 {'cluster-centers': array([[ 189.37177687,  135.52093271],
         [ 491.2702179 ,  204.73054504]]),
  'frame': 3219,
  'scores': [37.4316475684452, 144.05562919604699, -18483.010115238139]},
 {'cluster-centers': array([[ 184.64582138,  137.70120735],
         [ 482.70013428,  186.17228699]]),
  'frame': 3248,
  'scores': [33.155193213366893, 148.26392364501953, -21932.70561737493]},
 {'cluster-centers': array([[ 234.54576721,  132.83846893],
         [ 185.08044434,  159.20862649]]),
  'frame': 3277,
  'scores': [53.952867017442543, 22.676783276087257, -14128.13729324146]},
 {'cluster-centers': array([[ 195.14449721,  170.19417631],
         [ 482.71411133,  189.18684896]]),
  'frame': 3306,
  'scores': [20.789114325576119, 148.05716696256513, -9478.666302012527]},
 {'cluster-centers': array([[ 198.56215032,  169.3725853 ],
         [ 478.89323425,  170.87052155]]),
  'frame': 3335,
  'scores': [19.272879696584965, 154.42277933451223, -4310.0567317426758]},
 {'cluster-centers': array([[ 186.62740453,  178.19691467],
         [ 460.86183675,  192.41304016]]),
  'frame': 3364,
  'scores': [49.990711261284041, 135.57403912458437, -46848.238528018468]},
 {'cluster-centers': array([[ 174.27104187,  159.27309772],
         [ 305.07317352,  166.40364685]]),
  'frame': 3393,
  'scores': [37.358402139179645, 75.709386413397368, -93499.310863719977]}]

In [21]:
# visualize cluster centers

root = "analysis/optical-flow/"
fns = [root + f for f in os.listdir(root) if f[0] != "."][7:]

for flow_fn in fns:
    with open(flow_fn) as f: 
        flow_fn_root = flow_fn.split(".json")[0].split("/")[-1]
        
        j = clusters[flow_fn]
        fn = "videos/" + flow_fn_root + ".mp4"
        print fn
        
        cap = cv2.VideoCapture(fn)
        fps = cap.get(cv2.CAP_PROP_FPS)

        # Create some random colors
        color = np.random.randint(0,255,(100,3))
        ret, old_frame = cap.read()
        # mask = np.zeros_like(old_frame)

        frame_count = 0
        unique_frames = sorted(list(set([c["frame"] for c in j])))

        while(1):
            frame_count += 1

            ret,frame = cap.read()
            
            lower_frames = [u for u in unique_frames if u <= frame_count]
            upper_frames = [u for u in unique_frames if u > frame_count]
            if not lower_frames: 
                lower_frames = [0]
            if not upper_frames:
                upper_frames = [10000]
                
            lower_bound_frame = lower_frames[-1]
            upper_bound_frame = upper_frames[0]

            if frame != None and frame.any() and frame_count % 5: 
                frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
                rel_feats = [feat for feat in j if feat["frame"] == lower_bound_frame]
                cluster_centers = []
                print len(rel_feats)
                if rel_feats: 
                    cluster_centers = rel_feats[0]["cluster-centers"]
                
                cluster_center_count = 0
                for cluster_center in cluster_centers:
                    
                    a = int(cluster_center[0])
                    b = int(cluster_center[1])
                    
                    # mask = cv2.line(mask, (a,b),(c,d), color[i].tolist(), 2)
                    frame = cv2.circle(frame,(a,b),5,color[int(cluster_center_count)].tolist(),-1)
                    cluster_center_count +=1
                    
                img = frame
                cv2.imshow('frame',img)
            
                k = cv2.waitKey(30) & 0xff
                if k == 27:
                    break

        cv2.waitKey(1)
        cv2.destroyAllWindows()
        cv2.waitKey(1)
        cap.release()


videos/probation-reg-small.mp4
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
/usr/local/lib/python2.7/site-packages/ipykernel/__main__.py:40: FutureWarning: comparison to `None` will result in an elementwise object comparison in the future.
---------------------------------------------------------------------------
KeyboardInterrupt                         Traceback (most recent call last)
<ipython-input-21-b16386f4665d> in <module>()
     26             frame_count += 1
     27 
---> 28             ret,frame = cap.read()
     29 
     30             lower_frames = [u for u in unique_frames if u <= frame_count]

KeyboardInterrupt: 

In [10]:
cv2.waitKey(1)
cv2.destroyAllWindows()
cv2.waitKey(1)
cap.release()

In [23]:
print fps


29.4117647059

In [ ]: