如何从具有宽高比的视频调整帧的大小

时间:2017-04-10 05:09:20

标签: python image opencv video resize

问题的主要思想。我正在使用Python 2.7,openCV。最后,我有这个代码:

import cv2
vidcap = cv2.VideoCapture('myvid2.mp4')
success,image = vidcap.read()
count = 0;
print "I am in success"
while success:
  success,image = vidcap.read()
  resize = cv2.resize(image, (640, 480)) 
  cv2.imwrite("%03d.jpg" % count, resize)     
  if cv2.waitKey(10) == 27:                     
      break
  count += 1

我们有视频并在每个帧上剪切,如.jpg图像。同时我们从任何尺寸调整大小到640x480。并且所有图像都具有正确的阅读顺序。代码没有任何问题,它工作得很好,但是!...它没有保存prev。图像比例。这是一个大问题,因为我需要它。

例如它看起来如何,从1920x1080调整大小: Resized image by pure code

正如您所见,比率存在问题。 1920x1080 16:9,但640:480 4:3

它应该如何成为我的梦想: Resized image in ideal code

首先,感谢您阅读它。如果你能帮助我解决我的代码问题,我将非常高兴〜 祝你有个美好的一天,我的朋友。

3 个答案:

答案 0 :(得分:5)

您可以将原始帧高度和宽度除以一个值,而不是使用硬编码值640和480,并将其作为参数提供,如下所示:

while success:
  success,image = vidcap.read()
  height , width , layers =  img.shape
  new_h=height/2
  new_w=width/2
  resize = cv2.resize(image, (new_w, new_h)) 
  cv2.imwrite("%03d.jpg" % count, resize) 

答案 1 :(得分:1)

希望添加Saransh提到的有关划分的内容。划分效果很好,但是我相信resize函数期望新维度是int对象,因此请确保使用int(x)round(x, 0)函数。

答案 2 :(得分:0)

请尝试一下。它应该会给您预期的输出。

 def resize_image(image, width, height,COLOUR=[0,0,0]):
    h, w, layers = image.shape
    if h > height:
        ratio = height/h
        image = cv2.resize(image,(int(image.shape[1]*ratio),int(image.shape[0]*ratio)))
    h, w, layers = image.shape
    if w > width:
        ratio = width/w
        image = cv2.resize(image,(int(image.shape[1]*ratio),int(image.shape[0]*ratio)))
    h, w, layers = image.shape
    if h < height and w < width:
        hless = height/h
        wless = width/w
        if(hless < wless):
            image = cv2.resize(image, (int(image.shape[1] * hless), int(image.shape[0] * hless)))
        else:
            image = cv2.resize(image, (int(image.shape[1] * wless), int(image.shape[0] * wless)))
    h, w, layers = image.shape
    if h < height:
        df = height - h
        df /= 2
        image = cv2.copyMakeBorder(image, int(df), int(df), 0, 0, cv2.BORDER_CONSTANT, value=COLOUR)
    if w < width:
        df = width - w
        df /= 2
        image = cv2.copyMakeBorder(image, 0, 0, int(df), int(df), cv2.BORDER_CONSTANT, value=COLOUR)
    image = cv2.resize(image,(1280,720),interpolation=cv2.INTER_AREA)
    return image