OpenCV findContours () обнаруживает контуры только в том случае, если изображение сохранено и прочитано заранее - PullRequest
0 голосов
/ 11 июля 2020

Предоставляем некоторый контекст: я пытаюсь получить количество ящиков на этом изображении, введите описание изображения здесь

У меня есть приведенное выше изображение, сохраненное в ndarray blank_img.

Если я запустил следующее:

v = np.median(blank_img)
sigma = 0.33
lower = int(max(0, (1.0 - sigma) * v))
upper = int(min(255, (1.0 + sigma) * v))
edges = cv2.Canny(blank_img, lower, upper, 3)
edges = cv2.dilate(edges, np.ones((2, 2), dtype=np.uint8))

cnts= cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]

len (cnts) равно 1. Но если я сохраню массив blank_img перед обнаружением хитрых краев и findContours, как показано ниже:

cv2.imwrite('boxes.jpg', blank_img)

blank_img = cv2.imread('boxes.jpg')

Теперь, когда я запускаю свой фрагмент кода findContour, len (cnts)> 1. Я хотел бы знать как исправить это, чтобы мне не требовалось накладных расходов на сохранение изображений.

~~ EDIT ~~ Найдите следующий код, который я использовал для создания blank_img

blank_img = 255*np.zeros((height, width, 3), np.uint8)
for line in lines:
    x1, y1, x2, y2 = line
    cv2.line(blank_img,(x1,y1),(x2,y2),(255,255,255),1)

Где lines - это список строк, возвращаемых HoughLinesP:

lines = cv2.HoughLinesP(edges, 1, np.pi / 180, 100, None,minlinelength,maxlinegap)

1 Ответ

2 голосов
/ 11 июля 2020

Вот в чем проблема:

Смотрите это изображение:

проблема здесь

Маленький зеленый независимый прямоугольник в нижнем левом углу создается, когда вы сохраняете изображение и читаете его снова. Фактическая длина cnts должна быть равна только 1 (внешний большой прямоугольник).

Этот маленький прямоугольник появляется в изображении Canny edge после того, как вы сохраните изображение и снова прочитаете его. Я не знаю причину, по которой это обнаруживается, когда вы сохраняете изображение, а затем читаете его. Просто удалите 2 строки и используйте только изображение.

...