pretty code

2022年11月30日 星期三

PCL - coefficients detail information

RANSAC 是 PCL 裡面蠻常用的一種演算法,我們常利用它來偵測平面或是一些幾何圖案的模型。

我們會利用 setModelType 來偵測不同的模型,由於 PCL 是用 C++ 開發,裡面用到大量的 Template,再加上又有一些 class 的繼承,故有時候一樣的語法,但取到的值有不同的意義。

pcl::ModelCoefficients 在不同的模型下,就有不同的意義,故裡面的 values 的型別才會是 vector,其數量也不同。

舉例來說,SACMODEL_NORMAL_SPHERE 要偵測的是球體,故 values 共有 4 個值,分別代表 center.x,、center.y、center.z、radidus。

昨天到現在一直找不到官方的說明文件在哪?剛好現在看到,馬上留個記錄先。

2022年11月22日 星期二

PCL 點雲踩坑紀錄

連續好幾個月都在碰點雲,看到點雲都快吐了,但暫時應該還是脫離不了它。

剛好很久沒更新 Blog 了,藉此機會記錄一下最近遇到的坑。

01. pcl::PolygonMesh

為了模組化 code,我們應該會常常把東西拆解成函數,昨天為了重覆利用此變數並透過 reference 傳進函數中,當在這個函數中重覆使用它去載入 Mesh 檔案,之後再去使用這個變數便會觸發異常。

當異常時有時候會跳出 VC 視窗,有時候又不會,目前看過兩種不同的錯誤,一個是類似操作 Heap 錯誤,一個是操作 vector 錯誤,有抓到的視窗如下。


雖然不知道如何解決?但應該是跟資源沒有清除乾淨誤存取有關?不看 PCL Code 的情況下看了一下文件,剛好裡面有一個 Public member polygons,它本身就是一個 vector,試著清除它後,這個問題便不再發生。

解決方式:mesh.polygons.clear()

後記:這個問題的奇怪點只有當傳 mesh 的參照進去函數並重複使用才會發生問題,區域變數重複使用不會有問題,跟參照有關?可惜本人 C++ 很弱,想不到錯誤的發生原因。

02. pcl::PassThrough

一樣是為了重覆利用變數才發生問題,但這就跟 PCL 本身無關,純粹是 Coding issue XD

簡單來說,在做點雲時,時常要將點雲不要的東西切掉,故很常用到這個 Filter,但有時候我們要的是選到的範圍以外的,故我們會 call pass.setNegative(true),但你重覆使用這個變數繼續再割另一個點雲時,這個值已經被設為 true,故會變成跟你要的範圍相反。

這個沒注意還真不容易看到錯誤,尤其是在做了好幾十次切割後,看 Code 都看到懷疑人生了。

解決方式:每次重複利用變數時,開頭一定要 call pass.setNegative(XXX),將它設成你要的設定。