无人机像素经纬度识别

news2025/1/16 3:01:47

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

问题描述

  无人机像素经纬度识别。根据代码,我的需求就是鼠标点击照片中某一点的坐标,能迅速识别出这一点的经纬度信息,但是两张照片,拍摄的同一位置显示的结果并不相同,我的无人机是垂直于地面飞行,不考虑地球曲率、图像畸变,我的思路是先提取出图像的经纬度信息,这个经纬度信息是飞行器拍摄位置也是图像中心点的经纬度坐标,知道了图像的GSD,调用鼠标,计算鼠标点击区域的经纬度信息。

代码如下:

import exifread
import cv2
import numpy as np
import math
 
# 从图像文件中提取GPS信息
def extract_gps_info(file_path):
    with open(file_path, 'rb') as f:
        tags = exifread.process_file(f)
        if 'GPS GPSLatitude' in tags and 'GPS GPSLongitude' in tags:
            latitude = tags['GPS GPSLatitude'].values
            longitude = tags['GPS GPSLongitude'].values
            latitude_ref = tags['GPS GPSLatitudeRef'].values
            longitude_ref = tags['GPS GPSLongitudeRef'].values
 
            lat_degrees = float(latitude[0].num) / float(latitude[0].den)
            lat_minutes = float(latitude[1].num) / float(latitude[1].den)
            lat_seconds = float(latitude[2].num) / float(latitude[2].den)
 
            lon_degrees = float(longitude[0].num) / float(longitude[0].den)
            lon_minutes = float(longitude[1].num) / float(longitude[1].den)
            lon_seconds = float(longitude[2].num) / float(longitude[2].den)
 
            if latitude_ref == 'S':
                lat_degrees = -lat_degrees
            if longitude_ref == 'W':
                lon_degrees = -lon_degrees
 
            latitude_decimal = lat_degrees + lat_minutes/60 + lat_seconds/3600
            longitude_decimal = lon_degrees + lon_minutes/60 + lon_seconds/3600
 
            return latitude_decimal, longitude_decimal
        else:
            return None
 
# 主函数
if __name__ == '__main__':
    # 图像文件路径
    file_path = 'DJI_20231225165215_0426_T.JPG'
 
    # 提取GPS信息
    gps_info = extract_gps_info(file_path)
    if gps_info is not None:
        latitude_decimal, longitude_decimal = gps_info
        print(f"Latitude: {latitude_decimal:.6f}")
        print(f"Longitude: {longitude_decimal:.6f}")
    else:
        print("No GPS information found in the image.")
 
    # 加载热红外图像
    infrared_image = cv2.imread(file_path, cv2.IMREAD_UNCHANGED)
 
    # 无人机位置和姿态数据
    uav_latitude = latitude_decimal  # 无人机纬度
    uav_longitude = longitude_decimal  # 无人机经度
    uav_altitude = 20  # 无人机高度(米)
    uav_roll_angle = 0  # 无人机横滚角(度)
    uav_pitch_angle = -90  # 无人机俯仰角(度)
    uav_yaw_angle = 64.60
        #74.40  # 无人机偏航角(度)
 
    # 相机内参数
    focal_length = 758.33# 焦距(像素)
    sensor_size_width = 7.68  # 传感器宽度(毫米)
    sensor_size_height = 6.144  # 传感器高度(毫米)
    image_width = 640  # 图像宽度(像素)
    image_height = 512  # 图像高度(像素)
    gsd = 0.05275  # 单位:米 (meters),地面采样距离
 
    # 计算相机的内外参数矩阵
    camera_matrix = np.array([[focal_length, 0, image_width / 2],
                              [0, focal_length, image_height / 2],
                              [0, 0, 1]], dtype=np.float32)
 
    dist_coefs = np.zeros((4, 1), dtype=np.float32)  # 假设无畸变
 
 
    # 鼠标单击事件回调函数
    def get_pixel_coord(event, x, y, flags, param):
        if event == cv2.EVENT_LBUTTONDOWN:
            # 计算点击位置在图像中的坐标
            pixel_x = x
            pixel_y = y
 
            # 计算点击点相对于中心的偏移量
            cx = image_width / 2 # 单位:像素 (pixels)
            cy = image_height / 2  # 单位:像素 (pixels)
            delta_x = pixel_x - cx  # 单位:像素 (pixels)
            delta_y = pixel_y - cy  # 单位:像素 (pixels)
 
            # 考虑偏航角
            theta = math.radians(uav_yaw_angle)  # 单位:弧度 (radians)
 
            # 旋转偏移量以考虑偏航角
 
            delta_x_prime = delta_x * math.cos(theta) - delta_y * math.sin(theta)  # 单位:像素 (pixels)
            delta_y_prime = delta_x * math.sin(theta) + delta_y * math.cos(theta)  # 单位:像素 (pixels)
 
            # 根据GSD计算实际距离
            delta_x_meters = delta_x_prime * gsd  # 单位:米 (meters)
            delta_y_meters = delta_y_prime * gsd  # 单位:米 (meters)
 
            # 计算点击点的经纬度
            click_lat = uav_latitude + delta_y_meters / (111000)  # 111000米大约是1度纬度的距离,单位:度 (degrees)
            click_lon = uav_longitude + delta_x_meters / (111000 * math.cos(math.radians(uav_latitude)))  # 单位:度 (degrees)
 
 
            print(f"Pixel coordinates: ({x}, {y})")
            print(f"Latitude: {click_lat:.8f}")
            print(f"Longitude: { click_lon:.8f}")
 
    cv2.imshow('Infrared Image', infrared_image)
    cv2.setMouseCallback('Infrared Image', get_pixel_coord)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

