Различие между прямоугольником и квадратом в изображении с использованием Python OpenCv2

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

import cv2

raw_image = cv2.imread('test1.png')
cv2.imshow('Original Image', raw_image)
cv2.waitKey(0)

bilateral_filtered_image = cv2.bilateralFilter(raw_image, 5, 175, 175)
cv2.imshow('Bilateral', bilateral_filtered_image)
cv2.waitKey(0)

edge_detected_image = cv2.Canny(bilateral_filtered_image, 75, 200)
cv2.imshow('Edge', edge_detected_image)
cv2.waitKey(0)

_, contours, hierarchy = cv2.findContours(edge_detected_image, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

contour_list = []
for contour in contours:
    approx = cv2.approxPolyDP(contour,0.01*cv2.arcLength(contour,True),True)
    area = cv2.contourArea(contour)
    if ((len(approx) >= 3)):
        contour_list.append(contour)

cv2.drawContours(raw_image, contour_list,  -1, (0,0,0), 2)
cv2.imshow('Objects Detected',raw_image)
cv2.waitKey(0)

Это образец изображения

3 ответа

Решение

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

for contour in contours:
    approx = cv2.approxPolyDP(contour,0.01*cv2.arcLength(contour,True),True)
    area = cv2.contourArea(contour)
    if ((len(approx) == 4)):
        (x, y, w, h) = cv2.boundingRect(approx)
        if  ((float(w)/h)==1):
            cv2.putText(raw_image, "square", (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.7, 0, 2)
        else:
            cv2.putText(raw_image, "rectangle", (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.7, 0, 2)

        contour_list.append(contour)

Это изменение обнаруживает только квадраты и прямоугольники. Внесите необходимые изменения в цикл for для обнаружения кругов. Вы можете работать с len(approx) сделать это различие.

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

Есть бесчисленное множество способов идентификации квадрата.

Его окружность всегда равна sqrt(площадь), следовательно, его окружность всегда равна 0.0625

Расстояние между всеми углами либо a, либо * sqrt(2)

Центроид имеет одинаковое расстояние a / 2 для всех 4 сторон

...

Вы называете это.

У меня есть альтернативный способ:

  1. Найти все подключенные компоненты.

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

  3. Сгруппируйте эти характерные точки, лежащие на одинаковых подключенных компонентах.

  4. Используйте соотношение (расстояние / угол) между этими точками элементов на всех подключенных компонентах и, соответственно, вы можете классифицировать эти геометрические формы.

Я читал в комментариях, что фигуры можно повернуть. В этом случае cv2.boundingRect() не даст правильных результатов, поскольку эта функция всегда дает прямой прямоугольник. Для обнаружения прямоугольников в целом (повернутых или нет) вы должны попробовать cv2.minAreaRect(), которая вернет прямоугольник, который будет повернут в соответствии с контуром и будет иметь минимальную площадь для покрытия контура. Затем вы можете проверить его соотношение сторон, чтобы увидеть, является ли он квадратом или прямоугольником.

Другие вопросы по тегам