代码语言:javascript复制
import cv2
import numpy as np
o=cv2.imread('C:/Users/xpp/Desktop/coins.png')#原始图像
cv2.imshow("original",o)
gray=cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)#将彩色图片转换为灰度图片
ret,binary=cv2.threshold(gray,127,255, cv2.THRESH_BINARY)#将灰度图片转换为二值图片
contours,hierarchy=cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)#计算图像轮廓
n=len(contours)
contoursImg=[]
for i in range(n):
temp=np.zeros(o.shape,np.uint8)
contoursImg.append(temp)
ellipse=cv2.fitEllipse(contours[i])
retval=cv2.fitEllipse(contours[i])
print("单个返回值形式:")
print("retval=n",retval)
(x,y),(MA,ma),angle=cv2.fitEllipse(contours[i])
print("三个返回值形式:")
print("(x,y)=(",x,y,")")
print("(MA, ma)=(",MA,ma,")")
print("angle=",angle)
cv2.ellipse(o,ellipse,(0,0,255),2)
cv2.imshow("result",o)
cv2.waitKey()
cv2.destroyAllWindows()
单个返回值形式: retval= ((226.83999633789062, 62.23775100708008), (103.79611206054688, 110.34321594238281), 80.08370208740234) 三个返回值形式: (x,y)=( 226.83999633789062 62.23775100708008 ) (MA, ma)=( 103.79611206054688 110.34321594238281 ) angle= 80.08370208740234
算法:旋转方向是通过构造最优拟合椭圆来获取旋转方向信息,还包括椭圆的中心的坐标、椭圆的长轴和短轴、旋转角度信息。
(x, y), (MA, ma), angle=cv2.fitEllipse(cnt)
- (x, y)表示圆心
- (MA, ma)表示轴的长度
- angle表示旋转的角度
注意:最优拟合椭圆框通过最小外接矩形得到椭圆,不是直接得到椭圆。矩形是最小外接矩形而不是矩形包围框和最小矩形包围框。通常情况下,椭圆的短轴是长轴的一半长。