Python не может транслировать входной массив из формы (144,291,3) в форму (140,300,3)

Я пытаюсь создать метод в python, который обрезает и масштабирует фрейм, он должен вставлять черные полосы, если фрейм слишком мал для экрана. Проблема здесь в массиве, по какой-то причине он просто не может поместиться один в другой, и я не знаю почему. Это происходит не с каждым кадром, это, кажется, просто происходит с одним случайным кадром, в котором нет ничего особенного по сравнению с другими кадрами. Однако это всегда происходит в одном и том же кадре.

def displayFrame(image, csFrame, h, w):
resizedImage = cv2.resize(image, (0,0), fx=csFrame.WScale, fy=csFrame.HScale)
desiredImage = resizedImage[int(csFrame.H * csFrame.HScale):int(csFrame.H * csFrame.HScale + h), int(csFrame.W * csFrame.WScale):int(csFrame.W * csFrame.WScale + w)]
starth = 0
startw = 0
newImage = np.zeros((h, w, 3), np.uint8) #If one of the two directions is "zoomed out" too much, black bars will fill in the excess space
if len(desiredImage) < h:
    starth = int(np.floor((h-len(desiredImage))/2))
if (len(desiredImage[0])) < w:
    startw = int(np.floor((w-len(desiredImage[0]))/2))
desiredH = len(desiredImage)
desiredW = len(desiredImage[0])
print("desired:", len(desiredImage[0:desiredH][0:desiredW]), len((desiredImage[0:desiredH][0:desiredW])[0]), "newImage:", len(newImage[starth:(starth+desiredH)][startw:(startw+desiredW)]), len((newImage[starth:(starth+desiredH)][startw:(startw+desiredW)])[0]), "start:", starth, startw)
newImage[starth:(starth+desiredH)][startw:(startw+desiredW)] = desiredImage[0:desiredH][0:desiredW]
return newImage

Ошибка возникает в последней строке перед возвратом. Я действительно не знаю почему, но похоже, что и «DesiredH», и «DesiredW» имеют разные значения в этих разных местах. Ни "newImage", ни "желаемое изображение" не выходят за границы в этой операции. Я действительно не понимаю, почему эти массивы не имеют одинакового размера, просто глядя на это, они должны иметь одинаковый размер, поскольку я передаю его через то, какой должна быть их форма.

0
0
30
1

Ответы 1

Вы должны чем-то дополнить свой тензор, потому что формы не складываются, 144*291*3 не равен 140*300*3. Я предлагаю удалить этот образец из набора данных.

Да, я знаю, что формы не совпадают, это скорее вопрос, почему они не совпадают. Если вы посмотрите на строку, которая копирует желаемое изображение в часть newImage, у нее должна быть такая же форма, верно? В обоих случаях он использует желаемыйH и желаемыйW, но каким-то образом создает массивы разных форм.

DrRonne 31.10.2018 13:47

Это должно быть, но в python, если у вас есть список as = 'aaaa', если вы используете a[:500], вы получите тот же список as длиной 4. Итак, этот образец явно плохой формы, и, как я уже сказал, я предлагаю вам удалить его из набора данных. Если окажется, что у вас есть больше образцов с этой проблемой, вам следует рассмотреть другие решения этой проблемы, кроме удаления всех этих образцов с другой формой.

Novak 31.10.2018 14:33

Удаление его из набора данных, к сожалению, не вариант ... Я также подумал, что это могло быть из-за того, что массив просто был недостаточно большим, поэтому он занимал меньшую длину, но, похоже, это тоже не тот случай ... .

DrRonne 31.10.2018 16:28

Попробуйте найти самую маленькую фигуру в наборе данных и измените все другие выборки данных на этот размер.

Novak 01.11.2018 10:23

Другие вопросы по теме