CARLA
 
载入中...
搜索中...
未找到
ImageSerializer.h
浏览该文件的文档.
1// Copyright (c) 2017 Computer Vision Center (CVC) at the Universitat Autonoma
2// de Barcelona (UAB).
3//
4// This work is licensed under the terms of the MIT license.
5// For a copy, see <https://opensource.org/licenses/MIT>.
6
7#pragma once
8// 预处理指令,用于确保该头文件在整个项目的编译过程中只会被包含一次
9
10#include "carla/Memory.h"
11// 引入carla项目中与内存管理相关的头文件
13// 引入carla项目里有关传感器原始数据(RawData)的头文件
14
15#include <cstdint>
16// 引入C++标准库中用于定义固定宽度整数类型的头文件
17#include <cstring>
18// 引入C++标准库中包含字符串处理以及内存操作相关函数(比如memcpy等函数)的头文件,后续代码中可以利用这些函数来进行内存中数据的拷贝等操作。
19
20namespace carla {
21namespace sensor {
22
23 class SensorData;
24// 前向声明SensorData类
25namespace s11n {
26
27 /// Serializes image buffers generated by camera sensors.
29 public:
30
31#pragma pack(push, 1)
32// 这是一个预处理指令,用于设置结构体的字节对齐方式为1字节对齐
33
34 struct ImageHeader {
35 uint32_t width;
36// 定义一个32位无符号整数类型的成员变量
37 uint32_t height;
38 // 同样是32位无符号整数类型的成员变量
39 float fov_angle;
40 // 定义一个单精度浮点数类型的成员变量
41 };
42#pragma pack(pop)
43// 恢复之前的默认字节对齐方式,取消掉由#pragma pack(push, 1)所设置的紧凑对齐状态
44
45 constexpr static auto header_offset = sizeof(ImageHeader);
46 // 使用constexpr关键字定义一个静态常量,将其初始化为ImageHeader结构体的大小(字节数)。
47
48 static const ImageHeader &DeserializeHeader(const RawData &data) {
49 return *reinterpret_cast<const ImageHeader *>(data.begin());
50// 定义一个静态函数DeserializeHeader,它的功能是对传入的原始数据(类型为RawData)进行反序列化操作,目的是获取其中的图像头部信息。
51// 具体实现方式是,先获取原始数据的起始地址(通过data.begin()获取),然后使用reinterpret_cast操作符将这个起始地址强制转换为指向ImageHeader结构体的指针类型
52 // 最后返回这个指针所指向的ImageHeader结构体的引用,这样就能够获取到解析出来的头部信息结构体,进而可以方便地使用其中各个成员变量进行后续相应的处理操作。
53 }
54
55 template <typename Sensor>
56 static Buffer Serialize(const Sensor &sensor, Buffer &&bitmap);
57 // 定义一个静态模板函数Serialize,它用于将特定传感器(由模板参数Sensor来指定具体类型)相关的图像缓冲区数据(由参数bitmap表示)进行序列化操作。
58// 参数sensor是对应传感器的对象引用,通过它可以获取到传感器相关的图像属性等信息;bitmap是要进行序列化的图像缓冲区
59
61// 定义一个静态函数Deserialize,该函数用于将传入的原始数据(通过右值引用的方式接收,即RawData &&data,这样做可以避免不必要的拷贝操作)进行反序列化处理。
62// 最终函数会返回一个指向SensorData类型的共享智能指针(SharedPtr表示共享所有权的智能指针,使用它有助于进行内存管理以及控制对象的生命周期)
63// 也就是把原始数据还原为相应的传感器数据对象形式,方便后续在程序中进一步使用该数据。
64
65 };
66
67 template <typename Sensor>
68 inline Buffer ImageSerializer::Serialize(const Sensor &sensor, Buffer &&bitmap) {
69 DEBUG_ASSERT(bitmap.size() > sizeof(ImageHeader));
70 // 使用DEBUG_ASSERT宏进行断言检查
71// 其目的是确保传入的图像缓冲区(bitmap)的大小要大于ImageHeader结构体的大小。因为后续操作需要在缓冲区前面添加头部信息,如果缓冲区大小不够就会出现问题
72
73 ImageHeader header = {
74 sensor.GetImageWidth(),
75 sensor.GetImageHeight(),
76 sensor.GetFOVAngle()
77 };
78// 创建一个ImageHeader结构体的对象header
79// 然后使用这些获取到的值对header结构体进行初始化赋值,为后续将这些信息添加到图像缓冲区作为头部信息做好准备。
80
81 std::memcpy(bitmap.data(), reinterpret_cast<const void *>(&header), sizeof(header));
82// 使用来自<cstring>头文件中的std::memcpy函数,将刚才创建并初始化好的header结构体的数据复制到图像缓冲区(bitmap)的起始位置。
83// 这里需要先将header结构体的指针通过reinterpret_cast转换为void*类型,以满足std::memcpy函数对于参数类型的要求,并且指定复制的数据字节数为header结构体的大小(sizeof(header))
84
85 return std::move(bitmap);
86// 通过移动语义(使用std::move函数)返回填充好头部信息的图像缓冲区(bitmap)。采用移动语义的好处是避免了不必要的数据拷贝操作,提高了函数返回的效率
87 }
88
89} // namespace s11n
90} // namespace sensor
91} // namespace carla
#define DEBUG_ASSERT(predicate)
Definition Debug.h:68
一块原始数据。 请注意,如果需要更多容量,则会分配一个新的内存块,并 删除旧的内存块。这意味着默认情况下,缓冲区只能增长。要释放内存,使用 clear 或 pop。
包装一个传感器生成的原始数据以及一些有用的元信息。
Definition RawData.h:20
auto begin() noexcept
指向传感器生成的数据的开始迭代器。
Definition RawData.h:52
Serializes image buffers generated by camera sensors.
static const ImageHeader & DeserializeHeader(const RawData &data)
static Buffer Serialize(const Sensor &sensor, Buffer &&bitmap)
static SharedPtr< SensorData > Deserialize(RawData &&data)
CARLA模拟器的主命名空间。
Definition Carla.cpp:139
boost::shared_ptr< T > SharedPtr
使用这个SharedPtr(boost::shared_ptr)以保持与boost::python的兼容性, 但未来如果可能的话,我们希望能为std::shared_ptr制作一个Python适配器。
Definition Memory.h:19