友情提示:
  如上问题有的来自我自身项目开发,有的收集网站,有的来自读者…如有侵权,立马删除。再者,针对此专栏中部分问题及其问题的解答思路或步骤等,存在少部分搜集于全网社区及人工智能问答等渠道,若最后实在是没能帮助到你,还望见谅!并非所有的解答都能解决每个人的问题,在此希望屏幕前的你能够给予宝贵的理解,而不是立刻指责或者抱怨!如果你有更优解,那建议你出教程写方案,一同学习!共同进步。

解决方案

  如下是上述问题的解决方案,仅供参考:

  您的代码目的是通过鼠标点击图像来获取该点的经纬度信息。您已经实现了从图像中提取GPS信息,以及通过鼠标点击事件计算点击点的经纬度。但是,您提到两张照片拍摄同一位置时显示的结果不同,这可能是由几个因素造成的:

  1. GPS信息的准确性:确保提取的GPS信息是准确的。有时,GPS信息可能因为多种原因(如遮挡、干扰等)而不准确。

  2. 图像缩放或旋转:如果图像在拍摄或处理过程中被缩放或旋转,可能会影响到计算结果。

  3. GSD(地面采样距离)的一致性:确保两张照片的GSD是一致的,如果GSD不同,即使同一位置,点击相同像素点也会得到不同的经纬度。

  4. 相机参数的一致性:包括焦距、传感器大小等,这些参数的不同可能导致计算结果的差异。

  5. 地球曲率和图像畸变:虽然您提到不考虑地球曲率和图像畸变,但在实际应用中,这些因素可能对精确计算有影响。

  6. 鼠标点击的精度:用户点击的精度也会影响最终结果。

为了解决这个问题,您可以尝试以下步骤:

  • 验证提取的GPS信息是否准确无误。
  • 确保两张照片的相机参数和GSD是一致的。
  • 如果可能,检查图像是否在拍摄或处理过程中被修改过。
  • 考虑实现一个更精确的地理坐标转换算法,如使用地理坐标系转换库。

此外,您的代码中有几个潜在的问题需要修正:

  • 在计算点击点的经纬度时,您使用了111000作为每度纬度的平均米数,但这个值在不同纬度下会有所变化。更准确的计算应该考虑当前纬度的地球半径。
  • 您的代码中uav_yaw_angle有两个赋值,应该只保留一个。

修正后的代码段如下:

# 计算点击点的经纬度
# 使用WGS-84模型下的地球半径
earth_radius = 6378137  # 单位:米
click_lat = uav_latitude + (delta_y_meters / earth_radius) * (math.pi / 180)
click_lon = uav_longitude + (delta_x_meters * math.cos(math.radians(click_lat)) / earth_radius) * (math.pi / 180)

