Я уже пробовал несколько подходов для создания boundingRect() вокруг minAreaRect(), но я все время сталкиваюсь с ошибкой. Я мог бы просто использовать оригинальный контур «да», но в этот момент нужно понять, почему контур, который работает с cv2.isContourConvex() и cv2.drawContours(), не будет работать с cv2.boundingRect(). В основном я стараюсь лучше понять конструкцию контура.Преобразование cv2.minAreaRect() вывод в контур для ввода в cv2.boundingRect()
Вот код:
import cv2
import numpy as np
# EX1: draw contour from minAreaRect() output
mar = cv2.minAreaRect(contour)
pts = cv2.cv.BoxPoints(mar)
pts_contour = np.int0(pts)
cv2.drawContours(mask, [pts_contour], 0, 255, -1)
cv2.boundingRect(pts_contour) # ERROR: see below
# EX2: test contour convex
contour = np.array([(378, 949), (375, 940), (368, 934),
(359, 932), (350, 937), (345, 955), (351, 962), (359, 966), (368, 964),
(376, 958) ], dtype=np.int)
print cv2.isContourConvex(contour)
cv2.boundingRect(contour) # ERROR: see below
ЕХ1: Ошибка из boundingRect(): OpenCV Ошибка: неподдерживаемый формат или комбинации форматов (Формат изображения/матрица не поддерживается функцией) в cvBoundingRect Этот пример преобразования в контур был предоставлен в Rotated Rectangles section here
EX2: Ошибка из boundingRect(): OpenCV Ошибка: Утверждение не удалось (points.checkVector (2)> = 0 & & (points.depth() == CV_32F || points.depth() == CV_32S)) в boundingRect Этот пример создания контура с нуля was provided here
Снова я могу выполнить свои цели, поэтому я не хочу предложений по обходным методам, но вместо этого я хотел бы лучше понять конструкцию, лежащую за контуром и самой ошибкой, потому что я мог бы см., что это полезно для создания boundingRect() из выбранных точек.
Кроме того, я не знаю, имеет ли значение, но я заметил, что существует разница между выходом из BoxPoints() и findContours() [0 ]:
# BoxPoints:
[[1051 1367]
[ 968 1364]
[ 977 1072]
[1061 1074]]
# findCountours()[0]:
[[[ 992 1073]]
[[ 991 1074]]
[[ 989 1074]]
[[ 988 1073]]]
>>> cv2.__version__
'2.4.9'
cv2.boxPoints() недоступен для меня, поэтому я не уверен, если это будет чистая меня разные результаты
Так что я исправил ошибку dtype, я должен был это понять, но в тот момент я был в конце моей веревки. Когда я подаю это на cv2.isContourConvex(), все хорошо. Я также дал его как вход для cv2.minAreaRect() без проблем. Однако cv2.boundingRect() теперь дает ту же ошибку, что и ex1 для ex2.fixed. Любые мысли о том, почему одна функция принимает этот формат как данные о точках, а другая нет? – afinit
Я считаю, что некоторые функции требуют более глубокого типа данных, если они выполняют суммы (в противном случае значения могут переполняться) или требуют типа данных с плавающей точкой, если они используют фракции (например, accumulateWeighted) –