python实现无人机航拍图片像素坐标转世界坐标

背景

已知相机参数(传感器宽度和高度、图像宽度和高度、焦距、相对航高、像主点坐标 ),在给定像素坐标的前提下,求世界坐标,大部分通过AI来实现,不知道哪个步骤有问题,望大家指正

脚本

import numpy as np
import cv2# 畸变校正
def undistort_pixel(pixel_x, pixel_y, sym_dist, dec_dist):k0,k1,k2,k3=sym_dist# k1, k2, p1, p2, k3 = sym_distp1,p2,p3=dec_distfx = focal_length_mmfy = focal_length_mmcx = image_width_px / 2cy = image_height_px / 2distCoeffs = np.array([k1, k2, p1, p2,k3])cameraMatrix = np.array([[fx, 0, cx], [0, fy, cy], [0, 0, 1]])distorted_points = np.array([[pixel_x, pixel_y]], dtype=np.float32)undistorted_points = cv2.undistortPoints(distorted_points, cameraMatrix, distCoeffs)#################################################### 4\对图像去畸变img = cv2.imread('./images/100_0004_0001.JPG')img_undistored = cv2.undistort(img, cameraMatrix, distCoeffs)cv2.imwrite('./images/100_0004_00011.JPG', img_undistored)return undistorted_points[0][0][0], undistorted_points[0][0][1]# 相机坐标转世界坐标
def camera_to_world_coordinates(cam_coords, pos):# 获取相机到世界的转换参数pos_x, pos_y, pos_z, roll, pitch, yaw = pos# 将角度转换为弧度roll = np.radians(roll)pitch = np.radians(pitch)yaw = np.radians(yaw)# 计算旋转矩阵R_roll = np.array([[1, 0, 0],[0, np.cos(roll), -np.sin(roll)],[0, np.sin(roll), np.cos(roll)]])R_pitch = np.array([[np.cos(pitch), 0, np.sin(pitch)],[0, 1, 0],[-np.sin(pitch), 0, np.cos(pitch)]])R_yaw = np.array([[np.cos(yaw), -np.sin(yaw), 0],[np.sin(yaw), np.cos(yaw), 0],[0, 0, 1]])R = R_yaw @ R_pitch @ R_roll# 相机坐标转换到世界坐标cam_coords_homogeneous = np.array([cam_coords[0], cam_coords[1], -H, 1])world_coords = R @ cam_coords_homogeneous[:3] + np.array([pos_x, pos_y, pos_z])return world_coords
####################################################基本参数
# 传感器宽度和高度(毫米)
sensor_width_mm = 12.83331744000000007588
sensor_height_mm = 8.55554496000000064271# 图像宽度和高度(像素)
image_width_px = 5472
image_height_px = 3648# 焦距(毫米)
focal_length_mm = 8.69244671863242679422# 焦距(米)
focal_length_m = 8.69244671863242679422/1000# 相对航高
H=86.93#################################################### 1\计算空间分辨率
# 传感器尺寸转换为米
sensor_width_m = sensor_width_mm / 1000
sensor_height_m = sensor_height_mm / 1000# 计算水平和垂直的 GSD
GSD_x = sensor_width_m * H / (focal_length_m * image_width_px)
GSD_y = sensor_height_m * H / (focal_length_m * image_height_px)# 水平和垂直方向的 GSD
print("水平方向的 GSD:", GSD_x, "米/像素")
print("垂直方向的 GSD:", GSD_y, "米/像素")#################################################### 2\给定像素坐标,计算相机坐标
#像主点偏移 
xpoff_px=20.88973563438230485190
ypoff_px=50.51977022866981315019# 像素坐标
pixel_x = image_width_px
pixel_y = image_height_px
# pixel_x = image_width_px/2
# pixel_y = image_height_px/2
# pixel_x = 0
# pixel_y = 0pixel_x=pixel_x+xpoff_px
pixel_y=pixel_y+ypoff_px# 计算相机坐标(假设无畸变)
camera_x = pixel_x * GSD_x
camera_y = pixel_y * GSD_yprint("像素坐标 (", pixel_x, ",", pixel_y, ") 对应的相机坐标 (x, y): (", camera_x, "米, ", camera_y, "米)")#################################################### 3\计算畸变后坐标
# 对称畸变系数
sym_dist = [0, -0.00043396118129128110, 0.00000262222711982075, -0.00000001047488706013]
# 径向畸变
dec_dist = [0.00000205885592671873, -0.00000321714140091248, 0]# 进行畸变校正
undistorted_camera_x, undistorted_camera_y = undistort_pixel(pixel_x, pixel_y, sym_dist, dec_dist)print("畸变校正后像素坐标 (", pixel_x, ",", pixel_y, ") 对应的相机坐标 (x, y): (", undistorted_camera_x, "米, ", undistorted_camera_y, "米)")#################################################### 4\计算世界坐标
# POS数据
pos = [433452.054688, 2881728.519704, 183.789696, 0.648220, -0.226028, 14.490357]# 计算世界坐标
world_coords = camera_to_world_coordinates((undistorted_camera_x, undistorted_camera_y), pos)print("旋转平移变换后像素坐标 (", pixel_x, ",", pixel_y, ") 对应的世界坐标 (x, y): (", world_coords[0], "米, ", world_coords[1], "米)")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/851632.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

