Обнаружение прямоугольника на игровой доске с помощью opencv python

Я новичок в opencv, использую python, поэтому, пожалуйста, потерпите меня. У меня есть лоток с разными размерами кружков как по ссылке. https://is.alicdn.com/img/pb/810/421/429/429421810_364.jpg Это не то изображение, которое у меня есть, но оно очень похоже на предыдущее. Мне нужно обнаружить лоток на изображении и найти контуры всех отверстий (кружков) в лотке. Лоток может быть наклонен в зависимости от пользователя, снимающего изображение. До сих пор я использовал размытие по Гауссу и точное обнаружение краев на изображении, а также закрыл пробелы в точном обнаружении краев. Это изображение после обнаружения Canny Edge  After Canny Edge Detection Это изображение после морфологии. После морфологии Затем я использовал findcontours и попытался найти самый большой контур с 4 вершинами, который в идеале был бы самим лотком. Обнаружение контура может идентифицировать только левую вертикальную границу и верхнюю горизонтальную границу. Он не может распознать 4 края лотка.

Это мой код на данный момент:

import numpy as np
import cv2
import matplotlib.pyplot as plt

image = cv2.imread("img.jpg")
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
image = cv2.GaussianBlur(image, (3, 3), 0)
image_canny = cv2.Canny(image, 30, 200)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))
gaps_closed = cv2.morphologyEx(image_canny, cv2.MORPH_CLOSE, kernel)
_, contours, _= cv2.findContours(gaps_closed.copy(), cv2.RETR_TREE, 
cv2.CHAIN_APPROX_SIMPLE)
contours = sorted(contours, key = cv2.contourArea, reverse = True)
[:5]
Cnt = None
for c in contours:
    peri = cv2.arcLength(c, True)
    approx = cv2.approxPolyDP(c, 0.04 * peri, True)

    if len(approx) == 4:
        Cnt = approx
        break

cv2.drawContours(image, [Cnt], -1, (0, 255, 0), 4)
plt.imshow(image)
plt.show()

person dep234    schedule 29.06.2017    source источник
comment
Можете ли вы присоединить текущий вывод после операции Canny и морфологии?   -  person ZdaR    schedule 29.06.2017
comment
@ZdaR: Добавил картинки.   -  person dep234    schedule 29.06.2017


Ответы (2)


Настройка параметров cv2.canny должна облегчить обнаружение краев лотка. Однако использование cv2.HoughLines может быть лучшим способом обнаружения лотка, поскольку HoughLines не требует обнаружения всего края.

person Totoro    schedule 29.06.2017

Выполнение выравнивания гистограммы на входе должно улучшить контраст вашего изображения. Это улучшит распознавание краев изображения.

Поскольку дыры в вашем изображении кажутся маленькими, морфологические операции могут не подходить. Это закроет отверстия, и вы не сможете их восстановить.

Opencv имеет реализации для преобразования круга Хафа. Вот пример учебника по Python: http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_houghcircles/py_houghcircles.html. Использование этого должно решить ваши проблемы.

Если это не сработает, будет полезно опубликовать ваше фактическое входное изображение.

person Shawn Mathew    schedule 29.06.2017