问题描述
我正在尝试获取视频的第一帧,将其裁剪到 5 个不同的位置并将它们保存为 5 张 jpg 图像。
我有 5 个投资回报率列表:
info_pos = ("325:370,510:920","424:470,"470:525,"625:670,"725:925,510:1600")
我试过了:
vidcap = cv2.VideoCapture('test.mov')
success,image = vidcap.read()
for i in range(0,5):
crop_img = image[info_pos[i]]
cv2.imwrite("frame%s.jpg" % i,crop_img)
但得到错误:
IndexError:只有整数、切片 (:
)、省略号 (...
)、numpy.newaxis (None
) 和整数或布尔数组是有效索引
我知道我的列表是字符串,但 cv2 需要带冒号的 int。 请告知如何正确存储 5 ROI 以及如何在循环中应用它。我试图查看 np.array 但没有成功。
谢谢。
解决方法
您可以先用逗号再用冒号解析字符串,然后将索引转换为int
。
对于解析,您可以使用 s.split()
方法(当 s
是字符串时)。
-
从索引
s
中获取i
字符串:s = info_pos[i]
-
用逗号解析
s
:c = s.split(',')
-
通过冒号解析
c
:p = c.split(':')
使用简洁的 Python 代码构建列表列表:
p = [c.split(':') for c in s.split(',')]
例如:
当 s
= "325:370,510:920"
时,p
= [['325','370'],[' 510','920']]
-
转换为
int
并裁剪:crop_img = image[int(p[0][0]):int(p[0][1]),int(p[1][0]):int(p[1][1])]
以下是解析 info_pos
并裁剪 ROI 的代码示例:
import cv2
import numpy as np
image = np.zeros((1600,1200,3),np.uint8) # Zeros image (used in place of image from success,image = vidcap.read())
info_pos = ("325:370,510:920","424:470,"470:525,"625:670,"725:925,510:1600")
for i in range(0,5):
s = info_pos[i]
p = [c.split(':') for c in s.split(',')] # Parse string: First p = [['325','920']]
crop_img = image[int(p[0][0]):int(p[0][1]),int(p[1][0]):int(p[1][1]),:] # The last colon needed if image is in BGR format
cv2.imwrite("frame%s.jpg" % i,crop_img)