У меня есть изображение эллипса, и если изображение имеет эллипс, я нахожу его с помощью findcontours (), а затем я хочу преобразовать этот эллипс в круг.
см. Пример
и я хочу преобразовать каждый из них так, как это
Сначала я применил обнаружение канни-края. Затем к этому изображению применяется findcontour ().
Я нашел эллипс, используя findcontours (), чтобы получить все контуры иполучить требуемый эллиптический контур, а затем я использую fitellipse (), чтобы получить центр, угол поворота и большую и меньшую оси эллипса.
Затем я попытался повернуть изображение на повернутый угол, а затем масштабировать высоту и ширину изображения относительно малой и большой осей (т. Е. Сделать длину главной оси и малой оси одинаковыми), но также я не получаю правильнуюкруговое изображение объекта, как указано выше.Там останется некоторое вращение / оно будет по-прежнему похоже на эллипс, который будет близок к кругу или около того.
_, contours, _ = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
for c in contours:
if len(c) >= 5:
a = cv2.fitEllipse(c)
(x, y), (MA, ma), angle = a
area = (math.pi * MA * ma)/4
if abs(x-image.shape[0]/2) <= 2 and abs(y-image.shape[1]/2) <= 2 and (area - cv2.contourArea(c)) < 50:
screenCount = c
width, height = MA, ma
centerX, centerY = x, y
ellipseAngle = angle
print(width, height, centerX, centerY, ellipseAngle)
# cv2.drawContours(img, c, -1, (0, 255, 0), 4)
cv2.ellipse(img, a, (0, 0, 255), 2, 8)
cv2.imshow("ellipse", img)
break
img = image.copy()
if ellipseAngle < 90:
rotatedImg = imutils.rotate(img, ellipseAngle)
else:
rotatedImg = imutils.rotate(img, -(ellipseAngle - 90))
Тогда я масштабируюсь по большой и малой оси
после примененияfindcontour () я получил эти 2 контура для 1-го изображения в посте
из этих любых контуров в порядкеправо?я использую первый контур от контура согласно коду, и fitellipse () дает мне этот эллипс
РЕДАКТИРОВАНИЕ - Если есть какой-либо лучший подход крешить эту проблему было бы полезно.