Home > Software design >  Change VideoCapture size based on loop value
Change VideoCapture size based on loop value

Time:05-30

So I have this code below and I was expecting it to change the width size of the frame based on loop i value from 1 to 1000 in live time, to put that in visualization, when I executed the code I was expecting it to changes the windows width size while it was running.

import cv2
import numpy as np

vid = cv2.VideoCapture("C:\\users\\USER\\downloads\\man.mp4")
while True:
    ret,frame = vid.read()
    for i in range(1,1000):
        frame = cv2.resize(frame,(i,450))  
        size = 16
        # Create motion blur kernel
        kernel_motion_blur = np.zeros((size,size))
        kernel_motion_blur[int((size-1)/2), :] = np.ones(size)    
        kernel_motion_blur = kernel_motion_blur / size
        # Apply motion kernel motion blur
        result = cv2.filter2D(frame, -1, kernel_motion_blur)
        cv2.imshow('Motion Blur Applied',result)
        cv2.imshow('Original',frame)
        if cv2.waitKey(1) == ord('q'):
            break

cv2.destroyAllWindows()
vid.release()

Its works but the problem is when I executed the code the video frame gets glitchy and the video frame doesn't display the correct image of what contains in the actual video. So how do I fix that?

The video before and after

enter image description here

enter image description here

CodePudding user response:

I'm not sure I totally understand the question, or why you have a for loop inside of a while loop, but I think I was able to achieve the effect you are going for. Take a look:

import cv2
import numpy as np

# control how fast the image slides left to right
step_size = 10

vid = cv2.VideoCapture("videos\demo.mp4")
while True:
    ret,frame = vid.read()
    if ret == False:
        break
    width = frame.shape[1]
    for n in range(0, width, step_size):
        frame_to_show = frame[:,:n step_size]
        size = 16

        # Create motion blur kernel
        kernel_motion_blur = np.zeros((size,size))
        kernel_motion_blur[int((size-1)/2), :] = np.ones(size)    
        kernel_motion_blur = kernel_motion_blur / size
        # Apply motion kernel motion blur
        result = cv2.filter2D(frame_to_show, -1, kernel_motion_blur)
        cv2.imshow('Motion Blur Applied',result)
        cv2.imshow('Original',frame_to_show)
        key = cv2.waitKey(1)
        if key == ord('q'):
            break

    cv2.destroyAllWindows()
    vid.release()

Or perhaps this is more what you are looking for:

import cv2
import numpy as np

# control how fast the image slides left to right
step_size = 10

vid = cv2.VideoCapture("videos\demo.mp4")
end = 0
while True:
    ret,frame = vid.read()
    if ret == False:
        break

    width = frame.shape[1]
    if end > width:
        end = 0
    end  = step_size

    frame_to_show = frame[:,:end]
    size = 16

    # Create motion blur kernel
    kernel_motion_blur = np.zeros((size,size))
    kernel_motion_blur[int((size-1)/2), :] = np.ones(size)    
    kernel_motion_blur = kernel_motion_blur / size
    # Apply motion kernel motion blur
    result = cv2.filter2D(frame_to_show, -1, kernel_motion_blur)
    cv2.imshow('Motion Blur Applied',result)
    cv2.imshow('Original',frame_to_show)
    key = cv2.waitKey(1)
    if key == ord('q'):
        break

cv2.destroyAllWindows()
vid.release()
  • Related