Согласно предоставленной информации и образцам изображений, вот как я подошел бы к этой проблеме:
Предпосылка
Красные метки — это строки, созданные HoughLinesP
. , у вас есть следующая информация о каждой строке: (x1, y1, x2, y2) где (x1, y1) — начальная точка, а (x2, < em>y2) конечная точка линии.
Для тестирования я создал 3 строки:
Трубопровод
- Создайте список точек (
contour
в моем коде), содержащий начальные и конечные точки каждой линии.
- Вычислите выпуклую оболочку списка точек, используя
convexHull
.
На данный момент вы получите что-то в этом вкусе:
Обратите внимание, что сгенерированная оболочка (зеленая) содержит более 4 точек (то есть не только крайние точки). Итак, что мы сделаем дальше, так это упростим корпус, чтобы сохранить только 4 крайних точки.
- Упростите корпус с помощью
approxPolyDP
а>
- Оставшиеся 4 точки корпуса должны быть аппроксимацией крайних точек.
Здесь вы можете увидеть окончательный результат с приблизительным корпусом зеленым цветом и 4 крайними точками желтым цветом:
Код Python
Наконец, в качестве справки, вот код Python, который я использовал (его не должно быть сложно портировать на Java):
import numpy as np
import cv2
input_img = np.zeros((400,400,3), np.uint8)
# 3 lines added for testing purpose
lines = []
lines.append(((350,350),(250,200))) # (start point, end point)
lines.append(((50,350),(55,330)))
lines.append(((60,250),(80,200)))
contour = [] #in Java you'd use a List of Points
for line in lines:
# we create a contour with the start and end points of each line
contour.append(line[0])
contour.append(line[1])
# we draw the lines (in your case, detected by HoughLinesP)
cv2.line(input_img,line[0],line[1],(0,0,255),3)
contour = np.array(contour)
hull = cv2.convexHull(contour) # we compute the convex hull of our contour
epsilon = 0.05*cv2.arcLength(hull,True) # epsilon may need to be tweaked
approx_hull = cv2.approxPolyDP(hull,epsilon,True)
# we check that there are only 4 points left in the approximate hull (if there are more, then you'd need to increase epsilon
if(len(approx_hull) == 4):
for final_point in approx_hull :
# we draw the 4 points contained in the approximate hull
cv2.circle(input_img, (final_point[0][0], final_point[0][1]),5,(0,242,255),2)
cv2.drawContours(input_img, [approx_hull], 0, (0,255,0),1)
cv2.imshow("result",input_img)
Альтернатива
Я думаю, что это решение от @YvesDaoust также может сработать. У меня не было времени проверить это, поэтому, пожалуйста, держите меня в курсе, если вы это сделаете. :)
person
Elouarn Laine
schedule
10.08.2017