2014-11-19 2 views
0

Я уже пробовал несколько подходов для создания 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() недоступен для меня, поэтому я не уверен, если это будет чистая меня разные результаты

ответ

1

Одна деталь в EX2 явно в сообщении об ошибке OpenCV: он ожидает массив dtype float32 или int32: (points.depth() == CV_32F || points.depth() == CV_32S). (проверено с numpy v19, которое, если бы я предполагал, что вы не используете, так как я не мог найти int0)

Что касается EX1, извините, я не могу воспроизвести его с помощью opencv 3.0.0-beta (cv2.cv отсутствует). Кстати, я предлагаю не тратить слишком много времени на эту часть библиотеки: cv2.cv - это legacy feature.

+0

Так что я исправил ошибку dtype, я должен был это понять, но в тот момент я был в конце моей веревки. Когда я подаю это на cv2.isContourConvex(), все хорошо. Я также дал его как вход для cv2.minAreaRect() без проблем. Однако cv2.boundingRect() теперь дает ту же ошибку, что и ex1 для ex2.fixed. Любые мысли о том, почему одна функция принимает этот формат как данные о точках, а другая нет? – afinit

+0

Я считаю, что некоторые функции требуют более глубокого типа данных, если они выполняют суммы (в противном случае значения могут переполняться) или требуют типа данных с плавающей точкой, если они используют фракции (например, accumulateWeighted) –

0

Вы должны написать вот так: (x, y, w, h) = cv2.boundingRect (pts_contour) Он возвращает кортеж при использовании этой функции.

Смежные вопросы