项目问题处理(Cmake接触):
初次接触3D视觉,想先体验下效果,但没找到能简单入手的,在github下看到下面这个项目,打算体验下.
项目链接:https://github.com/windz0629/coffeeCup
这个项目初次测试真的会遇到很多问题,但是官方教程给的也很详细了,部分问题谷歌都能解决,剩下的得靠经验了.这里记录最后几步遇到的问题.
Cmakelist.txt文件内需要改写如下,请根据自己的情况改写,:
基本上会遇到的问题就是 make 会爆出undefined reference to "XX"的问题,部分是因为对应的 .so文件没有链接好.这里需要将对应的 XX_LIBRARIES 与对应的.so文件链接.
格式如:下
set(freenect2_LIBRARIES "/home/meroke/Develop_Tool/libfreenect2/build/lib/libfreenect2.so")
这里需要链接的库只有三个,pcl,freenect2,hdf5.
使用apt install XX的,该库的.so文件一般在/usr/lib/
源码编译安装的,.so文件在/usr/local/lib/或者/usr/local/XX/lib
Cmakelist.txt:
cmake_minimum_required(VERSION 2.8)
project(coffeeCup)
set(CMAKE_CXX_FLAGS "-std=c++11 -fPIC ${CMAKE_CXX_FLAGS}")
#set(CMAKE_CXX_FLAGS "-std=c++14 -fPIC ${CMAKE_CXX_FLAGS}")
set(CMAKE_AUTOMOC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} /opt/freenect2/)
#find_package(PCL 1.8 REQUIRED PATHS /usr/include NO_DEFAULT_PATH)
find_package(PCL 1.12 REQUIRED )
include_directories("/usr/local/include/pcl-1.12")
#link_directories(${PCL_LIBRARY_DIRS})
link_directories("/usr/local/lib/libpcl_common.so" "/usr/local/lib/libpcl_io.so" "/usr/local/lib/libpcl_visualization.so")
find_package(freenect2 REQUIRED)
#find_package(OpenCV REQUIRED PATHS /usr/local NO_DEFAULT_PATH)
find_package(OpenCV REQUIRED )
include_directories(${OpenCV_INCLUDE_DIRS})
set( OpenCV_FOUND 1 )
#include_directories(${PCL_INCLUDE_DIRS})
include_directories(${freenect2_INCLUDE_DIR})
link_directories("/opt/freenect2/lib/")
set(freenect2_LIBRARIES "/home/meroke/Develop_Tool/libfreenect2/build/lib/libfreenect2.so")
find_package(HDF5)
set(HDF5_INCLUDE_DIR "/usr/local/hdf5/include/")
set(HDF5_hdf5_LIBRARY "/usr/local/hdf5/lib/libhdf5.so") # 解决有关hdf5的未引用报错
if(HDF5_FOUND)
find_package(FLANN)
include_directories(${FLANN_INCLUDE_DIRS})
include_directories(${HDF5_INCLUDE_DIR})
add_executable(realtime_recognize_demo realtime_recognize_demo.cpp kinect2grabber.cpp)
target_link_libraries(realtime_recognize_demo ${PCL_LIBRARIES} ${Boost_LIBRARIES} ${OpenCV_LIBRARIES} ${freenect2_LIBRARIES}
${FLANN_LIBRARIES} ${HDF5_hdf5_LIBRARY})
add_executable(get_training_samples get_training_samples.cpp kinect2grabber.cpp)
target_link_libraries(get_training_samples ${PCL_LIBRARIES} ${Boost_LIBRARIES} ${OpenCV_LIBRARIES} ${freenect2_LIBRARIES})
add_executable(scene_test scene_test.cpp)
target_link_libraries(scene_test ${PCL_LIBRARIES} ${Boost_LIBRARIES})
add_executable(prepare_data prepare_data.cpp)
target_link_libraries(prepare_data ${PCL_LIBRARIES} ${Boost_LIBRARIES})
add_executable(build_tree build_tree.cpp)
target_link_libraries(build_tree ${PCL_LIBRARIES} ${Boost_LIBRARIES}
${FLANN_LIBRARIES} ${HDF5_hdf5_LIBRARY})
add_executable(nearest_neighbors nearest_neighbors.cpp)
target_link_libraries(nearest_neighbors ${PCL_LIBRARIES}
${Boost_LIBRARIES} ${FLANN_LIBRARIES} ${HDF5_hdf5_LIBRARY}
)
endif(HDF5_FOUND)
hdf5
也出现过未定义引用的情况,一般是cmake文件里路径没写好,加入下列解决.
set(HDF5_INCLUDE_DIR "/usr/local/hdf5/include/")
set(HDF5_hdf5_LIBRARY "/usr/local/hdf5/lib/libhdf5.so")
pcl
/home/meroke/Python_pro/coffeeCup/realtime_recognize_demo.cpp:498:52: error: no matching function for call to ‘getMinMax3D(const pointCloudPtr&, pointT&, pointT&)’
pcl::getMinMax3D(clusters_get,minP,maxP);
如上问题一般是头文件未包含,上述getMinMax3D()函数在/usr/local/include/pcl-1.12/pcl/common文件夹内,
头文件添加#include <pcl/common/common.h>即可
freenect2:
cmake .. -DENABLE_CXX11=ON -DCUDA_PROPAGATE_HOST_FLAGS=off -DCMAKE_INSTALL_PREFIX=$HOME/freenect2
其中-DCUDA_PROPAGATE_HOST_FLAGS=off ,这个指令会导致编译出错
libfreenect2/src/frame_listener_impl.cpp:112:25: error: ‘bind’ is not a member of ‘std’
auto predicate = std::bind(&SyncMultiFrameListenerImpl::hasNewFrame, impl_);
其原因是libfreenect2/src/frame_listener_impl.cpp内缺少 #include <functional> 头文件
C++源码问题:
部分文件会报错:boost::make_shared,将其替换成std:make_shared即可.
最终测试程序显示如下:
遗留问题:最开始运行还能识别出一个,隔了一天,居然全都识别不出来了。
打算之后重新制作数据集,再测试一遍.
补充一下关于ply/obj 转 pcd的方法:
例如: 01.PLY 转 output.pcd
pcl_mesh2pcd -leaf_size 0.1 01.PLY output.pcd