我有一个简单的任务: 我有一个图像和一系列点。对于每个点,我想从图像中切出方框。
我可以在for循环中执行此操作,但是对于数千个点来说它非常慢,所以我需要在没有循环的情况下执行此操作。我正在尝试将数组广播到切片值。这是一些说明问题的最小代码:
import numpy as np
frame = cv2.imread("input.png")
pts = np.array([[10,20],
[30,40],
[50,60]]) #and thousands more
x1s = pts[:, 0]
y1s = pts[:, 1]
x2s = x1s + 5
y2s = y1s + 5
cutouts = frame[x1s:x2s,y1s:y2s]
给了我错误:
TypeError: only integer scalar arrays can be converted to a scalar index
为什么呢?切片都是1d整数数组(标量)。这应该工作。有什么问题,我该怎么做?
有关此错误的其他stackoverflow帖子似乎与切片或广播无关。
编辑:要清楚,点数组将是数千个点。我想要一个包含数千个5x5切片的数组,每个切片一个。所以切片从(10,20)开始,另一个切片从(30,40)开始,等等。
Edit2:人们说你不能在二维阵列上播放。然而这个有效,这是相同的概念。为什么呢?
import numpy as np
import cv2
frame = np.arange(50).reshape(5,10)
pts1 = np.array([1,2,3])
pts2 = np.array([4,5,6])
cutouts = frame[pts1,pts2]
print cutouts
#outputs [14 25 36]
答案 0 :(得分:0)
pts [:,0]的形状是(2,),所以它不是标量 试试这个,它应该对你的情况有帮助。
imgfrag = img[pts[0,0]:pts[1,0], pts[0,1]:pts[1,1]]
答案 1 :(得分:0)
答案:无法完成。 Numpy只是不允许它。