请注意,这些修正只是基于您提供的代码和描述。实际问题可能需要更详细的分析和调整。如果问题依然存在,建议检查所有可能影响计算的因素,并考虑使用更专业的地理信息系统(GIS)工具或库来处理经纬度转换。

  希望如上措施及解决方案能够帮到有需要的你。

  PS:如若遇到采纳如下方案还是未解决的同学,希望不要抱怨&&急躁,毕竟影响因素众多,我写出来也是希望能够尽最大努力帮助到同类似问题的小伙伴,即把你未解决或者产生新Bug黏贴在评论区,我们大家一起来努力,一起帮你看看,可以不咯。

  若有对当前Bug有与如下提供的方法不一致,有个不情之请,希望你能把你的新思路或新方法分享到评论区,一起学习,目的就是帮助更多所需要的同学,正所谓「赠人玫瑰,手留余香」。

☀️写在最后

  ok,以上就是我这期的Bug修复内容啦,如果还想查找更多解决方案,你可以看看我专门收集Bug及提供解决方案的专栏《CSDN问答解惑-专业版》,都是实战中碰到的Bug,希望对你有所帮助。到此,咱们下期拜拜。

码字不易,如果这篇文章对你有所帮助,帮忙给 bug菌 来个一键三连(关注、点赞、收藏) ,您的支持就是我坚持写作分享知识点传播技术的最大动力。

同时也推荐大家关注我的硬核公众号:「猿圈奇妙屋」 ;以第一手学习bug菌的首发干货,不仅能学习更多技术硬货,还可白嫖最新BAT大厂面试真题、4000G Pdf技术书籍、万份简历/PPT模板、技术文章Markdown文档等海量资料,你想要的我都有!

📣关于我

我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云2023年度十佳博主,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿哇。


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

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

相关文章

代码随想录——组合总和 Ⅳ(Leetcode377)

