- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我目前正在编写代码以读取 .las(激光雷达点数据)文件。读入文件后,我创建了一个指针来遍历所有点。但是,它给了我一个 bad_alloc 错误。
我唯一能想到的是 header 与 las 文件头指定的大小不一样。我仔细检查了我的标题,我认为我没有发现任何错误。
Header和PointRecord3中所有的header变量都来自这个documentation ,第 3 页和第 10 页。
更新:读入的点数为 402,673,112。然而,当我在其他激光雷达软件中打开它仔细检查时,点数只有 5,104,152。我相信这是因为我在用C++打开它之前在其他软件中过滤了云,因此减少了点数。
这是我的代码:
#ifndef POINTCLOUD_H
#define POINTCLOUD_H
#pragma once
#include <string>
class PointCloud
{
public:
PointCloud(const std::string &path);
private:
struct __attribute__((packed)) Header {
char magic[4];
uint16_t fileourceID;
uint16_t globalEncoding;
uint32_t guiData1;
uint16_t guiData2;
uint16_t guiData3;
uint8_t guiData[8];
uint8_t versionMaj, versionMin;
char systemIdentifer[32];
char genSoftware[32];
uint16_t creationDay, creationYear;
uint16_t headerSize;
uint32_t pointDataOffset;
uint32_t numVarLenRecords;
uint8_t pointDataRecordFormat;
uint16_t pointDataRecordLen;
uint32_t numberOfPoints;
uint32_t numPointsByReturn[5];
double scaleX, scaleY, scaleZ;
double offX, offY, offZ;
double minX, minY, minZ;
double maxX, maxY, maxZ;
};
struct __attribute__((packed)) PointRecord3 {
uint32_t X, Y, Z;
uint16_t intensity;
uint8_t flags;
uint8_t classification;
uint8_t scanAngleRank;
uint8_t userData;
uint16_t pointSourceID;
double gpsTime;
uint16_t red;
uint16_t green;
uint16_t blue;
};
#include "PointCloud.h"
#include <fstream>
#include <iostream>
#include <string>
#include <assert.h>
using namespace std;
PointCloud::PointCloud(const string &path)
{
read(path);
}
void PointCloud::read(const string &path) {
ifstream in(path.c_str(), ios::binary );
if(in.is_open()){
Header header;
in.read((char *)&header, sizeof(header));
assert(header.versionMaj == 1 && header.versionMin == 2);
cout << "headerSize " << header.headerSize << " == " << sizeof(header) << " size of header struct" <<endl;
cout << "FILE TYPE: LAS " << (int)header.versionMaj << "." << (int)header.versionMin << endl;
cout << "POINT DATA OFFSET: " << (int)header.pointDataOffset <<endl;
cout << "POINT DATA RECORD FORMAT: " << (int)header.pointDataRecordFormat <<endl;
cout << "NUMBER OF POINTS: " << (int)header.numberOfPoints << endl;
PointRecord3 *points = new PointRecord3[header.numberOfPoints];
in.seekg(header.pointDataOffset);
for(uint32_t i = 0; i < header.numberOfPoints; i++) {
in.read((char *) (points + i), sizeof(*points));
}
if(in.good()) {
throw runtime_error("error");
}
delete points;
} else {
cout << "file not opened" << endl;
}
}
如有任何帮助,我们将不胜感激!
这里还有 LAS 文件头的输出:
file signature: 'LASF'
file source ID: 0
global_encoding: 0
project ID GUID data 1-4: 00000000-0000-0000-0000-000000000000
version major.minor: 1.2
system identifier: 'EXPORT'
generating software: 'RiSCAN_PRO'
file creation day/year: 317/2018
header size: 227
offset to point data: 313
number var. length records: 1
point data format: 3
point data record length: 34
number of point records: 5104152
number of points by return: 5104152 0 0 0 0
scale factor x y z: 0.00025 0.00025 0.00025
offset x y z: 267805 3197054 13
min x y z: 267804.25250 3196596.64500 -1.89000
max x y z: 268760.27000 3197586.23000 23.33000
variable length header record 1 of 1:
reserved 43707
user ID 'LASF_Projection'
record ID 34735
length after header 32
description 'GeoKeyDirectoryTag (mandatory)'
GeoKeyDirectoryTag version 1.1.0 number of keys 3
key 1025 tiff_tag_location 0 count 1 value_offset 2 - GTRasterTypeGeoKey: RasterPixelIsPoint
key 1024 tiff_tag_location 0 count 1 value_offset 3 - GTModelTypeGeoKey: ModelTypeGeocentric
key 2048 tiff_tag_location 0 count 1 value_offset 4326 - GeographicTypeGeoKey: GCS_WGS_84
reporting minimum and maximum for all LAS point record entries ...
X -2989 3821075
Y -1829412 2128911
Z -59559 41318
intensity 32767 32768
return_number 1 1
number_of_returns 1 1
edge_of_flight_line 0 0
scan_direction_flag 1 1
classification 0 0
scan_angle_rank 0 0
user_data 0 0
point_source_ID 0 0
gps_time 0.000000 0.000000
Color R 0 0
G 0 0
B 0 0
number of first returns: 5104152
number of intermediate returns: 0
number of last returns: 5104152
number of single returns: 5104152
overview over number of returns of given pulse: 5104152 0 0 0 0 0 0
histogram of classification of points:
5104152 never classified (0)
最佳答案
我想通了。所以发生的事情是 C++ 添加了一些额外的字节,导致我的头结构比实际文件头大 5 个字节。我通过添加 #pragma pack (push, 1) 解决了这个问题。
#ifndef POINTCLOUD_H
#define POINTCLOUD_H
#pragma pack (push, 1)
#include <string>
struct float3
{
float x, y, z;
};
class PointCloud
{
public:
PointCloud(const std::string &path);
private:
struct __attribute__((packed)) Header
{
char fileSig[4];
uint16_t fileourceID;
uint16_t globalEncoding;
uint32_t guiData1;
uint16_t guiData2;
uint16_t guiData3;
uint8_t guiData[8];
uint8_t versionMaj, versionMin;
char systemIdentifer[32];
char genSoftware[32];
uint16_t creationDay, creationYear;
uint16_t headerSize;
uint32_t pointDataOffset;
uint32_t numVarLenRecords;
uint8_t pointDataRecordFormat;
uint16_t pointDataRecordLen;
uint32_t numberOfPoints;
uint32_t numPointsByReturn[5];
double scaleX, scaleY, scaleZ;
double offX, offY, offZ;
double minX, minY, minZ;
double maxX, maxY, maxZ;
};
struct __attribute__((packed)) PointRecord3
{
uint32_t X, Y, Z;
uint16_t intensity;
uint8_t flags;
uint8_t classification;
uint8_t scanAngleRank;
uint8_t userData;
uint16_t pointSourceID;
double gpsTime;
uint16_t red;
uint16_t green;
uint16_t blue;
};
void read(const std::string &path);
};
#endif // POINTCLOUD_H
关于c++ - 创建从 .las 二进制文件读取的指针会引发 bad_alloc 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53507818/
我刚接触 C 语言几周,所以对它还很陌生。 我见过这样的事情 * (variable-name) = -* (variable-name) 在讲义中,但它到底会做什么?它会否定所指向的值吗? 最佳答案
我有一个指向内存地址的void 指针。然后,我做 int 指针 = void 指针 float 指针 = void 指针 然后,取消引用它们以获取值。 { int x = 25; vo
我正在与计算机控制的泵进行一些串行端口通信,我用来通信的 createfile 函数需要将 com 端口名称解析为 wchar_t 指针。 我也在使用 QT 创建一个表单并获取 com 端口名称作为
#include "stdio.h" #include "malloc.h" int main() { char*x=(char*)malloc(1024); *(x+2)=3; --
#include #include main() { int an_int; void *void_pointer = &an_int; double *double_ptr = void
对于每个时间步长,我都有一个二维矩阵 a[ix][iz],ix 从 0 到 nx-1 和 iz 从 0 到 nz-1。 为了组装所有时间步长的矩阵,我定义了一个长度为 nx*nz*nt 的 3D 指针
我有一个函数,它接受一个指向 char ** 的指针并用字符串填充它(我猜是一个字符串数组)。 *list_of_strings* 在函数内部分配内存。 char * *list_of_strings
我试图了解当涉及到字符和字符串时,内存分配是如何工作的。 我知道声明的数组的名称就像指向数组第一个元素的指针,但该数组将驻留在内存的堆栈中。 另一方面,当我们想要使用内存堆时,我们使用 malloc,
我有一个 C 语言的 .DLL 文件。该 DLL 中所有函数所需的主要结构具有以下形式。 typedef struct { char *snsAccessID; char *
我得到了以下数组: let arr = [ { children: [ { children: [], current: tru
#include int main(void) { int i; int *ptr = (int *) malloc(5 * sizeof(int)); for (i=0;
我正在编写一个程序,它接受一个三位数整数并将其分成两个整数。 224 将变为 220 和 4。 114 将变为 110 和 4。 基本上,您可以使用模数来完成。我写了我认为应该工作的东西,编译器一直说
好吧,我对 C++ 很陌生,我确定这个问题已经在某个地方得到了回答,而且也很简单,但我似乎找不到答案.... 我有一个自定义数组类,我将其用作练习来尝试了解其工作原理,其定义如下: 标题: class
1) this 指针与其他指针有何不同?据我了解,指针指向堆中的内存。如果有指向它们的指针,这是否意味着对象总是在堆中构造? 2)我们可以在 move 构造函数或 move 赋值中窃取this指针吗?
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: C : pointer to struct in the struct definition 在我的初学者类
我有两个指向指针的结构指针 typedef struct Square { ... ... }Square; Square **s1; //Representing 2D array of say,
变量在内存中是如何定位的?我有这个代码 int w=1; int x=1; int y=1; int z=1; int main(int argc, char** argv) { printf
#include #include main() { char *q[]={"black","white","red"}; printf("%s",*q+3); getch()
我在“C”类中有以下函数 class C { template void Func1(int x); template void Func2(int x); }; template void
我在64位linux下使用c++,编译器(g++)也是64位的。当我打印某个变量的地址时,例如一个整数,它应该打印一个 64 位整数,但实际上它打印了一个 48 位整数。 int i; cout <<
我是一名优秀的程序员,十分优秀!