无人机影像配准并发布(共线方程)

这篇具有很好参考价值的文章主要介绍了无人机影像配准并发布(共线方程)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

无人机影像 + DEM 计算四个角点坐标(刚性变换)

  1. 像空间坐标(x,y,-f)

  2. 像空间坐标畸变纠正 deltax,deltay
    无人机影像配准并发布(共线方程),以前的自学垃圾,qt vs,无人机

  3. 已知(x,y),求解(X,Y, Z)或者(Lat,Lon)
    无人机影像配准并发布(共线方程),以前的自学垃圾,qt vs,无人机
    这里的Z是DEM上获取的坐标和Zs为相机坐标的高程,如果均为已知的情况下,则可以求解(X,Y),这里的(X,Y,Z)为地固地心坐标,单位为米。平地的情况只需要获取行高即可求解(X,Y),接着使用proj库将地固地心坐标转化为经纬度坐标即可。

  4. 地理配准
    这里直接采用**gdal_translategdal_wrap**,gdal_translate转换过程如下,大概就是将jpg进行地理配准。请注意,GDAL的影像起点是左上角,但是我们的相机模型是左下角,所以需要变换Y轴。转换之后的tif只有专业的QGIS之类的软件才能读取。
    无人机影像配准并发布(共线方程),以前的自学垃圾,qt vs,无人机

    下面是QGIS读取的效果。但是为了geoserver能够识别,还需要转换,这时候需要gdal_wrap,这个时候就很关键,我们需要设置其为透明。

    gdalwarp -r cubic -ovr AUTO -dstalpha D:\code\roadProj\public\demo\DSC00002\test.tif D:\code\roadProj\public\demo\DSC00002\test3_geotiff.tif
    

    无人机影像配准并发布(共线方程),以前的自学垃圾,qt vs,无人机

    gdal_translate.exe -of GTiff -gcp 0 5304 102.1265090139 29.6453703982 -gcp 7952 5304 102.1164515460 29.6474820822 -gcp 7952 0 102.1131839750 29.6445496193 -gcp 0 0 102.1233217949 29.6424804051 -ovr AUTO -co GCPs_Creation=YES D:\code\roadProj\public\demo\DSC00002\DSC00002.jpg D:\code\roadProj\public\demo\DSC00002\test.tif
    
    1. geoserver发布,具体操作比较简单

代码逻辑

  1. 下面是求解影像四个角点经纬度的简单思路,主要还是共线方程,代码中的1000还是得根据距离地面的高度,即需要DEM的高程值才能求解得到较为精确的精度。

  2. 具体实现分为相机模型(固定的参数不部分),大疆无人机是WGS84椭球,EPSG:4978是地心地固的转换参数。

struct CameraModel {
    double f = 7538.508;  // 像素为单位

    double u0 = 3982.417; // 像素为单位
    double v0 = 2671.637;

    double pixelSize = 4.5e-6; // 米为单位

    double k1 = 2.470920e-9;   // 径向畸变系数
    double k2 = -2.767172e-16;
    double k3 = 2.479935e-23;
    double k4 = -6.583598e-31;

    double p1 = 1.388595e-8; // 偏心畸变系数
    double p2 = 1.781812e-7;

    double alpha = -4.697031e-4; // CCD非正方形比例系数
    double beta = -1.300023e-4;

    double width = 7952; // 影像的高度和宽度
    double height = 5304;
};```

```cpp
///
/// \brief The ComputeBoundingBox class
/// 计算影像的包围盒的经纬度坐标 + 高程,然后贴地
///
class ComputeBoundingBox {
public:
    ComputeBoundingBox() {
        transTool.init("EPSG:4326",
                       "EPSG:4978"); // 椭球坐标->地心坐标 XYZ
    }

    ///
    /// \brief resetR
    /// \param phi 俯仰角
    /// \param omega 横滚角
    /// \param kappa 旋转角
    ///
    void resetR(double phi, double omega, double kappa) {
        this->phi = degreeToRadian(phi);
        this->omega = degreeToRadian(omega);
        this->kappa = degreeToRadian(kappa);
    }

    ///
    /// \brief resetCamera
    /// \param lat 维度
    /// \param lon 经度
    /// \param height 高程
    ///
    void resetCamera(const QString &imgNumber, double lat, double lon, double height) {
        this->imgNumber = imgNumber;
        this->cameraLat = lat;
        this->cameraLon = lon;
        this->height = height;
    }

