Поиск квадрата внутри массива точек - PullRequest
0 голосов
/ 13 февраля 2019

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

    image = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    corners = cv2.goodFeaturesToTrack(image, 20, 0.01, 15)
    corners = np.int0(corners)
    print("Points")
    for corner in corners:
        x, y = corner.ravel()
        cv2.circle(image, (x, y), 5, (0, 0, 255), -1)
    print(corners)
    corners = corners.tolist()
    corners = flatten(corners)

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

[[10,50],[420,188],[177,425],[225,425],[176,220],[225,221],[10,170],[21,50],[21,170]]

1 Ответ

0 голосов
/ 14 февраля 2019

Один уродливый способ сделать это - перебрать все комбинации из 4 точек и проверить, чтобы они определяли квадрат.

Здесь функция для проверки статуса квадрата:

def is_square_func(a, b, c, d):
    is_square = a[0] == b[0]
    is_square = (is_square and c[0] == d[0])
    is_square = (is_square and a[1] == c[1])
    is_square = (is_square and b[1] == d[1])

    # Condition to find a square only once
    is_square = (is_square and a[0] > c[0])
    is_square = (is_square and c[1] > d[1])

    return is_square

А вот и функция, которую нужно применить в вашем списке координат:

def find_squares(point_array):
    n = len(point_array)
    squares = []
    for i in range(n):
         for j in range(n):
                 if i == j:
                         continue
                 for k in range(n):
                         if i == k or j == k:
                                 continue
                         for l in range(n):
                                 if i == l or j == l or k == l:
                                         continue
                                 if is_square_func(point_array[i], point_array[j], point_array[k], point_array[l]):
                                         print("New square")
                                         print(point_array[i])
                                         print(point_array[j])
                                         print(point_array[k])
                                         print(point_array[l])
                                         squares += [point_array[i], point_array[j], point_array[k], point_array[l]]
    return squares
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...