Debug OpenCV
这篇文章简要介绍了如何在Linux环境下搭建OpenCV的Debug环境。完成后,您就可以在Eclipse中单步调试程序,查看变量数值、跟踪代码流转细节。
OpenCV是一款开源计算机视觉库。诞生于Intel公司的研究中心,成熟于Intel俄罗斯软件团队[1]。它可以应用在摄像机标定、深度信息感知、模式识别、机器学习等领域。OpenCV采用C/C++来实现,可以在不同的平台下运行(包括Android与iOS),是学习图像处理,机器视觉不可多得的优秀样本。
这篇文章简要介绍了如何在Linux环境下搭建OpenCV的Debug环境。完成后,您就可以在Eclipse中单步调试程序,查看变量数值、跟踪代码流转细节。
所有工作会分两部分:
- 编译OpenCV的Debug静态库;
- 在Eclipse项目中正确配置编译与链接参数。
*准备工作*
OpenCV的Debug是在如下环境下实现的,供您参考。
* 操作系统:Ubuntu 16.04
* OpenCV: 3.1.0
* gcc: 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.2)
* cmake: 3.5.1
* Eclipse IDE for C/C++ Developers: Neon Release (4.6.0)
编译OpenCV (Debug)
OpenCV的官方编译教程详细描述了OpenCV的编译过程[2]。按照该过程编译完成的OpenCV库文件是动态链接库文件,带有.so
后缀名。我们需要的是静态库文件,后缀名为.a
,并且属于Debug
类型。为此需要在cmake做如下配置。
配置编译类型为Debug
将CMAKE_BUILD_TYPE
与CMAKE_CONFIGURATION_TYPES
的值都改为Debug
。
配置库文件为静态库
确认BUILD_SHARED_LIBS
没有选中。
配置编译各模块为独立库文件
确认BUILD_opencv_world
没有选中。
完成以上配置后,即可按照OpenCV的官方教程完成OpenCV的编译。最终得到的库文件如下图所示。
至此我们得到了可用的OpenCV debug版静态库文件,接下来我们将在eclipse下新建工程,调用这些库文件。
在Eclipse项目中引用库文件
OpenCV的这篇官方教程中提供了在Eclipse下建立工程的方法[2:1]。该方法适用于引用shared Libraries
,也就是官方默认的编译选项所编译得到的库文件。由于我们需要引用Debug版本的静态库文件,因此需要修改Eclipse项目里的编译配置。
获取正确的配置信息
OpenCV的默认安装路径是/usr/local/lib
。如果你没有更改过的话,你会在这个路径下找到一个pkgconfig
文件夹,其中有一份名为opencv.pc
文件。
打开该文件,会发现如下内容:
# Package Information for pkg-config
prefix=/usr/local
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir_old=${prefix}/include/opencv
includedir_new=${prefix}/include
Name: OpenCV
Description: Open Source Computer Vision Library
Version: 3.1.0
Libs: -L${exec_prefix}/lib -lopencv_shape -lopencv_stitching -lopencv_objdetect -lopencv_superres -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_ml -lopencv_imgproc -lopencv_flann -lopencv_core
Libs.private: -L${exec_prefix}/share/OpenCV/3rdparty/lib -llibwebp -lIlmImf -lippicv -L/usr/lib/x86_64-linux-gnu -lpng -lz -ltiff -ljasper -ljpeg -lgtk-3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lgthread-2.0 -lglib-2.0 -ldc1394 -lavcodec-ffmpeg -lavformat-ffmpeg -lavutil-ffmpeg -lswscale-ffmpeg -lstdc++ -ldl -lm -lpthread -lrt
Cflags: -I${includedir_old} -I${includedir_new}
这份文件基本上告诉了我们所有必要的编译选项。只需按照该文件描述,在Eclipse工程中修改编译选项即可。
修改Eclipse项目编译配置
依次点击 Project > Properties > C/C++ Build > Settings > Tool settings
,打开配置窗口。
GCC C++ Compiler
在includes
选项中添加以下两个路径:
/usr/local/include
/usr/local/include/opencv
GCC C++ Linker
在Library search path(-L)
下添加以下路径:
/usr/local/lib
/usr/local/share/OpenCV/3rdparty/lib
/usr/lib/x86_64-linux-gnu
如果你安装OpenCV时采用了不同的路径,对应修改即可。
除了搜索路径,我们还需要添加对应的库文件到Libraries(-l)
下。这些文件已经在上文的opencv.pc
中列出,这里为方便起见,再次列出如下。
首先是OpenCV的模块:
opencv_shape;opencv_stitching;opencv_objdetect;opencv_superres;opencv_videostab;opencv_calib3d;opencv_features2d;opencv_highgui;opencv_videoio;opencv_imgcodecs;opencv_video;opencv_photo;opencv_ml;opencv_imgproc;opencv_flann;opencv_core
以及系统和第三方库:
libwebp;IlmImf;ippicv;png;z;tiff;jasper;jpeg;gtk-3;gdk-3;pangocairo-1.0;pango-1.0;atk-1.0;cairo-gobject;cairo;gdk_pixbuf-2.0;gio-2.0;gobject-2.0;gthread-2.0;glib-2.0;dc1394;avcodec-ffmpeg;avformat-ffmpeg;avutil-ffmpeg;swscale-ffmpeg;stdc++;dl;m;pthread;rt
请留意这些库文件的加载顺序,错误的顺序有可能会导致编译报错。
应用变更后的配置,此时项目应该可以顺利编译完成。
OK,以上两步完成后,你就可以尝试启用Debug模式,在调用OpenCV函数的时候Step in到OpenCV函数内部了。现在可以领略OpenCV源码的魅力所在了~
致谢
本文的完成离不开刘兴东的杰出工作。
Reference
《学习OpenCV》,清华大学出版社,于仕琪等 ↩︎
http://docs.opencv.org/3.1.0/d7/d16/tutorial_linux_eclipse.html ↩︎ ↩︎
Comments ()