Where is the rotated angle actually located in fitEllipse method?
I've implemented the following simple code:
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=&quot;uint8&quot;)
upper = np.array([0, 0, 255], dtype=&quot;uint8&quot;)
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(&quot;Ellipse nb: &quot; + str(num_cnt+1) + &quot; has angle: &quot; + str(genElipse[2]) + &quot;\n&quot;)
    

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

And I used this image as example:

I've got the following image result:

And the rotation angle for each ellipse was:

Ellipse nb: 1 has angle: 55.63788986206055
Ellipse nb: 2 has angle: 108.58539581298828
Ellipse nb: 3 has angle: 170.23861694335938
Ellipse nb: 4 has angle: 73.59089660644531

So, my conclusion is that an angle between horizontal axis and major side of rectangle(=major ellipse axis) is the rotation angle in fitEllipse() method.