无人机像素经纬度识别

🏆本文收录于《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'].valueslongitude = tags['GPS GPSLongitude'].valueslatitude_ref = tags['GPS GPSLatitudeRef'].valueslongitude_ref = tags['GPS GPSLongitudeRef'].valueslat_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_degreesif longitude_ref == 'W':lon_degrees = -lon_degreeslatitude_decimal = lat_degrees + lat_minutes/60 + lat_seconds/3600longitude_decimal = lon_degrees + lon_minutes/60 + lon_seconds/3600return latitude_decimal, longitude_decimalelse: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_infoprint(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 = xpixel_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.mzph.cn/diannao/51469.shtml

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

相关文章

旅美钢琴学者何超东北巡演启幕,精湛演绎肖邦全套作品

7月26日、28日,旅美钢琴学者何超在长春和哈尔滨两地成功开启了他的暑期钢琴独奏音乐会东北巡演。在这两场演出中,何超为观众带来了全套肖邦的「谐谑曲」与「叙事曲」,以娴熟的技巧、惊人的记忆力和体力,将八首曲目一气呵成&#x…

这可能是开源界最好用的能源管理系统

💂 个人网站: IT知识小屋🤟 版权: 本文由【IT学习日记】原创、在CSDN首发、需要转载请联系博主💬 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 文章目录 写在前面项目简介项目特点项目架构模块展示项目获取 写在前面 大…

buu做题(9)

