Debug OpenCV

OpenCV是一款开源计算机视觉库。诞生于Intel公司的研究中心,成熟于Intel俄罗斯软件团队1。它可以应用在摄像机标定、深度信息感知、模式识别、机器学习等领域。OpenCV采用C/C++来实现,可以在不同的平台下运行(包括Android与iOS),是学习图像处理,机器视觉不可多得的优秀样本。

这篇文章简要介绍了如何在Linux环境下搭建OpenCV的Debug环境。完成后,您就可以在Eclipse中单步调试程序,查看变量数值、跟踪代码流转细节。

所有工作会分两部分:

  1. 编译OpenCV的Debug静态库;
  2. 在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_TYPECMAKE_CONFIGURATION_TYPES的值都改为Debug

配置库文件为静态库

确认BUILD_SHARED_LIBS没有选中。

配置编译各模块为独立库文件

确认BUILD_opencv_world没有选中。

完成以上配置后,即可按照OpenCV的官方教程完成OpenCV的编译。最终得到的库文件如下图所示。

至此我们得到了可用的OpenCV debug版静态库文件,接下来我们将在eclipse下新建工程,调用这些库文件。


在Eclipse项目中引用库文件

OpenCV的这篇官方教程中提供了在Eclipse下建立工程的方法3。该方法适用于引用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