关于tif和笛卡儿的坐标互换

2023-11-01

今天出了一个问题,隐藏了好几天,那就是在点云和tif文件读写时,坐标系出现了换算错误,是我代码的问题。



在笛卡儿坐标系中,X向右为正,y向上为正,而在tif文件中,用的图像坐标系,x向右为正,y向下为正,分辨率为负数,比如:


 //设置X,Y方向的像素分辨率
 double xResolution = 1.0;
 double yResolution = -1.0;


 //根据点云集求点云的细节
 _theDetail = this->getPCLDetailFromDataSet();
 //求X,Y方向的像素个数,
 double xSizef = abs( _theDetail.xDistance / xResolution );
 double ySizef = abs( _theDetail.yDistance / yResolution );
 //取整
 _xSize = (int)xSizef;
 _ySize = (int)ySizef;


根据点云集,求点云的细节内容
PCLDetail PCLTif::getPCLDetailFromDataSet()
{
 //判断输入集合的范围
 //首先给定输入集合的X,Y坐标
 pt3Set::iterator
  iterInputExtentCur = _pointCloudDataSet.begin(),
  iterInputExtentEnd = _pointCloudDataSet.end();

 //判断XY的最小最大值,以此判定范围
 iterInputExtentCur = _pointCloudDataSet.begin();
 double minX = iterInputExtentCur->second.x();
 double minY = iterInputExtentCur->second.y();
 double maxX = iterInputExtentCur->second.x();
 double maxY = iterInputExtentCur->second.y();

 for (; iterInputExtentCur != iterInputExtentEnd; iterInputExtentCur++)
 {
  double x = iterInputExtentCur->second.x();
  double y = iterInputExtentCur->second.y();

  if (x < minX)
  {
   minX = x;
  }
  if (x > maxX)
  {
   maxX = x;
  }
  if (y < minY)
  {
   minY = y;
  }
  if (y > maxY)
  {
   maxY = y;
  }
 }

 std::cout << "X的范围:(" << minX << "," << maxX << ")" << std::endl;
 std::cout << "Y的范围:(" << minY << "," << maxY << ")" << std::endl;

 //判断数据集的大小,
 double distanceX = maxX - minX;
 double distanceY = maxY - minY;

 PCLDetail theDetail;
 theDetail.leftTopX = minX;
 theDetail.leftTopY = maxY;     //注意,这里Y值,是左上角为最大值
 theDetail.xDistance = distanceX;
 theDetail.yDistance = distanceY;
 return theDetail;

}

//根据输入集合求等分插值XYZ坐标
void PCLTif::getEqualXYZVectorFromDataSet()
{
 _rasterVecVec.resize(_ySize);

 //进行输入点云坐标三维坐标的输出
 for (int i = 0; i < _ySize; i++)
 {
  std::vector<Pt3> imagePointVector3;
  imagePointVector3.clear();
  for (int j = 0; j < _xSize; j++)
  {
   double x = _theDetail.leftTopX + _xResolution * j;
   double y = _theDetail.leftTopY + _yResolution * i;    //注意这里是从上往下,y值逐渐减小
   double z = -9999;   //灰度值初值均为0
   //double z = 0;   //灰度值初值均为0
   Pt3 thisPoint = Pt3(x, y, z);
   imagePointVector3.push_back(thisPoint);
  }
  
  _rasterVecVec[i] = imagePointVector3;
  
 }

}

