0

我正在尝试使用 opencv python 找出对象的旋转角度。为此,我已经检测到目标,然后我能够找出旋转向量,并将其转换为旋转矩阵,并从该矩阵计算欧拉角。但是当我在视频中旋转对象时,所有三个角度(x、y、z)都会发生变化,当我在平面上移动目标时也会发生变化,即使它显示出角度的变化。请建议我一些方法来获得准确的结果。

这是目标的图像: 这是目标的图像。

  while True:
    ret, img = cap.read()

    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    ret, corners=cv2.findCirclesGrid(gray,(5,5),None)

    if ret== True:

        corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)

        # Find the rotation and translation vectors.
        _,_, rvecs, tvecs= cv2.solvePnPRansac(objp, corners2, mtx, dist)


        dst,_ = cv2.Rodrigues(rvecs)
        r = dst


        x = math.atan2(r[2][1],r[2][2])
        y = math.atan2(-r[2][0],math.sqrt((r[0][0])*r[0][0])+(r[1][0]*r[1][0]))
        z=  math.atan2(r[1][0],r[0][0])




        print("x = ",math.degrees(x))
        print("y = "math.degrees(y))
        print("z = "math.degrees(z))

所需输出:x = 5,y = 0,z = 0
电流输出:x = 6.1,y = 4.7,z = -2.0

4

1 回答 1

0

我不确定这是否是您想要的,但如果您想根据对象的旋转角度旋转图像,那么:

image = cv2.imread('image.jpg',cv2.IMREAD_UNCHANGED)

gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)

ret, corners=cv2.findCirclesGrid(gray,(5,5),None)

criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 100, 0.001)
corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)

((x,y),(w,h),angle) = cv2.minAreaRect(corners2)
rows,cols = image.shape[:2]
angle += 90

M = cv2.getRotationMatrix2D((int(cols/2),int(rows/2)), angle, 1.0)
nimg = cv2.warpAffine(image,M,(cols,rows))

结果

于 2018-07-08T19:18:39.530 回答