Exemple #1
0
def showmotion(src, paths, dest):
    FPS = get_fps(src)

    paths = pickle.load(open(paths))

    CROP = getRule('crop', src)

    # divide by number of frames
    # px/second
    avg_speeds = [FPS*motion(y)/(paths[idx][0][-1][4]-paths[idx][0][0][4]) for idx,(x,y) in enumerate(paths)]
    avg_speed = sum(avg_speeds) / len(avg_speeds)

    fr = None

    for idx,fr in enumerate(VideoReader(src)):
        if CROP > 0:
            fr = fr[CROP:-CROP,CROP:-CROP]

        if idx == 0:
            vout = VideoWriter(dest)

        speeds = []

        for p_idx,(raw,smooth) in enumerate(paths):
            raw = filter(lambda x: x[4] <= idx, raw)
            smooth = smooth[:max(0,len(raw)-5)]

            if len(raw) == 0:
                # print idx, 'path has not yet started'
                continue

            raw = numpy.array(raw)
            pts = raw[:,:2].astype(numpy.int32)
            cv2.polylines(fr, [pts], False, (255, 0, 0))

            tup = tuple(raw[-1,:2].astype(int).tolist())
            cv2.circle(fr, tup, raw[-1,2].astype(int), (255, 0, 0))
            cv2.circle(fr, tup, 3, (255, 0, 0))

            speed = 0
            if len(pts) > 1:
                speed = FPS*numpy.hypot(*(pts[-1] - pts[-2]).T)
            speeds.append(speed)
            txt = "%.2f (%.2f)" % (avg_speeds[p_idx], speed)
            cv2.putText(fr, txt, tup, cv2.FONT_HERSHEY_PLAIN, 1, (0,255,0))

            # & smoothed
            if len(smooth) > 0:
                pts = numpy.array(smooth).astype(numpy.int32)
                cv2.polylines(fr, [pts], False, (0, 0, 255))
                
                tup = tuple(pts[-1].astype(int).tolist())
                cv2.circle(fr, tup, 3, (0, 0, 255))

        txt = "%.2f (%.2f), N=%d" % (avg_speed, sum(speeds)/len(speeds), len(paths))
        cv2.putText(fr, txt, (30,30), cv2.FONT_HERSHEY_PLAIN, 1, (255,0,255))
        vout.write(fr)
Exemple #2
0
def contours(src, dst):
    acc = []
    video = None
    vfr = None

    BLUR = getRule("blur", src)
    DILATION = getRule("dilation", src)
    THRESH = getRule("threshold", src)
    REVERSED = getRule("reversed", src)
    MERGE = getRule("merge", src)
    CROP = getRule("crop", src)

    merge = []

    for idx,fr in enumerate(VideoReader(src)):
        if CROP > 0:
            fr = fr[CROP:-CROP,CROP:-CROP]

        if len(merge) >= MERGE:
            merge.pop(0)
        
        merge.append(fr.mean(axis=2).astype(int))

        fr = (array(merge).sum(axis=0) / len(merge)).astype(uint8)
        if REVERSED:
            fr = 255 - fr
        if BLUR > 0:
            cv2.blur(fr, (BLUR, BLUR), fr)

        fr = 255*(fr>THRESH).astype(uint8)

        fr = cv2.dilate(fr, None, iterations=DILATION)

        if idx == 0:
            video = VideoWriter(dst.replace('.pkl', '.avi'))
            vfr = zeros((fr.shape[0],fr.shape[1],3), uint8)
            np2image(fr, dst.replace('.pkl', '.png'))

        vfr[:] = fr.reshape((fr.shape[0],fr.shape[1],-1))
        video.write(vfr)

        contours, hierarchy = cv2.findContours(fr, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
        acc.append(contours)

    pickle.dump(acc, open(dst, 'w'))