Различие между прямоугольником и квадратом в изображении с использованием 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 сторон
...
Вы называете это.
У меня есть альтернативный способ:
Найти все подключенные компоненты.
Найдите характерные точки на исходном изображении, так как в этом случае у нас есть простые геометрические тела, а не сложные объекты, вы можете использовать угловые точки в качестве характерных точек, используя алгоритм углов Харриса.
Сгруппируйте эти характерные точки, лежащие на одинаковых подключенных компонентах.
Используйте соотношение (расстояние / угол) между этими точками элементов на всех подключенных компонентах и, соответственно, вы можете классифицировать эти геометрические формы.
Я читал в комментариях, что фигуры можно повернуть. В этом случае cv2.boundingRect() не даст правильных результатов, поскольку эта функция всегда дает прямой прямоугольник. Для обнаружения прямоугольников в целом (повернутых или нет) вы должны попробовать cv2.minAreaRect(), которая вернет прямоугольник, который будет повернут в соответствии с контуром и будет иметь минимальную площадь для покрытия контура. Затем вы можете проверить его соотношение сторон, чтобы увидеть, является ли он квадратом или прямоугольником.