原博文鏈接在我的官方網站,網址是:http://www.aobosir.com/blog/2017/02/08/pcl-visualization-PCLVisualizer-register-keyboard-callback/
如何使用 pcl 庫裏面的可視化模塊的鍵盤事件
#include <pcl/visualization/pcl_visualizer.h>
bool iteration_flag = false;
void keyboardEventOccurred(const pcl::visualization::KeyboardEvent& event, void* nothing){
if(event.getKeySym() == "space" && event.keyDown()){
iteration_flag = true;
}
}
int main(){
pcl::visualization::PCLVisualizer *p;
p = new pcl::visualization::PCLVisualizer("PCL Windows");
p->registerKeyboardCallback(&keyboardEventOccurred, (void*)NULL);
while(iteration_flag != true){
p->spinOnce();
}
return 0;
}
需要注意的事項:
第一個:就是,你定義的這個p
指針,必須要給它賦值實例化對象:p = new pcl::visualization::PCLVisualizer("PCL Windows");
,否則程序編譯不會出現錯誤,但是運行的時候會出現內存異常的運行錯誤。
第二個:就是這個自定義的鍵盤事件函數了:keyboardEventOccurred()
函數。想要讓這個函數可以使用,我們不需要再程序中循環的調用p->spinOnce()
方法,程序才能響應我們的這個鍵盤事件函數。
第三個:一個也非常重要:其實上面的代碼中,這段程序是不安全的:
while(iteration_flag != true){
p->spinOnce();
}
因爲如何程序在這個地方一直的執行,如果你可視化的是一個點比較多的點雲,那麼一段時間後(大約不到5秒鐘),你的電腦就會卡得要死!!!!
安全的程序應該是下面這個樣子的:(參考網站:這裏)
我們添加延時函數,不讓它一直執行spinOnce()
方法。
#include <boost/thread/thread.hpp>
while (iteration_flag != true)
{
p->spinOnce (100);
boost::this_thread::sleep (boost::posix_time::microseconds (100000));
}
其中spinOnce()
函數裏面的100
指的是:How long (in ms) should the visualization loop be allowed to run.
其中的boost::this_thread::sleep (boost::posix_time::microseconds (100000));
是延時100000微秒,也就是0.1秒。
更多精彩的博文,請訪問:http://www.aobosir.com/