Ask Your Question

Revision history [back]

Problem linking motion detection value to video frame

Hi everyone and thank you for stopping by,

You see, I'm trying to use opencv's tracking blob so that the X and Y position of the moving object in my camera is synced to match the equivalent frame in a video.

So it means that if your hand is on the left of the screen it positions the video to frame 1, and if it is on the right it's frame 300, let's say. Every time frame 250 is reached, 1 is added to a counter. After the counter gets to 20, it changes video and uses the y axis to be synced.

My problem is that when I try to make it work, either only part of the video is synced with the motion (from frame 1 to 30 let's say), or some frames return as and mmco error. Here is my code:

Contours of the moving objects:

for c in cnts:
global motion_frame_x
global motion_frame_y
global motionCounter

if len(cnts) != 0:

    c = max(cnts, key = cv2.contourArea)
    x_value = tuple(c[c[:, :, 0].argmax()][0])
    y_value = tuple(c[c[:, :, 1].argmax()][0]) 
    print 'x: ' , x_value[0], 'y: ', y_value[1]
    print "counter: " , motionCounter
    motion_frame_x = x_value[0] / 500.0
    motion_frame_y = y_value[1] / 500.0

That's the counter:

    if motion_frame_x >= 0.5 and motionCounter < 20:
        motionCounter = motionCounter + 1
        print motion_frame_x

    elif motionCounter >= 20 and  motion_frame_y >= 0.85:
        motionCounter = motionCounter + 1
        print motion_frame_y

    elif motionCounter == 50:
        break

And the video output:

    if motionCounter < 20:
        cap = cv2.VideoCapture('vid1.mp4')
        cap.set(1, round(motion_frame_x * 292, 1) / 24)
    elif motionCounter >= 20 and motionCounter < 50:
        cap= cv2.VideoCapture('vid2.mp4')    
    else:
        cap= cv2.VideoCapture('vid3.mp4')        

    ret, vid = cap.read()
    color = cv2.cvtColor(vid, cv2.COLOR_BGR2RGB)
    cv2.imshow('vid', color)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break        
rawCapture.truncate(0)

If I lower the division on cap.set I can see a bit more of the video but still not entirely. and If I just put motion_frame_x in it the video doesnt move and gives me a buffer error.

Thank you for your help!