#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, чтобы определить, сколько вершин.