题目链接 动态规划 class Solution {public int combinationSum4(int[] nums, int target) {int[] dp new int[target 1];dp[0] 1;for(int i 0; i < target; i){for(int j 0; j < nums.length; j){if(i > nums[j]){dp[i] dp[i - nums[j]];} }}return dp[targ…

【原创】java+ssm+mysql医生信息管理系统设计与实现

个人主页&#xff1a;程序员杨工 个人简介&#xff1a;从事软件开发多年&#xff0c;前后端均有涉猎&#xff0c;具有丰富的开发经验 博客内容&#xff1a;全栈开发&#xff0c;分享Java、Python、Php、小程序、前后端、数据库经验和实战 开发背景&#xff1a; 随着信息技术的…

【Golang 面试 - 基础题】每日 5 题(七)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…

ajax请求成功但不执行success-function回调函数

目录 一、问题分析 二、处理问题 一、问题分析 在测试员工管理系统的登录和注册代码时&#xff0c;登录一切正常&#xff0c;就是注册成功后没有跳转页面&#xff0c;后面发现是success-function回调函数没有正常执行。原因主要是前端和后端交流的数据格式不一致&#xff0c;…

GNSS位移监测站:毫米级位移监测

推荐型号&#xff1a;TH-WY1】GNSS位移监测站是一种利用全球导航卫星系统&#xff08;GNSS&#xff09;进行高精度位移监测的设备。这些系统能够实现毫米级甚至亚毫米级的位移监测&#xff0c;广泛应用于大坝安全监测、桥梁健康检测、滑坡预警等领域。以下是GNSS位移监测站的主…

电力红外热成像手持终端是什么?有什么作用?

电力红外热成像手持终端&#xff0c;即手持红外热成像仪&#xff0c;在电力行业中扮演着重要角色。这种设备利用红外辐射技术实时捕捉物体&#xff08;特别是电力设备&#xff09;表面的热能分布&#xff0c;并将其转化为可视化的热像图&#xff0c;从而帮助用户进行非接触式的…

Llama3代码库一夜成名,Kapathy一键点赞,GitHub星标突破2千

让大神 Andrej Karpathy 一键三连❤️&#xff08;点赞 转发 评论&#xff09;&#xff0c;一个教你从头开始实现 Llama3 的代码库爆火。 X 上转赞收藏量超 6.8k&#xff0c;GitHub 揽星 2k。 火就火在&#xff0c;它教你从头用 Meta 开源的权重进行推理&#xff0c;详细解释…

InternLM-L0 Python作业

任务类型 任务内容 闯关任务 Python实现wordcount 闯关任务 Vscode连接InternStudio debug笔记 1. Python实现wordcount 基于作业 InternLM-L0 linux作业 &#xff0c;创建Python文件输入如下代码&#xff0c;并用Python 脚本运行&#xff1a; text """ Go…

新手vue学习问题汇总(自用)(长期更新)

1.export default export default 是 ES6 模块语法&#xff0c;用于导出模块的默认成员。在 Vue.js 中&#xff0c;通常用来导出一个组件对象&#xff0c;使其可以在其他文件中被导入并使用。 2.props props 是组件接收外部数据的方式。父组件可以通过向子组件传递 props 来…

电阻上的数字意义及电阻值辨别方法

电阻是电子电路中的基本元件&#xff0c;其阻值的大小直接影响电路的工作状态。电阻上的数字信息对于电路设计和维修至关重要。本文将详细解读电阻上数字的意义&#xff0c;并介绍如何通过数字辨别电阻值。 一、电阻上数字的意义 电阻上的数字通常表示电阻的阻值、功率、误差等…

C++STL详解(五)——list类的接口详解

一.list的介绍 list容器的底层是双向循环带头链表&#xff0c;在CPP中&#xff0c;我们对双向循环带头链表进行了一定程度的封装。 如果你不了解双向链表&#xff0c;那么可以浏览此片博文&#xff1a;双向链表 二.list的定义方式以及赋值 2.1list的构造方式 在这里我们要…

Redis:事务

1. 简介 可以一次性执行多个命令&#xff0c;本质是一组命令的集合。一个事务中的所有命令都会序列化&#xff0c;按顺序的串化执行&#xff0c;不允许被其他其他命令插入&#xff0c;不许加塞 即将要执行的命令放入队列中&#xff0c;此时该队列的所有命令就是一个事务&#x…

接口自动化中对于文件上传的处理方法

正常的接口自动化基本都是json的格式&#xff0c;对于文件上传是一种特殊的格式是表单格式针对这种表单格式在接口自动化中怎么处理&#xff0c;主要通过工作中使用的一个实际的例子进行分享 举例&#xff1a;web上需要导入一个文件实现相关的功能&#xff0c;主要通过两个接口…

vue实现滚动条下滑时隐藏导航栏,上滑时显示导航栏

效果展示 思路 监听滚动事件&#xff0c;记录上次的滚动距离&#xff0c;与最新滚动距离做对比&#xff0c;如果为正&#xff0c;说明滚动距离距顶值scrollTop变大&#xff0c;用户正在向下滚动页面&#xff0c;此时隐藏&#xff0c;反之则反&#xff0c;隐藏就是top值给他负导…

Linux网络-netstat命令

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注我&#xff0c;我尽量把自己会的都分享给大家&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 Linux服务器作为一个常用的网络服务器&#xff0c;主要的作用就是向客户端提供网络…

地球磁场的形成、变迁、特点

还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#xff0c;webgl&#xff0c;ech…

Python如何统治AI世界?一文读懂它的优势与挑战

一、Python语言介绍 1.1 Python语言概述 Python是一种由Guido van Rossum于1991年首次发布的高级编程语言。其设计理念强调代码的可读性和简洁性&#xff0c;使其成为了许多开发者的首选语言。Python的语法简洁直观&#xff0c;采用了缩进来定义代码块&#xff0c;这与其他使…

应力对薄膜有什么影响?

知识星球里的学员问&#xff1a;在薄膜沉积中&#xff0c;应力是一个经常要监控的参数&#xff0c;它有什么作用&#xff1f;应力过大对薄膜有哪些影响&#xff1f; 应力是什么&#xff1f; 薄膜的应力是指在薄膜沉积过程中&#xff0c;薄膜内部或薄膜与基材之间产生的作用力。…

3Dtiles文件是否可以直接合并?

答&#xff1a;无法直接合并。网格大师有3dtiles转osgb的功能&#xff0c;先转osgb&#xff0c;然后把osgb放在一起之后再转3dtiles。 网格大师是一款能够解决实景三维模型空间参考、原点、瓦块大小不统一&#xff0c;重叠区域处理问题的工具“百宝箱”&#xff0c;集格式转换…

大数据:数据标准化及质量管控方案

本方案是一套全面的解决方案&#xff0c;旨在为企业构建科学、规范的数据管理体系&#xff0c;确保数据的准确性、一致性、完整性、合理性、及时性和有效性&#xff0c;从而支撑业务数据的高效应用与正确决策。以下是对该方案的详细介绍&#xff1a; 一、方案概述 本数据标准…