//根据各个三角形计算出在该三角形外接矩形的栅格集合,插值
void PCLTif::getRasterVec3SetFromTriangle(std::vector<Pt3> theTrianglePt3)
{
 //1,求该三角形的外接矩形
 std::vector<Pt2> rectVec2 = this->_getRectanglePt2VectorFromTriangle(theTrianglePt3);
 double minX = rectVec2[0].x();
 double minY = rectVec2[0].y();
 double maxX = rectVec2[3].x();
 double maxY = rectVec2[3].y();
 myRect theRect;
 theRect.minX = minX;
 theRect.minY = minY;
 theRect.maxX = maxX;
 theRect.maxY = maxY;

 Vector3 vecA(theTrianglePt3[0].x(), theTrianglePt3[0].y(), 0);
 Vector3 vecB(theTrianglePt3[1].x(), theTrianglePt3[1].y(), 0);
 Vector3 vecC(theTrianglePt3[2].x(), theTrianglePt3[2].y(), 0);

 //判断点在哪个三角形上

 //2,遍历栅格集合,如果栅格里的点在此外接矩形范围内,则判断是否在三角形里,确定是否插值

 //将行缩小范围

 int minRow =  (maxY - _theDetail.leftTopY) / _yResolution;                 //这里也曾经出错了,因为数组沿着Y轴是从上往下的,实际上maxY比minY离左上角更近,因此y方向的ID要注意大小和距离
 int maxRow = (minY - _theDetail.leftTopY) / _yResolution;
 int minCol = (minX - _theDetail.leftTopX) / _xResolution;
 int maxCol = (maxX - _theDetail.leftTopX) / _xResolution;
 if (maxRow >= _ySize)
 {
  maxRow = _ySize - 1;
 }
 if (maxCol >= _xSize)
 {
  maxCol = _xSize - 1;
 }
 if (minRow >= _ySize)
 {
  minRow = _ySize - 1;
 }
 if (minCol >= _xSize)
 {
  minCol = _xSize - 1;
 }

 for (int j = minRow; j <= maxRow; j++)
 {
  for (int i = minCol; i <= maxCol; i++)
  {
   Pt3 thePt3 = _rasterVecVec[j][i];

   double x = thePt3.x();
   double y = thePt3.y();
   Pt2 thePt2 = Pt2(x, y);
   //判断是否在三角形内
   Vector3 vecPt(x, y, 0);
   bool bTestInOrNot = this-> testPointInTriangle(vecA, vecB, vecC, vecPt);
   if (bTestInOrNot)
   {
    //在三角形内则插值
    double pointZ = -1;
    bool bInterSect = getPointZfromTriangleVector(theTrianglePt3, thePt2, pointZ);
    if (bInterSect)
    {
     //printf("插值后坐标为(%0.6f,%0.6f,%0.6f)\n", thePoint.x(), thePoint.y(), pointZ);
     thePt3 = Pt3(x, y, pointZ);

    }

   }
   _rasterVecVec[j][i] = thePt3;

  }
 }

}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于tif和笛卡儿的坐标互换 的相关文章

  • CGAL---点云处理

    CGAL是一款几何处理库 但是介绍其在点云中处理的资料比较少 现介绍一个专门介绍CGAL在点云数据中处理的网站 比包括常见的点云数据处理 功能包括 1 聚类 欧式聚类 2 配准 ICP 3 简化 格网 4 平滑 5 法向量估算 6 特征估算
  • 基于CGAL、Qt5两层嵌套动态链接库的Cmake实现

    1 问题由来 因需要开发了一款基于CGAL的处理三维几何的子程序 简称子程序B 该子程序B被主程序A调用 我们知道CGAL还可以调用Qt5库用于图形显示 因此为了实现这一目标 设想利用Cmake制作一个可供主程序A调用的dll 此dll可调
  • 关于tif和笛卡儿的坐标互换

    今天出了一个问题 隐藏了好几天 那就是在点云和tif文件读写时 坐标系出现了换算错误 是我代码的问题 在笛卡儿坐标系中 X向右为正 y向上为正 而在tif文件中 用的图像坐标系 x向右为正 y向下为正 分辨率为负数 比如 设置X Y方向的像
  • 在vs2008上面编译CGAL代码,error LNK2019: 无法解析的外部符号 _GetProcessMemoryInfo@12

    在vs2008上面编译CGAL代码 出现error LNK2019 无法解析的外部符号 GetProcessMemoryInfo 12这样的错误 在项目 配置属性 链接器 输入 附加依赖项在附加依赖项窗口中加上Psapi lib 可解决问题
  • 关于CMake生成包含PCL库和CGAL库的工程时出现“无法解析的外部符号”的错误

    前言 博主之前安装了PCL 1 8 0库 教程链接 PCL 1 8 0 AllInOne VS2013 Win8 X64 安装配置及部分问题解决方法 和CGAL库 教程链接 在Win8 VS2013中配置CGAL库 最近需要把两个库用在同一
  • CGAL-5.6的安装与编译(Win10+vs2022+CGAL-5.6+Boost1.82.0)

    文章目录 前言 一 安装Boost 1 下载 2 环境变量 二 安装CGAL和GMP and MPFR libraries 1 下载 2 解压 3 环境变量 其他 参考 前言 CGAL是Computational Geometry Algo
  • 编译CGAL

    抛弃CMake 长期以来 我一直以为编译CGAL是一项十分艰巨的任务 直到有一天 我决定彻底抛弃繁复的CMake 转而使用简简单单的QMake 这才发现 编译CGAL是如此简单的一个事儿 注 本文所指的CGAL是指CGAL4 14及之后的版
  • CGAL的简介及安装设置

    一 CGAL库的介绍 CGAL Computational Geometry Algorithms Library 库 计算几何算法库 是一个大型的C 几何数据结构和算法库 包含Delaunay三角网 网格生成 布尔运算的多边形 各种几何处
  • CGAL的编译与配置

    CGAL的编译与配置 网上已经有一些配置的步骤 但是在具体配置过程中 发现有很多问题 折腾了两天后终于配置成功 在此做更详细的记录 准备 CGAL CGAL4 7和CGAL4 9的库 分别编译成功了 BOOST boost1 59的版本 C
  • Ubuntu14.04下配置CGAL+boost+QT+Suitesparse

    这两天突然间想把以前在linux在没有调通的程序给调通 这个程序需要用到CGAL和Suitesparse 稀疏矩阵计算 大家上网查哈 而CGAL又依赖于boost 和QT 所以总共需要安装boost QT suitesparse和CGAL
  • 在 Mac OS X 10.7.2 上用 C++ 编译基本 CGAL 程序

    当我尝试编译 Voronoi Diagram 2 示例时 我得到以下输出 singhg Programming examples Voronoi diagram 2 cmake DCGAL DIR opt local lib cmake C
  • CGAL:带有信息的点的凸包

    我在平面上有一个由 2D 点 N 个元素 组成的向量 我想制作这些点的凸包 之后 我想检索凸包中每个顶点的向量索引 我该怎么做 我知道 通过利用三角测量存在这种可能性vector
  • CGAL:2D 约束 Delaunay 三角剖分 - 将信息添加到约束

    在将点添加到三角器对象之前 可以将信息 如整数 附加到点上 我这样做是因为一方面我需要一个稍后使用的 int flag 来定义我的纹理坐标 另一方面我需要一个索引 以便我可以创建一个索引的 VBO http doc cgal org lat
  • PCL kd-tree 实现速度极慢

    我正在使用基于点云库 PCL 的 C 实现 kd 树最近邻 NN 搜索 该数据集包含约 220 万个点 我正在为每个其他点搜索 NN 点 搜索半径设置为 2 0 要完全计算出来 大约需要 12 个小时 我使用的是带有 4GB RAM 的 W
  • CGAL:线段和多边形之间的交点?

    我有一组多边形 我想测试它和线段之间的交集 我检查了手册 但找不到匹配的功能 点 线 线段 三角形 平面之间确实存在交点 并且多边形之间的交点也在那里 我的问题是 有这样的功能吗 如果不是 是否意味着我需要将多边形分解成段并在这些段之间进行
  • 与 CGAL 的链接错误

    我在 Mac OS X 10 8 4 上安装了 CGAL 我已成功地将 CGAL 的各个方面合并到以前的 C 程序中来计算 3D 点云的凸包 然而 现在我试图包含 CGAL 的其他部分来计算表面网格 将它们转换为多面体 等等 当我这样做时
  • 表面参数化

    我正在尝试在表面网格上获取参数化表面 从 STL 格式文件中读取 我阅读了 CGAL 示例目录提供的一些有关参数化的示例 我知道应该提供接缝线才能在任意表面上获得参数化表面 但我还是不明白如何制作接缝线 下面是我到目前为止的代码 总而言之
  • 如何用CGAL获取多边形网格的顶点和面?

    With CGAL 我能够得到一个多面体网格OFF格式 例如 下面的程序构建两个四面体 计算它们的交集 并将结果返回到OFF文件 这OFF输出提供顶点坐标和顶点索引给出的面 但我想将顶点和面作为 C 变量 例如double顶点向量和int面
  • CGAL:从网格中读取顶点和三角形

    我只是花了几个小时在 Visual Studio C 中使用 CGAL 来尝试了解网格的工作原理 我想要得到的是对顶点和三角形列表的访问 顶点以 double 3 形式 三角形以 int 3 形式 这是我正在编写的脚本 http doc c
  • 配置:错误:找不到 CGAL 库

    我的最终目标就是获取python包graph tool在我的系统上工作 如果可能的话 也在 ipynb 上工作 我已经brew install graph tool 如此处所示 https git skewed de count0 grap

