fitEllipse 方法中实际旋转的角度在哪里?

数据挖掘 Python opencv
2022-02-24 14:30:15

主要任务:我使用该方法拟合椭圆fitEllipse(),然后我想计算生成的椭圆的水平轴和长轴之间的旋转角度。我将使用该fitEllipse()方法的第三个返回参数来执行此操作 -θ(旋转角度)。

主要问题:我找不到有关该角度位于哪个轴之间的确切信息。

其他:如果我是正确的,椭圆中的短轴长度和长轴长度与旋转矩形中的两侧长度相同。

资料来源

  1. 这里的文档(nb. 9 节)看来,这个角度在水平轴和第一边之间,它是如何在 CvBox2D 部分中编写的。因此,这意味着该角度可以在水平轴和短轴或长轴之间。但:
  2. 在本文(第 3 节)中,第一个示例很好,但在第二个示例中,角度应该在水平轴和高度之间,而不是宽度(参考我前面提到的第一点)。
  3. 在这篇文章中,它显示了垂直轴和矩形的一侧之间的角度。

那么,fitEllipse() 方法中的旋转角度在哪里?

欢迎任何提示它是如何工作的。

1个回答

我已经实现了以下简单代码:

import cv2
import numpy as np

nr_im = 9876
font = cv2.FONT_HERSHEY_SIMPLEX 
fontScale = 1
colorText = (0, 0, 255)
thickness = 2

img = cv2.imread('testing/' + str(nr_im) + '.jpg')
original = img.copy()
blured_img = cv2.GaussianBlur(img,(17,17),5)

image = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lower = np.array([0, 0, 140], dtype="uint8")
upper = np.array([0, 0, 255], dtype="uint8")
mask = cv2.inRange(image, lower, upper)

# Morphological Closing: Get rid of the noise inside the object
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (25, 25)))

# Find contours
cnts, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

print(len(cnts))

cntsElps = []
for num_cnt, cnt in enumerate(cnts): 
    genElipse = cv2.fitEllipse(cnt)
    cntsElps.append(genElipse)
    cv2.ellipse(original,genElipse,(0,255,0),2) 
    cv2.putText(original, str(num_cnt+1), (int(genElipse[0][0]),int(genElipse[0][1])), font, fontScale, colorText, thickness, cv2.LINE_AA) 
    print("Ellipse nb: " + str(num_cnt+1) + " has angle: " + str(genElipse[2]) + "\n")
    

cv2.imwrite('testing/' + str(nr_im) + '_' + 'trash2' + '.png', original)

我以这张图片为例: 在此处输入图像描述

我得到了以下图像结果: 在此处输入图像描述

每个椭圆的旋转角度为:

  1. 椭圆 nb:1 有角度:55.63788986206055
  2. 椭圆 nb:2 有角度:108.58539581298828
  3. 椭圆 nb:3 有角度:170.23861694335938
  4. 椭圆 nb:4 有角度:73.59089660644531

所以,我的结论是,垂直轴和矩形长边之间的角度(=椭圆长轴)是 fitEllipse() 方法中的旋转角度。