日志通关4:logback

插: AI时代,程序员或多或少要了解些人工智能,前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家(前言 – 人工智能教程 ) 坚持不懈,越努力越幸运,大家…

Nginx学习笔记(十)如何配置HTTPS协议?(公网)

目录 一、简介二、SSL 证书类型介绍三、公网 SSL 证书3.1 证书管理工具3.2 下载安装 acme.sh3.3 申请并下载证书报错1:没有指定账号报错2:DNS无法解析的域名报错3:无效的响应 404 3.4 配置 Nginx3.5 证书过期刷新 四、补充4.1 同一域名的不同…

硬盘危机:磁盘损坏无法打开的应对策略

在数字化时代,磁盘作为数据存储和传输的核心设备,其稳定性和安全性至关重要。然而,在日常使用过程中,我们时常会面临磁盘损坏无法打开的困境。这不仅会影响我们的工作效率,还可能造成重要数据的丢失。本文将深入探讨磁…

2024年,计算机相关专业还值得选择吗?

问:随着2024年高考落幕,数百万高三学生又将面临人生中的重要抉择:选择大学专业。在这个关键节点,计算机相关专业是否仍是“万金油”的选择?在过去很长一段时间里,计算机科学与技术、人工智能、网络安全、软…

抖音 根据sec uid获取个人详细信息(性别、年龄、属地、关注数、粉丝数、简介等)

本文带来用户的secuid获取用户信息以及其他基本信息: 话不多说看效果: 第一步输入用户sec_uid 根据secuid获取到用户基本信息: 可以支持接口批量转换,欢迎咨询

从信息泄露到登录后台

信息收集 上谷歌用谷歌语法,经过漫长的翻找发现一处PDF: 是某大学的某系统帮助文档,其中泄露了人员的工号和sfz 尝试登陆 此时,虽然获取了工号和sfz,众所周知,现在很多统一身份认证都是学号/工号sfz后六位…

玩转ChatGPT:最全学术论文提示词分享【下】

学境思源,一键生成论文初稿: AcademicIdeas - 学境思源AI论文写作 本篇文章,是系列文章「最全学术论文提示词」的完结篇。前两篇的内容请到文末链接处跳转👇🏻 11.提交和发布 prompt 1:根据[期刊/会议]指…

深入探讨Java压缩利器:net.lingala.zip4j.ZipFile的应用与实践

在现代软件开发中,数据压缩是一个常见且重要的任务。无论是减小文件大小以节省存储空间,还是将多个文件打包在一起以便于传输和分发,压缩技术都是不可或缺的。在Java世界中,net.lingala.zip4j.ZipFile库因其强大的功能和易用性&am…

如何系统学习vue框架

