2017-10-20 65 views
0

我有一個簡單的任務: 我有一個圖像和點的陣列。對於每個點我想從圖像中切出盒子。如何通過播放切片來切片圖像?錯誤:在python中'只能將整數標量數組轉換爲標量索引'?

我可以在一個循環做到這一點,但對於千點是很慢的,所以我需要做沒有循環。我試圖將數組廣播到切片值。下面是說明了這個問題的一些最少的代碼:

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 

爲什麼?切片都是整數(標量)的一維數組。這應該工作。什麼是錯的,我該怎麼做對嗎?關於此錯誤的

其它計算器職位似乎什麼都沒有做切片或廣播。

編輯:要清楚,點陣列將是千點。我想要一個數以千計的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

的「整數標量數組」是像'陣列(3)' - 0維包含單個整數數組。它不是任意整數標量的數組。 – user2357112

+0

請參閱編輯2.爲什麼一個示例工作,另一個示例沒有。 –

+0

您不能將陣列用作切片端點。 – user2357112

回答

0

答:不能這樣做。 Numpy只是不允許它。

0

點的形狀[:, 0](2),所以它不是一個標量 試試這個,它應該幫助你的情況。

imgfrag = img[pts[0,0]:pts[1,0], pts[0,1]:pts[1,1]] 
+0

我正在尋找一種不僅僅適合2點的解決方案。 如果我打印出來分[:,0],我獲得一個標量的一維數組,看起來像這樣: [10,30,價值,價值,價值..] 這應該符合廣播標準。 –

+0

boradcast僅當您嘗試在2路程序上進行計算時纔有意義。你正在使用pts [:,0]作爲索引。我不認爲這是一個boradcast案件。 –

+0

請參閱edit2 –

相關問題