    ///
    /// \brief compute 计算相机位置 + 旋转矩阵
    ///
    void compute();

private:
    ///
    /// \brief computeLatlon 根据像点坐标计算经纬度坐标(共线方程的逻辑)
    /// @param vector2d uv x轴,y轴坐标
    ///
    Eigen::Vector2d computeLatlon(Eigen::Vector2d &uv);

    ///
    /// \brief degreeToRadian 度转弧度
    /// \param degree
    /// \return
    ///
    double degreeToRadian(double degree) { return degree * M_PI / 180.0; }

    //    double computeDeltaX();

    //    double computeDeltaY();

    Eigen::Vector3d cameraGeo;

    Eigen::Matrix3d rMatrix;

    Transform transTool;

    CameraModel intrinsic; // 内参数矩阵

    QString imgNumber;     // 影像编号

    double cameraLat;      // 相机外参数矩阵
    double cameraLon;
    double height;

    double phi;
    double omega;
    double kappa;
};
Eigen::Vector2d ComputeBoundingBox::computeLatlon(Eigen::Vector2d &uv) {
    double u = uv.x();
    double v = uv.y();
    Eigen::Vector3d cameraSpace(u, v, -this->intrinsic.f); // 像空间坐标

    double r = qSqrt(pow(u - this->intrinsic.u0, 2) + pow(v - this->intrinsic.v0, 2));

    // (x-x0) * (k1*r^2 + k2*r^4 + k3*r^6 + k4*r8) + p1*(r^2 + 2*(x-x)^2) + 2p2*(x-x0)(y-y0) + alpha*(x-x0) +
    // beta*(y-y0)
    double deltaX = (u - this->intrinsic.u0) * (this->intrinsic.k1 * pow(r, 2) + this->intrinsic.k2 * pow(r, 4) +
                                                this->intrinsic.k3 * pow(r, 6) + this->intrinsic.k4 * pow(r, 8)) +
                    this->intrinsic.p1 * (pow(r, 2) + 2 * pow((u - this->intrinsic.u0), 2)) +
                    2 * this->intrinsic.p2 * (u - this->intrinsic.u0) * (v - this->intrinsic.v0) +
                    this->intrinsic.alpha * (u - this->intrinsic.u0) + this->intrinsic.beta * (v - this->intrinsic.v0);
    double deltaY = (v - this->intrinsic.v0) * (this->intrinsic.k1 * pow(r, 2) + this->intrinsic.k2 * pow(r, 4) +
                                                this->intrinsic.k3 * pow(r, 6) + this->intrinsic.k4 * pow(r, 8)) +
                    this->intrinsic.p2 * (pow(r, 2) + 2 * pow((v - this->intrinsic.v0), 2)) +
                    2 * this->intrinsic.p1 * (u - this->intrinsic.u0) * (v - this->intrinsic.v0);

    Eigen::Vector3d cameraOffset(deltaX - this->intrinsic.u0, deltaY - this->intrinsic.v0,
                                 0);                              // 像点坐标偏移
    Eigen::Vector3d cameraSpaceTrue = cameraSpace + cameraOffset; // 实际的像点坐标[最后一位该如何求解]

    Eigen::Vector3d worldCoordBa =
        this->rMatrix * cameraSpaceTrue * this->intrinsic.pixelSize; // (xBa, yBa, zBa) pixelSize这个参数多余

    worldCoordBa =
        Eigen::Vector3d(worldCoordBa.x() / worldCoordBa.z() * 1000, worldCoordBa.y() / worldCoordBa.z() * 1000, 0);

    //    qDebug() << worldCoordBa.x() << " " << worldCoordBa.y() << " " << worldCoordBa.z();

    Eigen::Vector3d worldCoord = worldCoordBa + this->cameraGeo; // 真正的坐标
    //    std::cout << worldCoord.x() << " " << worldCoord.y() << " " << worldCoord.z();

    //    PJ_COORD latlonh = proj_coord(cameraLon, cameraLat, height, 0);
    PJ_COORD geoxyz = proj_coord(worldCoord.x(), worldCoord.y(), worldCoord.z(), 0); // 地心坐标
    PJ_COORD latlon = this->transTool.backward(geoxyz);
    //    std::cout << "lat:" << latlon.lpz.lam << " ,lon:" << latlon.lpz.phi << ", " << latlon.lpz.z;
    return Eigen::Vector2d(latlon.lp.phi, latlon.lp.lam); // lat and lon
}
void ComputeBoundingBox::compute() {

    PJ_COORD latlonh = proj_coord(cameraLon, cameraLat, height, 0);
    PJ_COORD geoxyz = transTool.forward(latlonh);

    this->cameraGeo = Eigen::Vector3d(geoxyz.xyz.x, geoxyz.xyz.y, geoxyz.xyz.z); // 地心坐标

    // 计算绕X轴旋转的旋转矩阵 Rx(φ)
    Eigen::Matrix3d Rx;
    Rx << 1, 0, 0, 0, std::cos(phi), -std::sin(phi), 0, std::sin(phi), std::cos(phi);

    // 计算绕Y轴旋转的旋转矩阵 Ry(ω)
    Eigen::Matrix3d Ry;
    Ry << std::cos(omega), 0, std::sin(omega), 0, 1, 0, -std::sin(omega), 0, std::cos(omega);

    // 计算绕Z轴旋转的旋转矩阵 Rz(κ)
    Eigen::Matrix3d Rz;
    Rz << std::cos(kappa), -std::sin(kappa), 0, std::sin(kappa), std::cos(kappa), 0, 0, 0, 1;

    // 计算总的旋转矩阵 R_total = Rz(κ) * Ry(ω) * Rx(φ)
    this->rMatrix = Rz * Ry * Rx;

    // 像素点畸变纠正

    Eigen::Vector2d lb(0, 0);                                          // 左下角为起点
    Eigen::Vector2d rb(this->intrinsic.width, 0);                      // 右下角坐标
    Eigen::Vector2d rt(this->intrinsic.width, this->intrinsic.height); // 右上角坐标
    Eigen::Vector2d lt(0, this->intrinsic.height);                     // 左上角成果

    std::vector<Eigen::Vector2d> latlonVec = {lb, rb, rt, lt};
    qDebug() << "####################" << this->imgNumber << "########################";
    for (Eigen::Vector2d &pixelCoord : latlonVec) {
        pixelCoord = this->computeLatlon(pixelCoord);
        qDebug() << "lat: " << QString::number(pixelCoord.x(), 'f', 10)
                 << ",lon:" << QString::number(pixelCoord.y(), 'f', 10);
    }
}

