Как узнать, нужно ли поменять тип порога после findContour - PullRequest
0 голосов
/ 10 июля 2019

Я работаю с OpenCV по обнаружению рук.Но я борюсь, когда пытаюсь обводить контуры обмолота.findContour всегда будет пытаться найти белую область как контур.

Так что в основном это работает в большинстве случаев, но иногда мое изображение обмолота выглядит так:

_, threshed = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY|cv2.THRESH_OTSU) Base enter image description here

Итак, чтобы все заработало, мне просто нужно изменить тип порога cv2.THRESH_BINARY_INV.

_, threshed = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV|cv2.THRESH_OTSU)

Reverse DrawContour

И это хорошо работает.

Мой вопрос: как я могу определить, когда необходимо изменить порог?Нужно ли всегда находить контуры на обоих обмолоченных изображениях и сравнивать результат (в данном случае как?)?или есть способ, позволяющий замедлить, если контуры не будут полностью пропущены.

РЕДАКТИРОВАТЬ : есть способ быть на 100% уверенным, что контур выглядит как рука?

EDIT 2 : Итак, я забыл упомянуть, что я пытаюсь обнаружить кончики пальцев и дефекты, используя этот метод , поэтому мне нужны дефекты, которые с первым обмолоченным изображением я могу 'не могу найти их, потому что все изменилось.См. Синюю точку на Первом контуре изображение .

Спасибо.

1 Ответ

2 голосов
/ 10 июля 2019

Вы можете написать служебный метод для определения наиболее доминирующего цвета вдоль границы, а затем решить логику, как если вы хотите инвертировать изображение или нет, поэтому поток может выглядеть следующим образом:

  1. Использовать метод бинаризации ОГТУ.
  2. Передайте пороговое изображение служебному методу get_most_dominant_border_color и получите доминирующий цвет.
  3. Если цвет рамки 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())
...