前言 在软件开发的浩渺星海中,编程规范如同航海的罗盘,为我们指引方向,确保我们的代码之旅能够顺利、高效地到达目的地。无论是个人开发者还是大型团队,编程规范都是提升代码质量、保障项目成功不可或缺的一环。 因此&#xff0c…

人工智能模型对有争议的话题持相反的观点

人工智能模型对有争议的话题持相反的观点 并非所有生成式人工智能模型都是平等的,特别是当涉及到它们如何处理两极分化的主题时。 在2024年ACM公平、问责和透明度(FAccT)会议上发表的一项最新研究中,卡内基梅隆大学、阿姆斯特丹大学和人工智能初创公司h…

【设计模式】结构型-代理模式

在静谧的林间舞台上,代理轻舞着对象的梦想,掌控访问,引领旋律,真实与虚幻间,交织出灵动的诗篇。 文章目录 一、数据库操作的问题二、代理模式三、代理模式的核心组成四、运用代理模式五、代理模式的应用场景六、小结推…

nginx脚本原理(复杂变量)详解

本文将结合实际的源码来探讨nginx的脚本实现原理,并会在最后对此进行总结。本次只展示复杂变量,对于其if等指令后续文章再来探讨。 nginx的脚本支持使其具备了强大的灵活性,我们可以使用简单的脚本指令配置,进行灵活的功能定制。欲了解此功能,必先了解其变量的实现原理.(…

Web前端可以开发哪些:探索无尽的可能性

Web前端可以开发哪些:探索无尽的可能性 在数字化时代的浪潮中,Web前端技术以其独特的魅力和广泛的应用领域,吸引了越来越多的开发者投入其中。那么,Web前端究竟可以开发哪些内容呢?本文将从四个方面、五个方面、六个方…

网工请自查,这十个技术问题还不会就out了

号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部 下午好,我的网工朋友。 今天我想和大家聊聊几个与我们日常工作紧密相关的技术问题,它们都多多少少地影响了咱们的工作效率…

服务器如何有效解决源IP暴露问题

在现代互联网环境中,服务器的安全性至关重要。源IP暴露不仅增加了服务器遭受DDoS攻击、恶意扫描和数据泄露的风险,还可能影响业务的正常运行。本文将探讨如何利用技术手段,尤其是CDN和防火墙策略,来有效地解决服务器源IP暴露的问题…

C#面:Server.UrlEncode、HttpUtility.UrlDecode的区别

C#中的Server.UrlEncode和HttpUtility.UrlDecode都是用于处理URL编码和解码的方法,它们的区别如下: Server.UrlEncode: Server.UrlEncode是一个静态方法,属于System.Web命名空间。它用于将字符串进行URL编码,将特殊字…

JS常用HOOK脚本

Hook定义 Hook 技术又叫做钩子函数,在系统没有调用该函数之前,钩子程序就先捕获该消息,钩子函数先得到控制权 这时钩子函数既可以加工处理(改变)该函数的执行行为,还可以强制结束消息的传递 简单来说&am…

数字人贴牌哪家好?需要关注的核心优势有哪些?

随着人工智能时代的发展,数字人蕴含着的广泛的应用场景和庞大的市场需求也逐渐展现在了人们的眼前。在此背景下,数字人成为了一众创业赛道中的大热门,数字人贴牌模式也因此走红。 所谓的数字人贴牌,又称为数字人源码部署和数字人O…

04. fastLED像素参考(颜色设置详解)

fastLED像素参考 原文 Overview 概述 There’s two main pixel types in the library - the CRGB class and the CHSV class. CHSV objects have to be converted to CRGB objects before they can be written out. You can also write CHSV objects into the CRGB array an…

我们离成功有多远呢?只要能完成自己阶段性的目标就算是一次成功

做起一个账号,带好一个团队,经营好一家公司,似乎这些都能叫成功,成功的定义可大可小,而我认为只要能完成自己阶段性的目标就算是一次成功,毕竟每个人学历、背景、阅历、资源、认知都不同,很难同…