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

2024-06-11 15:44

本文主要是介绍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], "米)")

这篇关于python实现无人机航拍图片像素坐标转世界坐标的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1051598

相关文章

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.

Python中help()和dir()函数的使用

《Python中help()和dir()函数的使用》我们经常需要查看某个对象(如模块、类、函数等)的属性和方法,Python提供了两个内置函数help()和dir(),它们可以帮助我们快速了解代... 目录1. 引言2. help() 函数2.1 作用2.2 使用方法2.3 示例(1) 查看内置函数的帮助(

Python虚拟环境与Conda使用指南分享

《Python虚拟环境与Conda使用指南分享》:本文主要介绍Python虚拟环境与Conda使用指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、python 虚拟环境概述1.1 什么是虚拟环境1.2 为什么需要虚拟环境二、Python 内置的虚拟环境工具

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

Python pip下载包及所有依赖到指定文件夹的步骤说明

《Pythonpip下载包及所有依赖到指定文件夹的步骤说明》为了方便开发和部署,我们常常需要将Python项目所依赖的第三方包导出到本地文件夹中,:本文主要介绍Pythonpip下载包及所有依... 目录步骤说明命令格式示例参数说明离线安装方法注意事项总结要使用pip下载包及其所有依赖到指定文件夹,请按照以

Python实现精准提取 PDF中的文本,表格与图片

《Python实现精准提取PDF中的文本,表格与图片》在实际的系统开发中,处理PDF文件不仅限于读取整页文本,还有提取文档中的表格数据,图片或特定区域的内容,下面我们来看看如何使用Python实... 目录安装 python 库提取 PDF 文本内容:获取整页文本与指定区域内容获取页面上的所有文本内容获取

基于Python实现一个Windows Tree命令工具

《基于Python实现一个WindowsTree命令工具》今天想要在Windows平台的CMD命令终端窗口中使用像Linux下的tree命令,打印一下目录结构层级树,然而还真有tree命令,但是发现... 目录引言实现代码使用说明可用选项示例用法功能特点添加到环境变量方法一:创建批处理文件并添加到PATH1

Python包管理工具核心指令uvx举例详细解析

《Python包管理工具核心指令uvx举例详细解析》:本文主要介绍Python包管理工具核心指令uvx的相关资料,uvx是uv工具链中用于临时运行Python命令行工具的高效执行器,依托Rust实... 目录一、uvx 的定位与核心功能二、uvx 的典型应用场景三、uvx 与传统工具对比四、uvx 的技术实

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可