效果图

无人机影像配准并发布(共线方程),以前的自学垃圾,qt vs,无人机文章来源地址https://www.toymoban.com/news/detail-610204.html

到了这里,关于无人机影像配准并发布(共线方程)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • photoscan(metashape)跑GPS辅助的无人机影像SfM(空三)教程

    photoscan(metashape)跑GPS辅助的无人机影像SfM(空三)教程

      刚打开的photoscan界面如下图所示:   然后,点击工作区左上角的添加堆块选项:   可以看到新增了一个名为“Chunk 1”的堆块,然后,右击“Chunk 1”,依次选择add、添加照片:   即可弹出照片选择窗口,到指定目录下全选图像,然后点击打开即可:   之后,在

    2024年02月13日
    浏览(9)
  • 基于Pix4Dmapper的大疆精灵4无人机影像处理

    基于Pix4Dmapper的大疆精灵4无人机影像处理

    软件下载地址: 链接:https://pan.baidu.com/s/1amqd6mYHtXVLf13442eEIQ 提取码:k5tr 安装完成后,启动软件。 1、新建项目,选择保存路径和工程文件名。 2、选择添加图像。 3、编辑参数,可默认。 4、选择输出参数,可默认。 5、生成正射影像和DSM。其中1为优化的结果,生成时间较慢

    2024年02月13日
    浏览(11)
  • 【Python&GIS】无人机影像的像素坐标计算图片某点的地理/投影坐标

            又是掉头发的一天,今天的任务是通过图片中心点的地理坐标以及图片中某点的像素坐标(即这个点位于图片中的x,y坐标)计算该点的地理/投影坐标。经过一整天的搜索,发现网上并没有这方面的教程。然后就是想啊想,头发一抓一大把,终于在网上零零散散的

    2024年02月16日
    浏览(10)
  • 卷积神经网络(CNN):基于PyTorch的遥感影像、无人机影像的地物分类、目标检测、语义分割和点云分类

    卷积神经网络(CNN):基于PyTorch的遥感影像、无人机影像的地物分类、目标检测、语义分割和点云分类

    我国高分辨率对地观测系统重大专项已全面启动,高空间、高光谱、高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成,将成为保障国家安全的基础性和战略性资源。随着小卫星星座的普及,对地观测已具备多次以上的全球覆盖能力,遥感影像也

    2024年02月04日
    浏览(15)
  • 从CNN到Transformer:基于PyTorch的遥感影像、无人机影像的地物分类、目标检测、语义分割和点云分类

    从CNN到Transformer:基于PyTorch的遥感影像、无人机影像的地物分类、目标检测、语义分割和点云分类

    我国高分辨率对地观测系统重大专项已全面启动,高空间、高光谱、高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成,将成为保障国家安全的基础性和战略性资源。随着小卫星星座的普及,对地观测已具备多次以上的全球覆盖能力,遥感影像也

    2024年01月22日
    浏览(10)
  • 无人机影像的空间三维建模:Pix4Dmapper运动结构恢复法

    无人机影像的空间三维建模:Pix4Dmapper运动结构恢复法

      本文介绍基于 Pix4Dmapper 软件,实现由 无人机影像 建立研究区域 空间三维模型 的方法。 目录 1 背景知识 1.1 运动结构恢复方法原理 1.2 运动结构恢复方法流程 2 软件与数据准备 2.1 软件准备 2.2 数据准备 3 研究区域模型建立 3.1 数据导入与配置 3.2 第一次模型建立 3.3 第二

    2024年02月05日
    浏览(14)
  • 基于Pix4D使用无人机光学影像制作正射影像(DOM)和数字表面模型(DSM) 操作步骤

    基于Pix4D使用无人机光学影像制作正射影像(DOM)和数字表面模型(DSM) 操作步骤

    此教程目的是让读者学会使用PIX4D拼接航片,教程较为通俗,面向初学者和专业人士。 使用大疆精灵4RTK无人机,通过规划航线、设置飞行高度和重叠率等参数,获取航片,然后导出至电脑。 右键图片,点击 属性 ,点击 详细信息 ,往下拉,可以看到GPS栏,里面有经纬度和高

    2024年02月05日
    浏览(11)
  • ORB_SLAM3配置及修改——将图像、点云用ROS消息发布(基于无人机仿真)

    ORB_SLAM3配置及修改——将图像、点云用ROS消息发布(基于无人机仿真)

            本文有点长,可以根据目录跳转到想看的部分。因为仿真和应用环境不同,可能例程的运行方式(输入话题等)有所不同,但第三部分有关ORB_SLAM3相机仿真标定、第四部分有关ORB_SLAM3源码修改的部分是通用的。 目录 一、仿真环境配置 1.双系统安装 ① 工具准备 ②

    2024年04月10日
    浏览(85)
  • 全国首台!浙江机器人产业集团发布垂起固定翼无人机-机器人自动换电机巢

    全国首台!浙江机器人产业集团发布垂起固定翼无人机-机器人自动换电机巢

    展示突破性创新技术,共话行业发展趋势。8月25日,全国首台垂起固定翼无人机-机器人自动换电机巢新品发布会暨“科创中国·宁波”无人机产业趋势分享会在余姚市机器人小镇成功举行。 本次活动在宁波市科学技术协会、余姚市科学技术协会指导下,由浙江机器人产业集团

    2024年02月11日
    浏览(9)
  • 快讯 | 大疆发布首款三摄航拍无人机DJI Mavic 3 Pro;文心一言推出内测专用独立App

    快讯 | 大疆发布首款三摄航拍无人机DJI Mavic 3 Pro;文心一言推出内测专用独立App

    地平线人事大调整:引入芯片研发负责人,联创将被派驻合资公司 文心一言推出内测专用独立App 空地机器人值守在雪域高原 大疆发布首款三摄航拍无人机DJI Mavic 3 Pro,航拍正式进入多焦段时代 OpenAI称将在未来几个月推出ChatGPT企业版订阅服务 米哈游和《星穹铁道》团队已开

    2024年02月15日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包