點雲數據結構
點雲數據結構非常簡單,只有點的三維坐標信息和法線信息。下面是一個點雲表示的抽象類:
class GPP_EXPORT IPointCloud { public: IPointCloud(){} virtual Int GetPointCount() const = 0; virtual Vector3 GetPointCoord(Int pid) const = 0; virtual void SetPointCoord(Int pid, const Vector3& coord) = 0; virtual Vector3 GetPointNormal(Int pid) const = 0; virtual void SetPointNormal(Int pid, const Vector3& normal) = 0; virtual bool HasNormal() const = 0; virtual void SetHasNormal(bool has) = 0; virtual Int InsertPoint(const Vector3& coord) = 0; virtual Int InsertPoint(const Vector3& coord, const Vector3& normal) = 0; virtual void SwapPoint(Int pointId0, Int pointId1) = 0; virtual void PopbackPoints(Int popCount) = 0; virtual void Clear(void) = 0; virtual ~IPointCloud(){}; };
- 點雲頂點的存儲格式一般是線性的,獲取方便,但是刪除會存在一些效率問題。IPointCloud提供了SwapPoint函數把需要刪除的元素交換到尾部,然后再通過PopbackPoints刪除尾部元素.
- Clear函數負責清除Point Coordinate, Point Normal. 回到構造類初始化時的狀態.
- HasNormal函數主要用意: 有時候點雲創建后沒有法線信息,IPointCloud提供這個函數查詢點雲是否有可靠法線信息. SetHasNormal函數可以設置點雲是否有法線信息。
IPointCloud是一個抽象類,不能直接使用。用戶可以繼承這個接口類,實現其成員函數。這樣設計的一個好處是,用戶無需改變自己已有的數據結構,只要實現了這個接口類,就可以調用Geometry++里所有關於點雲的算法了。真正體現了即插即用的特點。比如用戶已經有了一個點雲類MyPointCloudData,則我們可以定義一個類MyPointCloud,並用它來調用Geometry++里的各種點雲算法:
class MyPointCloud : public IPointCloud { MyPointCloudData* mData; MyPointCloud(MyPointCloudData* data) : mData(data) {} virtual Int GetPointCount() const { mData->GetPointCloud(); } virtual Vector3 GetPointCoord() const { mData->GetPointCoord(); } virtual void SetPointCoord(Int pid, const Vector& coord) { mData->SetPointCoord(pid, coord[0], coord[1], coord[2]); } // 其它成員函數類似 }; MyPointCloud pointCloud(myPointCloudData); // 用自己的點雲數據初始化MyPointCloud ErrorCode res = ConsolidatePointCloud::LaplaceSmooth(pointCloud, 0.2, 5); // 調用點雲算法API來修改自己的點雲數據 res = ConsolidatePointCloud::CalculatePointCloudNormal(pointCloud);
有序點雲是什么
一幀掃描數據是一副深度圖,屬於灰度圖。像素的灰度值代表的是深度信息,可以通過相機參數把每個像素點變換到世界坐標系,這樣每個像素就對應一個三維點,有些點是無效的。下圖是一個典型的深度點雲。
有序點雲是一個方陣,如圖所示。點雲按照方陣一行一行的,從左上角到右下角排列。
有序點雲到無序點雲遺失了哪些信息
- 有序點雲按順序排列,可以很容易的找到它的相鄰點信息。
- 無效點信息也有用,可以通過它快速准確的找到點雲邊界。
- 有序點雲一般是在相機坐標系里的,所以法線是面向相機的,所以法線定向問題自然就解決了。如果曲面幾何是光滑變化的,還可以應用法線的Z分量來定義點雲的邊界。如下圖所示,顏色代表了法線Z分量。有些掃描儀在邊界處的誤差比較大,可以用這個方法很快速准確的去掉邊界處的點。
與無序點雲相比,有序點雲的處理速度可以快很多。