前言
学习opencv有一段时间了,在调试自己编写的程序或是在调试别人的示例时,总是会遇到各种各样的异常,这些异常通常是调用opencv库函数引起的。引发这些异常的原因很多,通常是因为参数传递的不合适导致的。由于本人是个opencv新手,对很多库函数的理解尚有彻底。因此,如果能够在调试程序时,能够单步进入opencv的库函数源码进行调试时,一方面可以知道是哪个参数的不合理导致的程序异常;另一方面,也可以有机会从源码中学习一些好的变成习惯,思路,能够从本质上了解图像处理及机器学习算法的实现过程及原理。通过向高人请教,在网上搜索,通过多次尝试,现在终于可以实现单步进入opencv的库函数源码了。
使用的环境
opencv 2.4.9 可以通过此链接从我的百度网盘下载
vs2008
cmake3.4.0 可以通过此链接从我的百度网盘下载
具体步骤如下:
使用源码重新编译生产库
直接解压opencv2.4.9会生成两个文件夹:build和sources。build中存放的是预编译好的,针对vs2010以上的开发环境的库。但是根据网上资料介绍,使用build中预编译生成的dll,lib时,程序可以运行,但是不能够单步进入源码进行调试,原因是build文件夹下的dll,lib不包含pdb信息。(具体原因我不太清楚,因为我使用的是vs2008,因此,无法使用build中预编译好的库来进行源码调试)。因此,个人建议,无论使用的vs版本是否是vs2010以上还是以下,为了能够单步进入源码进行调试,最好重新编译一下源码。
两次configure,一次generate
使用opencv2.4.9来编译源码时,需要使用cmake进行两次configure,一次generate。具体使用cmake进行生成opencv解决方案的过程,网上有很多介绍,可以在网上搜索关键字“opencv cmake”,“使用cmake编译opencv”。
编译整个解决方案
当使用cmake生成vs的解决方案后,在输出目录生成如图所示的解决方案,OpenCV。在vs2008中打开此解决方案,编译整个解决方案。编辑过程大概要持续10到20分钟。一般情况下,解决方案中的所有项目都能顺利通过。
关键的步骤:编译INSTALL
编译完整个解决方案后,生成的bin目录下的库似乎不包含编译信息(也可能是我哪里设置有问题),后来在一篇博文中看到需要编译解决方案中的INSTALL工程,尝试着编译了一下,编译完INSTALL工程后,生成了install文件夹,入下图所示
install文件夹中的目录结构如下图所示,很像opencv的预编译好的库的目录结构(即opencv的build文件夹中的目录结构)
在vs2008中配置install文件夹中的库
在vs2008中配置opencv中的库(install文件夹下的库)分为两步:
1.菜单栏,工具--->选项--->项目与解决方案,vc++目录。分别配置“包含文件”,可以尝试配置三个路径(网上有些博客中介绍只需配置一个,具体是否可行,我并没有试过,可尝试一下): install所在路径\install\include ; install所在路径\install\include\opencv ;install所在路径\install\include\opencv2
入下图所示
配置“库文件” ,配置为 install所在路径\install\x86\vc9\lib,入下图所示
2.配置工程属性中的依赖项
首先创建一个使用opencv库开发的示例程序,然后,打开工程的属性页面
添加依赖项,具体要使用到的依赖项,针对debug和release,不同,具体设置可在网上搜索“opencv vs2008配置” , “配置opencv”等关键字
设置环境变量
将 install所在路径\install\x86\vc9\bin 添加到系统的环境变量path中,具体操作在网上搜索 "opencv配置",文章中都会介绍如何设置环境变量。配置完环境变量后,需要重启电脑,这样环境变量才能生效。
通过上述操作,便可以实现在调试使用opencv库的程序中,单步进入opencv的库函数进行调试了。
总结
通过这两天的折腾,发现,问题的真正原因在于要编译Opencv解决方案中的INSTALL项目,在配置vs2008的vc++目录中的“包含文件”,“库文件”,以及环境变量时,需要指定的是INSTALL项目生成的install文件夹中的include文件夹,lib文件夹,bin文件夹的路径,而不是入下图所示的include文件夹中的路径,和bin中的文件夹中debug中的库。虽然引用include和bin可以使程序正常运行,但是,无法单步对库函数进行调试。