大疆无人机世界坐标系转像素坐标系

我想把实地的地物点标注到大疆无人机拍摄的照片上,用的是cgcs2000坐标系,我将坐标输入,返回的像素坐标和实际的地物点不能匹配上
import numpy as np
import math
from pyexiv2 import Image
import cv2
#获取了像片拍摄时云台的姿态角
def readJpgXmp(path):
 
    file_name = path
    test = Image(file_name)
    f = test.read_xmp()
    lat = f["Xmp.drone-dji.GpsLatitude"] #纬度
    lon = f["Xmp.drone-dji.GpsLongitude"] # 经度
    height = f["Xmp.drone-dji.AbsoluteAltitude"] #
    roll = f["Xmp.drone-dji.GimbalRollDegree"] #roll
    yaw = f["Xmp.drone-dji.GimbalYawDegree"] # yaw
    pitch = f["Xmp.drone-dji.GimbalPitchDegree"] # pitch
    return float(roll),float(yaw),float(pitch)
#姿态角导入到下面的函数中创建旋转矩阵
def eulerAnglesToRotationMatrix(theta):
    # 分别构建三个轴对应的旋转矩阵
    R_x = np.array([[1, 0, 0],
                    [0, math.cos(theta[0]), -math.sin(theta[0])],
                    [0, math.sin(theta[0]), math.cos(theta[0])]
                    ])

    R_y = np.array([[math.cos(theta[1]), 0, math.sin(theta[1])],
                    [0, 1, 0],
                    [-math.sin(theta[1]), 0, math.cos(theta[1])]
                    ])

    R_z = np.array([[math.cos(theta[2]), -math.sin(theta[2]), 0],
                    [math.sin(theta[2]), math.cos(theta[2]), 0],
                    [0, 0, 1]
                    ])
    # 将三个矩阵相乘,得到最终的旋转矩阵
    R = np.dot(R_z, R_y, R_x)
    return R
#计算相机的内参
def neican(pix,size,f):
    #8194*5460 #像片的尺寸(像素)
    #35.9*24 # cmos的尺寸(毫米)
    #35 #焦距(毫米)
    u0 = pix[0]/2
    v0 = pix[1]/2
    dx = size[0]/pix[0]
    dy = size[1]/pix[1]
    fx = f/dx
    fy = f/dy
    return np.array([[fx, 0, u0], [0, fy, v0], [0, 0, 1]])
#读取像片的姿态角 roll,yaw,pitch
xmpInfo = readJpgXmp(r'C:\Users\Administrator\Desktop\DJI_20210521160101_0211.JPG')
roll,yaw,pitch = xmpInfo
#旋转矩阵
r = eulerAnglesToRotationMatrix([math.radians(roll),math.radians(pitch),math.radians(yaw)]) #旋转矩阵
print(r)
#平移矩阵
t = np.array([[511914.760791,3372600.750728,231]]).T
#内参矩阵
ins = neican([8194,5460],[35.9,24],35)#内参
#世界坐标系中的地物点
list1 = np.float32([[511914.760791,3372600.750728,0]]) #3d点
#将地物点,旋转矩阵,平移矩阵,内参,传入 cv2.projectPoints()函数里
result2, _ = cv2.projectPoints(list1,r,t,ins,0)

print(result2)

返回的像素坐标不是我想要对应的地物点,请问是什么原因呢?

链接:https://pan.baidu.com/s/1W7naTFQNIkyH1R8RZCd00A
提取码:f3dx
这是无人机拍摄的像片

numpy.dot()的第三个参数是输出结果。矩阵相乘那行应改为R = np.dot(np.dot(R_z, R_y), R_x)
https://numpy.org/doc/stable/reference/generated/numpy.dot.html

可能有两个问题,
1、平移矩阵,t = np.array([[511914.760791,3372600.750728,231]]).T可能应该是t = np.array([[-511914.760791,-3372600.750728,231]]).T,因为无法验证我只是建议试一下;
2、旋转矩阵,3个旋转矩阵不能直接相乘,还是要先两个相乘再乘第三个, R = np.dot(R_z, R_y, R_x)修改为 R = np.dot(np.dot(R_z, R_y), R_x)
因为没有环境没有做验证,你自己验证一下啊!有帮助请采纳谢谢!

改成R = np.dot(np.dot(R_z, R_y), R_x)就行

https://blog.csdn.net/wanqiu1112/article/details/108798040?spm=1005.2026.3001.5635&utm_medium=distribute.pc_relevant_ask_down.none-task-blog-2~default~OPENSEARCH~Rate-20.pc_feed_download_top3ask&depth_1-utm_source=distribute.pc_relevant_ask_down.none-task-blog-2~default~OPENSEARCH~Rate-20.pc_feed_download_top3ask

要自动结题了

可能有两个问题,
1、平移矩阵,t = np.array([[511914.760791,3372600.750728,231]]).T可能应该是t = np.array([[-511914.760791,-3372600.750728,231]]).T,因为无法验证我只是建议试一下;
2、旋转矩阵,3个旋转矩阵不能直接相乘,还是要先两个相乘再乘第三个, R = np.dot(R_z, R_y, R_x)修改为 R = np.dot(np.dot(R_z, R_y), R_x)

需要考虑经纬度和图形之间的比例映射,检查这两个步骤试试

无人机没玩过,返回的像素坐标不是我想要对应的地物点,请问是什么原因呢? 这两没对应,我想很大可能是算法的问题

你这个写的有问题

img