问题的主要思想。我正在使用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 16:9,但640:480 4: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