无人机像素经纬度识别

🏆本文收录于《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,一经查实,立即删除!

相关文章

组件库 组件工程化管理探索

文章目录 组件库单组件版本控制打包组件在用户项目中注册组件项目可以直接在模版中使用引入的打包后的组件原因 每个组件独立的 package.json 文件的单组件包管理使用 lerna 或 yarn workspaces 进行统一管理添加组件文档、测试通过 CI/CD 流水线自动化这个流程 国际化换肤组件…

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

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

一体化政务大数据体系-数据目录系统

1、系统目标 实现数据目录一体化,按照应编尽编的原则,推动各地区各部门建立全量覆盖、互联互通的高质量一体化政务数据目录。建立数据目录系统与部门目录、地区目录实时同步更新机制,实现政务数据“一本账”管理。 2、需求描述 一是实现政…

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

💂 个人网站: 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…

Java8新特性(一) Lambda表达式与函数式接口

Java8新特性(一) Lambda表达式与函数式接口 一. 基本概念 Lambda表达式是Java 8中引入的一个重要的新特性,该表达式提出了一种新的语法规则,用于对某些(函数式接口)匿名内部类的书写方式进行简化。除此之外…

什么是等保测评?

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

智能写作分享

智能写作技术路线 ​ 在大模型的现有能力框架内,其对于处理长文档级别的智能写作任务存在一定的局限性。针对这一问题,本文深入探讨了长文档智能写作这一应用场景,并在此基础上,提出了一套切实可行的技术解决方案。该方案旨在弥补…

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

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

关于js函数参数是否会实时更新的问题

遇到一个小问题 export function test001(value, callback) {setTimeout(() > {if (value undefined) {test001(value, callback)} else {callback()}}, 100) }// 调用处 // 要测试的变量 param01 test001(param01, () > {console.log(值不为空啦) }) 这个变量param01…

指针的意义

/指针------------------------------------------------------------------------------------------ // 1,指针是---------- // 通过它能找到以它为地址的内存单元 //int main() //{ // int a 10;//开辟一块空间 // int* p &a;//将变量a的地址取出&…

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 中的内容&…

Java核心 - 内部类详解

作者:逍遥Sean 简介:一个主修Java的Web网站\游戏服务器后端开发者 主页:https://blog.csdn.net/Ureliable 觉得博主文章不错的话,可以三连支持一下~ 如有疑问和建议,请私信或评论留言! 前言 在Java编程中&a…

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

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

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

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

51单片机----开发工具介绍及软件安装

目录 一、硬件工具 二、软件工具 三、软件安装 四、总结 51单片机作为经典的入门级微控制器,因其易学易用、性价比高的特点,被广泛应用于各种电子产品中。想要玩转51单片机,首先需要了解其开发工具和软件安装方法。本文将从硬件和软件两方…

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

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