随机推荐

  • Win10 + C++ + Paddle进行OCR文字识别 Cmake编译

    1 下载文件并保存到D盘 1 1 PaddleOCR 项目文件下载1 1 2 下载推理模型 PaddleOCR 项目文件下载2 1 4 下载推理库 1 5 下载Opencv3 4 1 6 解压到指定目录 在系统变量 Path 的末尾添加 C
  • java压缩解压文件工具类

    controller中使用 PostMapping value importZip public Result
  • 新唐NUC980使用记录:U-Boot & Linux 编译与烧录(基于SPI NAND)

    文章目录 目的 U Boot编译 U Boot环境变量 Linux编译 默认设置 使用SPI NAND剩余分区 使用SPI NAND YAFFS2作为rootfs 打包镜像 总结 目的 这篇文章中将测试在 NUC980 中运行Linux系统
  • 7.Django如何实现跨域

    文章目录 1 同源策略 2 简单 复杂请求 3 CORS 4 如何解决跨域 方法一 添加响应头Access Control Allow Origin 方法二 使用扩展django cors headers 5 跨域实现流程 1 同源策略 同
  • 进程的三种状态详解

    1 进程的三种基本状态 进程在运行中不断地改变其运行状态 通常 一个运行进程必须具有以下三种基本状态 1 就绪 Ready 状态 当进程已分配到除CPU以外的所有必要的资源 只要获得CPU便可立即执行 这时的进程状态称为就绪状态 2 执行
  • Halcon图像减法——找两图像的不同

    一 实验要求 1 写程序找出下面两幅图像的不同之处 用红色表示 二 代码实现 read image Image C Users 86159 Pictures Saved Pictures 1作业图片 5 1 1 jpg 照片尺寸 515 6
  • 计算机卡慢解决方法,电脑慢的快速解决办法 四种方法电脑速度变快10倍

    简介 关于电脑慢的快速解决办法 四种方法电脑速度变快10倍的相关装修疑问 相信很多朋友对此并不是非常清楚 为了帮助大家更好的了解相关装修知识要点 小编特此为大家整理出如下讲解内容 希望下面的装修内容对大家有所帮助 如果有更好的建议或者想看更
  • C# 中感叹号 (!) 的一些常见用法

    在C 中 感叹号 有多种用途 具体取决于上下文 下面是一些常见的用法和示例 逻辑非运算符 感叹号可以用作逻辑非运算符 用于取反布尔值 它将true转换为false 将false转换为true 示例 bool isTrue true bool
  • Git子模块操作手册

    Git子模块操作手册 一 添加子模块并提交含子模块项目 1 在当前项目目录下执行以下命令 gitsubmodule add https gitee com tianbu git module git 说明 命令分为三部分 gitsubmod
  • Web安全—敏感信息泄露

    敏感信息泄露常见场景 敏感信息 后台URL地址 操作系统类型 数据库类型 脚本类型 接口信息等 常见场景 1 通过访问URL下的目录 可以直接列出目录下的所有文件列表 目录遍历 index of 2 构造输入错误的URL 服务端返回错误信息
  • cocos2dx中播放Armature动画

    ArmatureDataManager getInstance gt addArmatureFileInfo effect hitscreen hitscreen ExportJson boolPlayOnclickArmation onT
  • openresty学习笔记

    openresty 简介 openresty 是一个基于 nginx 与 lua 的高性能 web 平台 其内部 集成了大量精良的 lua 库 第三方模块以及大数的依赖项 用于 方便搭建能够处理超高并发 扩展性极高的动态 web 应用 we
  • QGIS的安装和中文设置

    安装 中文设置 安装 下载安装包 https www qgis org zh Hans site forusers download html 安装 输入镜像网址 选择版本 中文设置 在开始菜单中打开 QGIS Desktop 3 10 1
  • pytorch 权重weight 与 梯度grad 可视化

    查看特定layer的权重以及相应的梯度信息 打印模型 观察到model下面有module的key module下面有features的key features下面有 0 的key 这样就可以直接打印出weight了 在pdb debug界面
  • 1004. 成绩排名 (20)

    读入n名学生的姓名 学号 成绩 分别输出成绩最高和成绩最低学生的姓名和学号 输入格式 每个测试输入包含1个测试用例 格式为 第1行 正整数n 第2行 第1个学生的姓名 学号 成绩 第3行 第2个学生的姓名 学号 成绩 第n 1行 第n个学生
  • C++中数组、链表和vector等容器之间的区别

    1 各个容器之间区别 vector 连续的空间存储 可以使用 操作符 快速的访问随机的元素 快速的在末尾插入元素 但是在序列中间岁间的插入 删除元素要慢 而且如果一开始分配的空间不够的话 有一个重新分配更大空间 然后拷贝的性能开销 dequ
  • HyperLedger Fabric - 超级账本(2.2)启动网络 - 手动

    启动网络手动实现 实现步骤 生成组织关系和身份证书 确定是在 fabric samples first network 路径下 cd hyfa fabric samples first network 为fabric网络生成指定拓扑结构的组
  • iphone备忘录突然没了_苹果机系统更新备忘录丢失怎么恢复呢?

    爪机最近总是提示更新系统 睡觉前就顺手点了更新 早上起来打开备忘录查看一天工作安排的时候 备忘录突然卡了一下 再打开就什么都没有了 里面有我一周的工作安排以及之前的工作总计等 总之很重要绝对不能丢失的东西 竟然就那么平白无故的丢了 除了嘴里
  • 转行面试,跳槽面试,软件测试人员都必须知道的这几种面试技巧

    在面试的过程中好多人会有这种的感觉 我在面试的时候面试官会问的特别详细 你们的公司之前是做什么的 还有相关的一些人员构成比例 开发和测试大概有多少人 你们公司有没有运维 有没有产品 以及呢一些详细的软件流程测试 版本大小的一些迭代更新 都是
  • 关于tif和笛卡儿的坐标互换

    今天出了一个问题 隐藏了好几天 那就是在点云和tif文件读写时 坐标系出现了换算错误 是我代码的问题 在笛卡儿坐标系中 X向右为正 y向上为正 而在tif文件中 用的图像坐标系 x向右为正 y向下为正 分辨率为负数 比如 设置X Y方向的像