нужно найти, какая форма большая, а какая маленькая, из кода python opencv

#python #opencv

Вопрос:

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

Комментарии:

1. Во-первых, вы должны перевернуть изображение порога, чтобы прямоугольники были белыми на черном фоне. Затем вы должны использовать cv2.EXTERNAL для своих контуров. Как только у вас появятся контуры, вы сможете найти области с помощью cv2.contourArea(). Затем вы можете сравнить контуры, чтобы найти самый большой и самый маленький.

2. можете ли вы дать мне пример кода. это будет очень полезно. Спасибо

Ответ №1:

Вот один из способов сделать это в Python/OpenCV.

Преобразуйте в оттенки серого и используйте пороговое значение Otsu. Затем переверните пороговое изображение так, чтобы прямоугольники были белыми на черном фоне. Затем получите внешние контуры. Затем возьмите прямоугольники минимальной и максимальной площади и ограничительные рамки и распечатайте эти статистические данные.

Ввод:

введите описание изображения здесь

 import cv2
import numpy as np

# read image
img = cv2.imread('2rectangles.jpg')

# convert to grayscale
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# threshold
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY cv2.THRESH_OTSU)[1]

# invert so rectangles are white on black background
thresh = 255 - thresh

# get contours
result = img.copy()
contours = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours = contours[0] if len(contours) == 2 else contours[1]

# get largest and smallest contour by area
big_contour = max(contours, key=cv2.contourArea)
little_contour = min(contours, key=cv2.contourArea)

# get location and area
area1 = cv2.contourArea(big_contour)
x1,y1,w1,h1 = cv2.boundingRect(big_contour)
cv2.rectangle(result, (x1, y1), (x1 w1, y1 h1), (0, 0, 255), 2)
print("red - largest rectangle x,y,w,h,area:",x1,y1,w1,h1,area1)

area2 = cv2.contourArea(little_contour)
x2,y2,w2,h2 = cv2.boundingRect(little_contour)
cv2.rectangle(result, (x2, y2), (x2 w2, y2 h2), (0, 255, 0), 2)
print("green - smallest rectangle x,y,w,h,area:",x2,y2,w2,h2,area2)

# save resulting image
cv2.imwrite('2rectangles_result.jpg',result)

# show thresh and result    
cv2.imshow("bounding_boxes", result)
cv2.waitKey(0)
cv2.destroyAllWindows()
 

Результирующие ограничительные рамки — самые большие красным цветом и самые маленькие зеленым:

введите описание изображения здесь

Комментарии:

1. не могли бы вы помочь мне еще в одном? как я могу объединить эти два кода? мне нужно показать, имеет ли он круглую или прямоугольную форму, и получить маленький большой тоже.

2. Вы можете использовать мой код вплоть до определения контуров с помощью внешних контуров включительно. Затем отсортируйте контуры по площади с помощью cv2.contourArea. Затем используйте свой цикл for для выполнения cv2.approxPolyDP, чтобы определить, сколько вершин.