Создание списка контуров
У меня есть (х, у) точек для контурных линий (cnt
). Сравнивая структуру данных со структурой findContours
возвращаемое значение (contoure
) Я создал список, который выглядит практически идентично.cnt
это список 3D-массивов и contoure
список 3D-массивов
Я получаю следующие результаты:
len(cnt) = 140
len(contoure) = 140
cnt.shape = (20L,1L,2L)
contoure.shape = (20L,1L,2L)
np.size(cnt,0) = 140
np.size(contoure,0) = 140
np.size(cnt) = 5600
np.size(contoure) = 140
Я не понимаю, почему я получаю "индекс кортежа вне диапазона" для np.size(contoure,1)
(Обратите внимание, что contoure[i]
это 3D массив!) но без ошибок np.size(cnt,1)
и почему np.size(cnt) != np.size(contoure)
,
Я предполагаю, что drawContours не работает с cnt
из-за этой разницы, но я понятия не имею, почему это происходит.
РЕДАКТИРОВАТЬ: контур создается с помощью вызова findContours(). Я не знаю точно, как создается cnt, потому что мой друг запрограммировал эту часть кода, я получаю результат только в следующей форме: all_cnt:
x11 x12 ... x1n
y11 y12 ... y1n
.
.
xm1 xm2 ... xmn
ym1 ym2 ... ymn
где x1,y1 - это n пар, описывающих первый контур. Чем я использую следующий код:
cnt=[]
for i in range(140):
a=all_cnt[2*i:2*i+2]
a = np.reshape(np.ravel(a,order='F'),(20,1,2))
cnt.append(a)
1 ответ
Проблема в том, что трехмерные массивы внутри списка контуров должны иметь тип int32. В моем случае я должен был определить all_cnt как all_cnt.astype(np.int32).
Если вы не используете findContours и хотите использовать drawContours(), параметр contours должен выглядеть следующим образом: list(array,array,...), где dtype для массива int32, а каждый массив выглядит следующим образом: [ [ [x1, y1] ], [ [x2, y2] ], [ [x3, y3] ], [ [x4, y4] ], ... ]. Каждый массив содержит граничные точки 1 объекта.