微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用带有多个 ROI 列表的 CV2 进行裁剪?

如何解决如何使用带有多个 ROI 列表的 CV2 进行裁剪?

我正在尝试获取视频的第一帧,将其裁剪到 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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。