Виновником здесь является утверждение frame = frame[1]
, , потому что (выделено мной)
[Индексирование с помощью] Целое число i возвращает те же значения, что и i:i+1
, за исключением того, что размерность возвращаемого объекта уменьшается на 1 . В частности, кортеж выбора с p-м элементом целым числом (и всеми другими записями :) возвращает соответствующий подмассив с измерением N - 1. Если N = 1, то возвращаемый объект является скалярным массивом.
Следовательно, вы превратили 3-мерное ndarray
, представляющее 3-канальное изображение BGR, в 2-мерное ndarray
. Благодаря тому, как работают привязки OpenCV в Python, двумерное ndarray
обрабатывается как 1-канальное (в градациях серого) изображение.
Это легко продемонстрировать в интерпретаторе командной строки:
>>> import numpy as np
>>> a = np.arange(4*4*3, dtype=np.uint8).reshape(4,4,3)
>>> a
array([[[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]],
[[12, 13, 14],
[15, 16, 17],
[18, 19, 20],
[21, 22, 23]],
[[24, 25, 26],
[27, 28, 29],
[30, 31, 32],
[33, 34, 35]],
[[36, 37, 38],
[39, 40, 41],
[42, 43, 44],
[45, 46, 47]]], dtype=uint8)
>>> a.shape
(4, 4, 3)
>>> a[1]
array([[12, 13, 14],
[15, 16, 17],
[18, 19, 20],
[21, 22, 23]], dtype=uint8)
>>> a[1].shape
(4, 3)
Решение простое, вместо этого используйте frame = frame[1:2]
.
Продолжая вышеприведенную демонстрацию:
>>> a[1:2]
array([[[12, 13, 14],
[15, 16, 17],
[18, 19, 20],
[21, 22, 23]]], dtype=uint8)
>>> a[1:2].shape
(1, 4, 3)
Как отмечает Иван Поздеев в комментарии, есть и другие альтернативные обозначения. Имея это в виду, я бы, вероятно, выбрал
frame = frame[[1]]
, поскольку оно кратко и требует указания только нужного вам индекса.