#python-3.x #opencv #computer-vision
#python-3.x #opencv #компьютерное зрение
Вопрос:
В моем приложении я использую определение линий Хафа для обнаружения линий внутри изображения. То, что я пытаюсь сделать, это получить только те линии, которые составляют границу и углы каждого квадрата шахматной доски. Как я могу применить фильтры, чтобы получить четкое представление о строках? Моя идея состоит в том, чтобы применить фильтры для проверки угла между каждой строкой (90 градусов) или расстояния, чтобы получить только те строки, которые считаются. Конечной целью будет получение пересечения между этими линиями, чтобы получить координаты каждого квадрата.
Код:
chessBoard = cv2.imread('img.png')
gray = cv2.cvtColor(chessBoard,cv2.COLOR_BGR2GRAY)
dst = cv2.Canny(gray, 50, 200)
lines= cv2.HoughLines(dst, 1, math.pi/180.0, 100, np.array([]), 0, 0)
a,b,c = lines.shape
for i in range(a):
rho = lines[i][0][0]
theta = lines[i][0][1]
a = math.cos(theta)
b = math.sin(theta)
x0, y0 = a*rho, b*rho
pt1 = ( int(x0 1000*(-b)), int(y0 1000*(a)) )
pt2 = ( int(x0-1000*(-b)), int(y0-1000*(a)) )
cv2.line(chessBoard, pt1, pt2, (0, 255, 0), 2, cv2.LINE_AA)
Комментарии:
1. Первая идея, которая приходит на ум, — найти все пересечения линий и выбрать 81 точку из тех, которые образуют примерно равномерно распределенную сетку 9×9.
2. Не могли бы вы показать мне свою идею с примером кода? @JussiNurminen
3. У меня нет времени на написание полного кода, но я бы сформулировал это как проблему оптимизации. Создайте «идеальную» сетку точек размером 9×9, назовите ее G. Затем возьмите все ваши пересечения линий и вызовите этот набор P. P намного больше, чем G. Теперь применяйте вращение, масштабирование и преобразование к G, пока не получите оптимальное соответствие между P и G. В качестве критерия оптимизации вы могли бы использовать среднее минимальное расстояние между точками P и G. Затем G выдает вам сетку, которую вы ищете. Конечно, это требует некоторого знакомства с числовым программированием.
4. У вас есть некоторые искажения изображения, из-за которых линии не являются прямыми. Чем дальше от середины изображения, тем сильнее это искажение. Вот почему вы находите так много линий для каждого из краев внешней стороны платы. Это искажение затруднит поиск хорошей сетки. Альтернативным подходом было бы найти углы, а не линии, и подогнать к ним сетку. Может быть проще.