在信号以及图像处理领域,小波变换非常常用,但是大多数的小波变换和重构相关开源代码都是 Python 库,C++ 版本的资源显得尤为珍贵,这里笔者找到了一个还比较不错的小波变换和冲重构的 C++ 库:C++ Wavelet Libraries
在该库中,开发者给出了动态链接库、静态链接库以及相关的源代码,这里我更喜欢把开发者的源代码集成到我的工程中使用。在该库中,用到了另一个第三方动态链接库fftw3
,所以这里还需要安装一下,安装 fftw3 库:
sudo apt-get install fftw3 fftw3-dev pkg-config
安装之后,还需要把它配置到自己的工程,否则会报错:
[ 90%] Built target xmate_control_generate_messages
[ 91%] Built target rpy_admittance_controll
[ 92%] Built target xmate_state_controller
[ 94%] Built target xmate_ros_controllers
[ 94%] Built target robot_ptp
[ 95%] Built target xmate_control_node
CMakeFiles/wavedemo1.dir/src/wavelib/wavelet2s.cpp.o:在函数‘convfft(std::vector<double, std::allocator<double> >&, std::vector<double, std::allocator<double> >&, std::vector<double, std::allocator<double> >&)’中:
wavelet2s.cpp:(.text+0x4ea8):对‘fftw_malloc’未定义的引用
wavelet2s.cpp:(.text+0x4eb3):对‘fftw_malloc’未定义的引用
wavelet2s.cpp:(.text+0x4ebe):对‘fftw_malloc’未定义的引用
wavelet2s.cpp:(.text+0x4ec9):对‘fftw_malloc’未定义的引用
wavelet2s.cpp:(.text+0x4ed5):对‘fftw_malloc’未定义的引用
CMakeFiles/wavedemo1.dir/src/wavelib/wavelet2s.cpp.o:wavelet2s.cpp:(.text+0x4ee2): 跟着更多未定义的参考到 fftw_malloc
CMakeFiles/wavedemo1.dir/src/wavelib/wavelet2s.cpp.o:在函数‘convfft(std::vector<double, std::allocator<double> >&, std::vector<double, std::allocator<double> >&, std::vector<double, std::allocator<double> >&)’中:
wavelet2s.cpp:(.text+0x4efe):对‘fftw_plan_dft_1d’未定义的引用
wavelet2s.cpp:(.text+0x4f1d):对‘fftw_plan_dft_1d’未定义的引用
wavelet2s.cpp:(.text+0x4f3d):对‘fftw_plan_dft_1d’未定义的引用
wavelet2s.cpp:(.text+0x4ffa):对‘fftw_execute’未定义的引用
wavelet2s.cpp:(.text+0x5004):对‘fftw_execute’未定义的引用
wavelet2s.cpp:(.text+0x5082):对‘fftw_execute’未定义的引用
wavelet2s.cpp:(.text+0x5111):对‘fftw_free’未定义的引用
wavelet2s.cpp:(.text+0x5119):对‘fftw_free’未定义的引用
wavelet2s.cpp:(.text+0x5121):对‘fftw_free’未定义的引用
wavelet2s.cpp:(.text+0x512a):对‘fftw_free’未定义的引用
wavelet2s.cpp:(.text+0x5134):对‘fftw_free’未定义的引用
CMakeFiles/wavedemo1.dir/src/wavelib/wavelet2s.cpp.o:wavelet2s.cpp:(.text+0x513c): 跟着更多未定义的参考到 fftw_free
CMakeFiles/wavedemo1.dir/src/wavelib/wavelet2s.cpp.o:在函数‘convfft(std::vector<double, std::allocator<double> >&, std::vector<double, std::allocator<double> >&, std::vector<double, std::allocator<double> >&)’中:
wavelet2s.cpp:(.text+0x5146):对‘fftw_destroy_plan’未定义的引用
wavelet2s.cpp:(.text+0x5150):对‘fftw_destroy_plan’未定义的引用
wavelet2s.cpp:(.text+0x515a):对‘fftw_destroy_plan’未定义的引用
wavelet2s.cpp:(.text+0x518e):对‘fftw_execute’未定义的引用
wavelet2s.cpp:(.text+0x5198):对‘fftw_execute’未定义的引用
wavelet2s.cpp:(.text+0x51a2):对‘fftw_execute’未定义的引用
CMakeFiles/wavedemo1.dir/src/wavelib/wavelet2s.cpp.o:在函数‘convfftm(std::vector<double, std::allocator<double> >&, std::vector<double, std::allocator<double> >&, std::vector<double, std::allocator<double> >&)’中:
wavelet2s.cpp:(.text+0x5208):对‘fftw_malloc’未定义的引用
wavelet2s.cpp:(.text+0x5213):对‘fftw_malloc’未定义的引用
wavelet2s.cpp:(.text+0x521e):对‘fftw_malloc’未定义的引用
wavelet2s.cpp:(.text+0x5229):对‘fftw_malloc’未定义的引用
wavelet2s.cpp:(.text+0x5236):对‘fftw_malloc’未定义的引用
CMakeFiles/wavedemo1.dir/src/wavelib/wavelet2s.cpp.o:wavelet2s.cpp:(.text+0x5243): 跟着更多未定义的参考到 fftw_malloc
CMakeFiles/wavedemo1.dir/src/wavelib/wavelet2s.cpp.o:在函数‘convfftm(std::vector<double, std::allocator<double> >&, std::vector<double, std::allocator<double> >&, std::vector<double, std::allocator<double> >&)’中:
wavelet2s.cpp:(.text+0x5283):对‘fftw_plan_dft_1d’未定义的引用
wavelet2s.cpp:(.text+0x52a2):对‘fftw_plan_dft_1d’未定义的引用
wavelet2s.cpp:(.text+0x52c1):对‘fftw_plan_dft_1d’未定义的引用
wavelet2s.cpp:(.text+0x5393):对‘fftw_execute_dft’未定义的引用
wavelet2s.cpp:(.text+0x53a7):对‘fftw_execute_dft’未定义的引用
wavelet2s.cpp:(.text+0x5434):对‘fftw_execute_dft’未定义的引用
wavelet2s.cpp:(.text+0x54c1):对‘fftw_free’未定义的引用
wavelet2s.cpp:(.text+0x54c9):对‘fftw_free’未定义的引用
wavelet2s.cpp:(.text+0x54d1):对‘fftw_free’未定义的引用
wavelet2s.cpp:(.text+0x54db):对‘fftw_free’未定义的引用
wavelet2s.cpp:(.text+0x54e5):对‘fftw_free’未定义的引用
CMakeFiles/wavedemo1.dir/src/wavelib/wavelet2s.cpp.o:wavelet2s.cpp:(.text+0x54ed): 跟着更多未定义的参考到 fftw_free
CMakeFiles/wavedemo1.dir/src/wavelib/wavelet2s.cpp.o:在函数‘convfftm(std::vector<double, std::allocator<double> >&, std::vector<double, std::allocator<double> >&, std::vector<double, std::allocator<double> >&)’中:
wavelet2s.cpp:(.text+0x5528):对‘fftw_destroy_plan’未定义的引用
wavelet2s.cpp:(.text+0x5534):对‘fftw_destroy_plan’未定义的引用
wavelet2s.cpp:(.text+0x5540):对‘fftw_destroy_plan’未定义的引用
wavelet2s.cpp:(.text+0x555f):对‘fftw_execute_dft’未定义的引用
wavelet2s.cpp:(.text+0x5573):对‘fftw_execute_dft’未定义的引用
wavelet2s.cpp:(.text+0x5587):对‘fftw_execute_dft’未定义的引用
collect2: error: ld returned 1 exit status
xmate7p_demo/CMakeFiles/wavedemo1.dir/build.make:148: recipe for target '/home/hjs/xMate7p_ros/devel/lib/xmate7p_demo/wavedemo1' failed
make[2]: *** [/home/hjs/xMate7p_ros/devel/lib/xmate7p_demo/wavedemo1] Error 1
CMakeFiles/Makefile2:5019: recipe for target 'xmate7p_demo/CMakeFiles/wavedemo1.dir/all' failed
make[1]: *** [xmate7p_demo/CMakeFiles/wavedemo1.dir/all] Error 2
make[1]: *** 正在等待未完成的任务....
[ 96%] Built target excit_traj_s_planner
[ 97%] Built target cartesian_pose_rtcmd_test
[ 98%] Built target xyz_rpy_admittance_control_ros_node
[ 98%] Built target force_tracking_ros
Makefile:140: recipe for target 'all' failed
make: *** [all] Error 2
Invoking "make -j12 -l12" failed
在 CMakeLists.txt 中,添加依赖库 libfftw3.so
:
set(xmate_LIBRARIES
RCI_Client.a
xMateModel.a
orocos-kdl.a
glog.a
libfftw3.so
)