Я работаю с OpenCV по обнаружению рук. Но я борюсь, когда пытаюсь обвести контуры обмолоченного изображения. findContour
всегда будет пытаться найти белую область в качестве контура.
Так что в основном это работает в большинстве случаев, но иногда мое обмолоченное изображение выглядит так:
_, threshed = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY|cv2.THRESH_OTSU)
Поэтому, чтобы это заработало, мне просто нужно изменить тип порога cv2.THRESH_BINARY_INV
.
_, threshed = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV|cv2.THRESH_OTSU)
И это работает хорошо.
Мой вопрос: как я могу определить, когда порог нужно изменить? Нужно ли всегда находить контуры на обоих обмолоченных изображениях и сравнивать результат (в этом случае как?)? или есть способ смягчить информацию, если контуры не полностью пропущены.
РЕДАКТИРОВАТЬ : Есть способ быть на 100% уверенным, что контур похож на руку?
РЕДАКТИРОВАТЬ 2 : Так я забыл упомянуть, что я пытаюсь обнаружить кончики пальцев и дефекты, используя этот метод, поэтому мне нужны дефекты, которые с первым обмолотым изображением я не могу их найти, потому что оно перевернуто. См. синюю точку на Первом контуре изображение.
Спасибо.
Хорошо, плохо, я забыл кое-что, я отредактирую вопрос. Как раз здесь мне нужно выявить дефектные точки.
Вы можете написать служебный метод для определения наиболее доминирующего цвета вдоль границы, а затем решить логику, хотите ли вы инвертировать изображение или нет, поэтому поток может выглядеть так:
get_most_dominant_border_color
и получите доминирующий цвет.WHITE
, то вы должны инвертировать изображение, используя cv2.bitwise_not
, в противном случае оставьте его только таким.get_most_dominant_border_color
можно определить как:
from collections import Counter
def get_most_dominant_border_color(img):
# Get the top row
row_1 = img[0, :]
# Get the left-most column
col_1 = img[:, 0]
# Get the bottom row
row_2 = img[-1, :]
# Get the right-most column
col_2 = img[:, -1]
combined_li = row_1.tolist() + row_2.tolist() + col_1.tolist() + col_2.tolist()
color_counter = Counter(combined_li)
return max(color_counter.keys(), key=lambda x:color_counter.values())
Хорошо, я понимаю алгоритм, но я получил TypeError: '>' not supported between instances of 'dict_values' and 'dict_values'
исключение в этой строке: return max(color_counter.keys(), key=lambda x:color_counter.values())
. Не могли бы вы объяснить больше, что он делает? В основном key: lambda part
?
Какую версию Python вы используете?
python3.7.3, я понял, в чем проблема, сейчас пытаюсь ее решить. Когда я печатаю color_counter.keys()
, вместо dict_keys([255, 0])
возвращается [255, 0]
.
Поэтому, чтобы избежать этой ошибки, я конвертирую ключи в список, и это работает. КЛЮЧИ: colors_keys = list(color_counter.keys())
-- ЗНАЧЕНИЯ : colors_values = list(color_counter.values())
-- МАКС : dominant_color = max(colors_keys, key=lambda x:colors_values)
findContours будет работать так же с инвертированным бинарным изображением, поэтому, если вам нужен только контур, вам не нужно об этом беспокоиться.