[MRCTF2020]PYWebsite 有个二维码 扫了一下啊二维码 function enc(code){hash hex_md5(code);return hash;}function validate(){var code document.getElementById("vcode").value;if (code ! ""){if(hex_md5(code) "0cd4da0223c0b280829dc3ea4…

Java之归并排序

归并排序 归并排序(Merge Sort)算法,使用的是分治思想。分治,顾名思义,就是分而治之,将一个大问题分解成小的子问题来解决。小的子问题解决了,大问题也就解决了。 核心源码: mergeSort(m->n) merge(mergeSort(m-&g…

什么是等保测评?

信息安全等级保护测评,简称等保测评,是根据我国《信息安全等级保护管理办法》的规定,对国家重要信息系统进行的安全评估制度。等保测评的频率、必要性以及在实际操作中的常见误区,是企业和机构在进行等保测评时需要了解的重要内容…

ts踩坑!使用可选链 ?.处理可能遇到的 undefined 或 null 值的情况,但是仍然收到一个关于可能为 undefined 的警告!

在 TypeScript 中,当你使用可选链(Optional Chaining)?. 时,你其实已经处理了可能遇到的 undefined 或 null 值的情况。但是,如果你仍然收到一个关于可能为 undefined 的警告,这可能是因为 TypeScript 的类…

web自动化6-pytest③实践测试用例-回归用例web自动化

# -*- coding: utf-8 -*- """ lemut_select - 业务受理 Author: duxiaowei Date: 2024/7/17 """ import timeimport allure import pytest from selenium.webdriver.common.by import By# 业务受理 allure.feature("业务受理") class …

Unity Apple Vision Pro 开发:如何把 PolySpatial 和 Play To Device 的版本从 1.2.3 升级为 1.3.1

XR 开发社区: SpatialXR社区:完整课程、项目下载、项目孵化宣发、答疑、投融资、专属圈子 📕教程说明 本教程将介绍如何把 Unity 的 PolySpatial 和 Play To Device 版本从 1.2.3 升级为 1.3.1。 📕Play To Device 软件升级 ht…

使用 Visual Studio 2022 自带的 cl.exe 编译 tensorRT自带测试样例 sampleOnnxMNIST

1. 新建任意文件夹,将 D:\install\tensorRT\TensorRT-8.6.1.6\samples\sampleOnnxMNIST 下面的 sampleOnnxMNIST.cpp 文件复制进来,同时 D:\install\tensorRT\TensorRT-8.6.1.6\samples\sampleOnnxMNIST 下面的 sample_onnx_mnist.vcxproj 中的内容&…

vite5-macos仿macOS网页osx管理系统|vue3+arcoDesign桌面os

基于vite5.xvue3arco-design原创自研网页版os管理框架ViteWebOS。 使用最新前端技术vite5vue3pinia2arcoDesignsortablejsecharts搭建网页pc版桌面os式后台管理系统解决方案。支持自定义桌面栅格布局引擎、可拖拽桌面图标、多屏分页管理、自定义桌面壁纸主题、毛玻璃虚化背景等…

学Java一篇文章就够了(手把手教你入门)

第11章 枚举&注解&内部类 一、枚举 概念 枚举类型是Java 5中新增特性的⼀部分,它是⼀种特殊的数据类型,之所以特殊是因为它既是⼀种类 (class)类型却⼜⽐类类型多了些特殊的约束,但是这些约束的存在也造就了枚举类型的简洁性、安…

JCR一区级 | Matlab实现TTAO-Transformer-LSTM多变量回归预测

JCR一区级 | Matlab实现TTAO-Transformer-LSTM多变量回归预测 目录 JCR一区级 | Matlab实现TTAO-Transformer-LSTM多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.【JCR一区级】Matlab实现TTAO-Transformer-LSTM多变量回归预测,三角拓扑聚合…

C语言 #具有展开功能的排雷游戏

文章目录 前言 一、整个排雷游戏的思维梳理 二、整体代码分布布局 三、游戏主体逻辑实现--test.c 四、整个游戏头文件的引用以及函数的声明-- game.h 五、游戏功能的具体实现 -- game.c 六、老六版本 总结 前言 路漫漫其修远兮,吾将上下而求索。 一、整个排…

【OSCP系列】OSCP靶机-BTRsys-2.1(原创)

OSCP系列靶机—BTRsys-2.1 原文转载已经过授权 原文链接:Lusen的小窝 - 学无止尽,不进则退 (lusensec.github.io) 一、主机发现 二、端口扫描 1、快速扫描 2、全端口扫描 3、服务系统探测 4、漏洞探测 80端口扫到了一些目录,有wordpress框…

Paimon数据湖详解(第49天)

系列文章目录 一. Paimon数据湖增删改查 二. 查询优化 三. 系统表 四. Lookup Joins 文章目录 系列文章目录前言Paimon数据湖的使用1、创建Table1.1 创建catalog管理的表1.2 分区表1.3 Create Table As(了解)1.4 Create Table Like1.5 表属性1.6 创建外…

无心剑中译莎士比亚《爱如星辰引迷舟》

莎士比亚十四行诗第116首 Sonnet 116 爱如星辰引迷舟 Let me not to the marriage of true minds Admit impediments. Love is not love Which alters when it alteration finds, Or bends with the remover to remove: O, no! it is an ever-fixed mark That looks on tempe…

C++(week14): C++提高:(一)面向对象设计:设计原则、设计模式

文章目录 一、面向对象设计的概念4.统一建模语言:UML语言StartUML 二、类与类之间的关系0.总结(1)类与类的五种关系(2)区别(3)面向对象 vs 基于对象 1.继承 (泛化耦合)2.组合 (Composition)3.聚合 (Aggregation)4.关联(1)双向关联(2)单向关联 5.依赖 (Dependency) 三…

简单几步,把浏览器书签转换成导航网页

废话不多说直奔主题上干货 Step 1 下载浏览器书签 1,电脑浏览器点击下载Pintree Pintree 是一个开源项目,旨在将浏览器书签导出成导航网站。通过简单的几步操作,就可以将你的书签转换成一个美观且易用的导航页面。 2. 安装 Pintree B…

【保姆级讲解下QT6.3】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

【人工智能 | 机器学习 | 理论篇】线性模型

文章目录 1. 基本形式2. 线性回归3. 对数几率回归4. 线性判别分析5. 多分类学习6. 类别不平衡问题 1. 基本形式 设有 d 个属性描述的示例 x ( x 1 , x 2 , x 3 , . . . , x d ) x ({x_1, x_2, x_3, ..., x_d}) x(x1​,x2​,x3​,...,xd​) 线性模型(linear mode…