# ImageReproject Python版本 这是原C++项目`ImageReproject_linux`的Python实现版本,提供图像重投影、目标定位和红线重投影功能。 ## 项目结构 - `img_types.py`: 定义了各种数据结构,如点坐标、相机参数、外方位元素等 - `dpal.py`: 数字摄影测量算法库,实现坐标转换和旋转矩阵计算等功能 - `image_reproject.py`: 主要功能实现,包括目标定位、红线重投影和图像重投影 - `test_image_reproject.py`: 测试脚本,用于测试各项功能 ## 功能说明 ### 1. 目标定位 (Target Positioning) 根据图像上的点坐标,结合相机参数、云台角度、位置信息和DEM数据,计算该点在地面上的经纬度和高度。 ### 2. 红线重投影 (Red Line Reproject) 将地面上的点坐标投影到图像上,并在图像上绘制这些点。 ### 3. 图像重投影 (Image Reproject) 将地面上的点坐标投影到图像上,计算其在图像上的像素坐标。 ## 依赖库 - NumPy: 用于数值计算 - OpenCV (cv2): 用于图像处理 - PyProj: 用于坐标转换 - GDAL: 用于读取DEM数据 ## 安装依赖 ```bash pip install numpy opencv-python pyproj gdal ``` ## 使用示例 ### 目标定位 ```python from img_types import CamParas from image_reproject import ir_target_positioning # 设置参数 u = 1520 # 图像x坐标 v = 2512 # 图像y坐标 interval = 0.05 # 高程迭代间隔 gimbal_yaw = 66.40 * math.pi / 180 # 云台偏航角(弧度) gimbal_pitch = -90 * math.pi / 180 # 云台俯仰角(弧度) gimbal_roll = 0 # 云台横滚角(弧度) h = 590.834 # 高度 l = (103 + 59 / 60.0 + 26.07 / 3600.0) * math.pi / 180 # 经度(弧度) b = (30 + 45 / 60.0 + 46.48 / 3600.0) * math.pi / 180 # 纬度(弧度) img_width = 4032 # 图像宽度 img_height = 3024 # 图像高度 # 相机参数 cam_paras = CamParas( fx=2795.68899, fy=2795.68899, cx=4.63568, cy=198.7387, k1=0.0199131, k2=-0.068595, k3=0.0568642, p1=-0.00119, p2=0.00124049 ) # DEM文件路径 dem_file = "dem.tif" # 执行目标定位 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 ) # 输出结果 print(f"目标位置: 经度={x * 180 / math.pi:.6f}°, 纬度={y * 180 / math.pi:.6f}°, 高度={z:.2f}m") ``` ### 红线重投影 ```python from img_types import CamParas, Point from image_reproject import ir_red_line_reproject # 设置参数 gimbal_yaw = 66.40 * math.pi / 180 # 云台偏航角(弧度) gimbal_pitch = -90 * math.pi / 180 # 云台俯仰角(弧度) gimbal_roll = 0 # 云台横滚角(弧度) h = 590.834 # 高度 l = (103 + 59 / 60.0 + 26.07 / 3600.0) * math.pi / 180 # 经度(弧度) b = (30 + 45 / 60.0 + 46.48 / 3600.0) * math.pi / 180 # 纬度(弧度) img_width = 4032 # 图像宽度 img_height = 3024 # 图像高度 # 相机参数 cam_paras = CamParas( fx=2795.68899, fy=2795.68899, cx=4.63568, cy=198.7387, k1=0.0199131, k2=-0.068595, k3=0.0568642, p1=-0.00119, p2=0.00124049 ) # 图像文件路径 img_file = "test_image.jpg" img_save_file = "test_image_reprojected.jpg" # 点坐标列表 points = [ Point(103.990109 * math.pi / 180, 30.762915 * math.pi / 180, 481.64), # 添加更多点... ] # 执行红线重投影 ir_red_line_reproject( gimbal_pitch, gimbal_yaw, gimbal_roll, h, l, b, cam_paras, img_width, img_height, points, img_file, img_save_file ) ``` ### 图像重投影 ```python from img_types import CamParas from image_reproject import ir_img_reproject # 设置参数 obj_longitude = 103.990109 # 目标点经度(度) obj_latitude = 30.762915 # 目标点纬度(度) obj_height = 481.64 # 目标点高度 gimbal_yaw = 66.40 * math.pi / 180 # 云台偏航角(弧度) gimbal_pitch = -90 * math.pi / 180 # 云台俯仰角(弧度) gimbal_roll = 0 # 云台横滚角(弧度) h = 590.834 # 高度 l = (103 + 59 / 60.0 + 26.07 / 3600.0) * math.pi / 180 # 经度(弧度) b = (30 + 45 / 60.0 + 46.48 / 3600.0) * math.pi / 180 # 纬度(弧度) img_width = 4032 # 图像宽度 img_height = 3024 # 图像高度 # 相机参数 cam_paras = CamParas( fx=2795.68899, fy=2795.68899, cx=4.63568, cy=198.7387, k1=0.0199131, k2=-0.068595, k3=0.0568642, p1=-0.00119, p2=0.00124049 ) # 执行图像重投影 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 ) # 输出结果 print(f"目标点在图像上的坐标: x={pixel_x:.2f}, y={pixel_y:.2f}") ``` ## 打包为动态库 本项目支持通过 setuptools 打包为 Python 动态库(.so/.pyd)。 ### 打包命令 ```bash python setup.py bdist_wheel ``` 或直接安装到本地环境: ```bash pip install . ``` ### 导入与调用 安装后可直接在 Python 中导入: ```python from imagereproject import ir_target_positioning, ir_red_line_reproject, ir_img_reproject, Point, CamParas ``` ## 注意事项 1. 使用前请确保已安装所有依赖库 2. DEM文件和图像文件路径需要根据实际情况修改 3. 相机参数和位置信息需要根据实际情况设置