325 lines
10 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import numpy as np
import time
import math
import os
import pyproj
from middleware.entity.camera_para import Camera_Para
from touying.ImageReproject_python.img_types import Point, CamParas
from touying.ImageReproject_python.image_reproject import ir_target_positioning, ir_red_line_reproject, \
ir_img_reproject, ir_target_positioning_new_list
os.environ['GDAL_DISABLE_EXCEPTIONS'] = 'NO' # 显式启用异常处理
# 定义常量
pi = math.pi
def target_positioning(u_pixel, v_pixel, gimbal_yawm, gimbal_pitch, gimbal_roll, height):
"""测试目标定位功能"""
# 输入参数
u = 1520 # 示例图像u坐标
v = 2512 # 示例图像v坐标
interval = 0.05 # 高程迭代间隔
gimbal_yaw = 66.40 * pi / 180 # 示例云台偏航角
gimbal_pitch = -90 * pi / 180 # 示例云台俯仰角
gimbal_roll = 0 * pi / 180 # 示例云台横滚角
h = 590.834 # 示例相机高度
l = (103 + 59 / 60.0 + 26.07 / 3600.0) * pi / 180 # 示例相机经度
b = (30 + 45 / 60.0 + 46.48 / 3600.0) * pi / 180 # 示例相机纬度
img_width = 4032 # 示例图像宽度
img_height = 3024 # 示例图像高度
# 相机参数
cam_paras = CamParas(
fx=2795.68899,
fy=2795.68899
)
# DEM文件路径
# dem_file = "/home/GW/ImageReproject_python/dem.tif" # 确保此文件存在
dem_file = r"D:\project\test-touying\ImageReproject_python\dem.tif" # 确保此文件存在
# 测量执行时间
start_time = time.time()
# 执行目标定位
x, y, z = ir_target_positioning(
u, v, interval, gimbal_pitch, gimbal_yaw, gimbal_roll,
h, l, b, cam_paras, img_width, img_height, dem_file
)
# 计算执行时间
elapsed_time = (time.time() - start_time) * 1000 # 转换为毫秒
# 输出结果
print(f"目标定位耗时: {elapsed_time:.2f} ms")
print(f"目标位置: 经度={x}°, 纬度={y}°, 高度={z:.2f}m")
def read_txt(filename):
"""从文本文件读取点坐标"""
points = []
try:
with open(filename, 'r') as f:
for line in f:
parts = line.strip().split()
if len(parts) >= 4: # 标签 x y z
label = parts[0]
x = float(parts[1])
y = float(parts[2])
z = float(parts[3])
point = Point(x, y, z)
points.append(point)
except Exception as e:
print(f"读取文件失败: {filename}, 错误: {e}")
return points
def red_line_reproject(gimbal_yaw, gimbal_pitch, gimbal_roll, height, cam_longtitude, cam_altitude, img_width,
img_height, points,camera_para:Camera_Para):
"""测试红线重投影功能"""
# 输入参数
# print(f"gimbal_yaw {gimbal_yaw}")
gimbal_yaw = gimbal_yaw * pi / 180 # 示例云台偏航角
# print(f"gimbal_pitch {gimbal_pitch}")
gimbal_pitch = gimbal_pitch * pi / 180 # 示例云台俯仰角
# print(f"gimbal_roll {gimbal_roll}")
gimbal_roll = gimbal_roll * pi / 180 # 示例云台横滚角
# print(f"height {height}")
h = height # 示例相机高度
l = cam_longtitude * pi / 180
b = cam_altitude * pi / 180
# img_width = 4032 # 示例图像宽度
# img_height = 3024 # 示例图像高度
# # # 相机参数;校友之家 4D
# cam_paras = CamParas(
# fx=3659.69045,
# fy=3659.69045,
# cx=5280/2-40,
# cy=3956/2-20,
# )
# # # 相机参数哈密4TD
# cam_paras = CamParas(
# fx=2795.68899,
# fy=2795.68899,
# cx=4032/2,
# cy=3024/2,
# )
cam_paras = CamParas(
fx=camera_para.fx,
fy=camera_para.fy,
cx=camera_para.cx/2,
cy=camera_para.cy/2,
)
# 直接使用摄像头拍照的宽度
camera_img_width=camera_para.cx
# 直接使用摄像头拍照的高度
camera_img_height=camera_para.cy
# 图像文件路径
# img_file = r"D:\project\test-touying\ImageReproject_python\test_image.jpeg" # 确保此文件存在
# img_save_file = r"D:\project\test-touying\ImageReproject_python\test_image_reprojected.jpg"
# # 读取点坐标
# points = [] # 如果有点坐标文件可以使用read_txt函数读取
# points = read_txt(r"D:\project\test-touying\ImageReproject_python\points.txt")
# 测量执行时间
start_time = time.time()
# # 输入参数
# # gimbal_yaw = 66.40 * pi / 180 # 示例云台偏航角
# gimbal_pitch = -90 * pi / 180 # 示例云台俯仰角
# gimbal_roll = 0 * pi / 180 # 示例云台横滚角
# h = 590.834 # 示例相机高度
# l = (103 + 59 / 60.0 + 26.07 / 3600.0) * pi / 180 # 示例相机经度
# b = (30 + 45 / 60.0 + 46.48 / 3600.0) * pi / 180 # 示例相机纬度
# img_width = 4032 # 示例图像宽度
# img_height = 3024 # 示例图像高度
# 执行红线重投影
# print(f"gimbal_pitch {gimbal_pitch}")
# print(f"gimbal_yaw {gimbal_yaw}")
# print(f"gimbal_roll {gimbal_roll}")
# print(f"h {h}")
# print(f"l {l}")
# print(f"b {b}")
# print(f"cam_paras {cam_paras}")
# print(f"img_width {img_width}")
# print(f"img_height {img_height}")
# print(f"points {points}")
# utm_points = []
utm_points=convert_points_to_utm(points)
pixel_list = ir_red_line_reproject(
gimbal_pitch, gimbal_yaw, gimbal_roll, h, l, b,
cam_paras, img_width, img_height,camera_img_width,camera_img_height, utm_points
)
# 计算执行时间
elapsed_time = (time.time() - start_time) * 1000 # 转换为毫秒
# 输出结果
# print(f"红线重投影耗时: {elapsed_time:.2f} ms")
return pixel_list
#
# def convert_points_to_utm(points, utm_points):
# # 创建UTM投影
# wgs84 = pyproj.CRS('EPSG:4326')
#
# # 计算所有点的中心点
# sum_lat = 0.0
# sum_lon = 0.0
# count = len(points)
#
# for point in points:
# sum_lat += point.X # 纬度
# sum_lon += point.Y # 经度
#
# if count > 0:
# center_lat = sum_lat / count
# center_lon = sum_lon / count
#
# # 计算中心点对应的UTM带号
# utm_zone = int(center_lon / 6) + 31
#
# # 使用计算出的带号创建UTM投影
# utm_proj = pyproj.CRS(f'EPSG:{32600 + utm_zone}')
# else:
# # 如果没有点,使用默认带号
# utm_proj = pyproj.CRS(f'EPSG:{32600 + 48}')
#
# transformer = pyproj.Transformer.from_crs(wgs84, utm_proj, always_xy=True)
# # 将点坐标转换为UTM坐标
# for point in points:
# # 将经纬度转换为UTM坐标
# x, y = transformer.transform(point.Y, point.X)
# utm_point = Point(x, y, point.Z,point.id)
# utm_points.append(utm_point)
def convert_points_to_utm(points):
# 创建UTM投影
wgs84 = pyproj.CRS('EPSG:4326')
# 计算所有点的中心点
sum_lat = 0.0
sum_lon = 0.0
count = len(points)
for point in points:
sum_lat += point.X # 纬度
sum_lon += point.Y # 经度
if count > 0:
center_lat = sum_lat / count
center_lon = sum_lon / count
# 计算中心点对应的UTM带号
utm_zone = int(center_lon / 6) + 31
# 使用计算出的带号创建UTM投影
utm_proj = pyproj.CRS(f'EPSG:{32600 + utm_zone}')
else:
# 如果没有点,使用默认带号
utm_proj = pyproj.CRS(f'EPSG:{32600 + 48}')
transformer = pyproj.Transformer.from_crs(wgs84, utm_proj, always_xy=True)
utm_points = []
# 将点坐标转换为UTM坐标
for point in points:
# 将经纬度转换为UTM坐标
x, y = transformer.transform(point.Y, point.X)
utm_point = Point(x, y, point.Z,point.id) ############
utm_points.append(utm_point)
return utm_points
def img_reproject():
"""测试图像重投影功能"""
# 输入参数
obj_longitude = 103.990109 # 目标点经度(度)
obj_latitude = 30.762915 # 目标点纬度(度)
obj_height = 481.64 # 目标点高度
gimbal_yaw = 66.40 * pi / 180 # 示例云台偏航角
gimbal_pitch = -90 * pi / 180 # 示例云台俯仰角
gimbal_roll = 0 * pi / 180 # 示例云台横滚角
h = 590.834 # 示例相机高度
l = (103 + 59 / 60.0 + 26.07 / 3600.0) * pi / 180 # 示例相机经度
b = (30 + 45 / 60.0 + 46.48 / 3600.0) * pi / 180 # 示例相机纬度
img_width = 4032 # 示例图像宽度
img_height = 3024 # 示例图像高度
# 相机参数
cam_paras = CamParas(
fx=2795.68899,
fy=2795.68899
)
# 测量执行时间
start_time = time.time()
# 执行图像重投影
pixel_x, pixel_y = ir_img_reproject(
gimbal_pitch, gimbal_yaw, gimbal_roll, h, l, b,
cam_paras, img_width, img_height, obj_longitude, obj_latitude, obj_height
)
# 计算执行时间
elapsed_time = (time.time() - start_time) * 1000 # 转换为毫秒
# 输出结果
print(f"图像重投影耗时: {elapsed_time:.2f} ms")
print(f"目标点在图像上的坐标: x={pixel_x:.2f}, y={pixel_y:.2f}")
# 通过相机姿态、经纬度、相机目标中心点高程、图片目标坐标数组,计算目标经纬度
def cal_canv_location_by_osd( us, vs, gimbal_pitch, gimbal_yaw, gimbal_roll,
height,l, b, img_width, img_height, heights):
"""测试目标定位功能"""
# 输入参数
# u = 1520 # 示例图像u坐标
# v = 2512 # 示例图像v坐标
# interval = 0.05 # 高程迭代间隔
gimbal_yaw = gimbal_yaw * pi / 180 # 示例云台偏航角
gimbal_pitch = gimbal_pitch * pi / 180 # 示例云台俯仰角
gimbal_roll = gimbal_roll * pi / 180 # 示例云台横滚角
l = l * pi / 180 # 示例相机经度
b = b * pi / 180 # 示例相机纬度
img_width = img_width # 示例图像宽度
img_height = img_height # 示例图像高度
# 相机参数哈密4TD
cam_paras = CamParas(
fx=2795.68899,
fy=2795.68899,
cx=4032/2-40,
cy=3024/2-20,
)
# 测量执行时间
start_time = time.time()
# 执行目标定位
results = ir_target_positioning_new_list(
us, vs, gimbal_pitch, gimbal_yaw, gimbal_roll,
height,l, b, cam_paras, img_width, img_height, heights
)
# 计算执行时间
elapsed_time = (time.time() - start_time) * 1000 # 转换为毫秒
# 输出结果
print(f"像素坐标反算经纬度耗时: {elapsed_time:.2f} ms")
return results #坐标集合,应该是二维数组