2015-12-02 4 views
2

Я после этой обучающей программы в официальной документации PCL для класса PCLVisualizer:PCL Visualizer Пример: Не удается получить события клавиатуры и мыши

http://pointclouds.org/documentation/tutorials/pcl_visualizer.php

и у меня возникают проблемы с приобретением клавиатуры: когда Я выбираю окно визуализации, в котором отображается PointCloud, и попробуйте нажать «г» или «д», ничего не происходит, и когда я пытаюсь нажать левую кнопку мыши, появится следующий текст:

Left mouse button released at position (413, 475)

и следующая ошибка возникает (во время выполнения):

Assertion failed: (px != 0), function operator->, file /usr/local/include/boost/smart_ptr/shared_ptr.hpp, line 687. 
Abort trap: 6 

Я видел, что такая ошибка происходит, когда вы не инициализировать boost::shared_ptr в объявлении переменной. Но в коде, указанном в документации, переменная хорошо определена, поэтому я полагаю, что проблема связана с библиотекой shared_ptr.hpp, или это не так?

Я искал через Интернет решение, но я не нашел ничего, что могло бы решить проблему.

Есть ли кто-нибудь, способный получать нажатия клавиш в окне рендеринга pointcloud, запустив его на OS X?

Если вопрос непонятен, сообщите мне. Большое спасибо за любую помощь или информацию!

+0

Я попытался ** инициализировать переменную 'viewer' в основной функции ** и обработчик мыши работал:' boost :: shared_ptr viewer (new pcl :: visualization: : PCLVisualizer («3D Viewer»)); ', на мой взгляд, утверждение не получилось, потому что указатель, переданный обратному вызову' mouseEventOccured() ', был неправильно инициализирован. Но ** получение ** ** ** ** не работает **. – Mauro

ответ

1

У вас нет кода, так что трудно сказать, что не так в вашей программе.

Вот рабочий пример, протестирована на Ubuntu 14.04 с PCL последнего ствола (ствол ВТК):

#include <iostream> 
#include <pcl/visualization/pcl_visualizer.h> 

void keyboardEventOccurred(const pcl::visualization::KeyboardEvent &event, void* viewer_void) 
{ 
    boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer = *static_cast<boost::shared_ptr<pcl::visualization::PCLVisualizer> *>(viewer_void); 
    if (event.getKeySym() == "r" && event.keyDown()) 
    std::cout << "'r' was pressed" << std::endl; 
    if (event.getKeySym() == "h" && event.keyDown()) 
    std::cout << "'h' was pressed" << std::endl; 
} 

void mouseEventOccurred(const pcl::visualization::MouseEvent &event, void* viewer_void) 
{ 
    boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer = *static_cast<boost::shared_ptr<pcl::visualization::PCLVisualizer> *>(viewer_void); 

    if (event.getButton() == pcl::visualization::MouseEvent::LeftButton && 
     event.getType() == pcl::visualization::MouseEvent::MouseButtonRelease) 
    std::cout << "Left mouse button released at position (" << event.getX() << ", " << event.getY() << ")" << std::endl; 
} 

int main() 
{ 
    pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer); 
    viewer->addCoordinateSystem(); 
    viewer->registerKeyboardCallback(keyboardEventOccurred, (void*)&viewer); 
    viewer->registerMouseCallback(mouseEventOccurred, (void*)&viewer); 
    viewer->spin(); 
} 

Следует отметить, что некоторые ключевые штрихи уже используется PCL визуализатора для некоторых действий (пресс h для более подробная информация), но это не мешает вам использовать их.

+0

Я пробовал свой код на своем компьютере, но приобретение клавиатуры все еще не работает. Я нажал на окно рендеринга pointcloud, чтобы сделать его в фокусе, и я попытался нажать «r» и «h»: клавиши никогда не улавливаются функцией «keyboardEventOccurred», и они приобретаются с помощью IDE, который я использовал для запуска программа. Я также пытался изменить клавиши для нажатия, но ничего не изменилось. Я запускаю программу на ** OS X El Capitan **, возможно, это проблема с OS X. В любом случае, спасибо за помощь. – Mauro

+0

Я сообщил об этой проблеме на официальном трекере ошибок: https://github.com/PointCloudLibrary/pcl/issues/1465 –

Смежные вопросы