法一: https://blog.csdn.net/jaych/article/details/5103008
这篇文章主要介绍如何通过vs2012配置opencv,然后再具体修改调试opencv的代码。
1、配置opencv工程项目
这里主要是介绍如何通过vs2012编译源代码,具体步骤可以参考:
【OpenCV入门教程之七】 玩转OpenCV源代码:生成OpenCV工程解决方案与OpenCV源码编译
因为我用的vs版本是vs2012,对应于VC11,在编译的过程中,如果出现以下类似的问题,可以参考一下:
1)CMake提示无法找到vs12
具体现象是在CMake gui 界面,点击configure时,出现如下提示:
CMake Error: CMake was unable to find a build program corresponding to “Visual Studio 12”. CMAKE_MAKE_PROGRAM is not set. You probably need to select a different build tool.
解决方法:这是因为在CMake中把vs2012认为是vc11了, 这时我们在配置时,在弹出的窗口中(如下图所示),选择vs2011。
具体可参考:
http://public.kitware.com/Bug/print_bug_page.php?bug_id=14629
2)编译的过程中,报错,提示没有找到ippicv_windows_20141027
在CMake配置的时候,下载文件过程中,出现:
CMake Error at 3rdparty/ippicv/downloader.cmake:97 (message):
ICV: Failed to unpack ICV package from D:/Program Files/opencv/sources/3rdparty/ippicv/downloads/windowsb59f865d1ba16e8c84124e19d78eec57/ippicv_windows_20141027.zip
to D:/Program Files/opencv/sources/3rdparty/ippicv/unpack with error 1Call Stack (most recent call first):
3rdparty/ippicv/downloader.cmake:108 (_icv_downloader)
cmake/OpenCVFindIPP.cmake:212 (include)
cmake/OpenCVFindLibsPerf.cmake:12 (include)
CMakeLists.txt:454 (include)
这时我们可以下载这个文件:ippicv_windows_20141027.zip
替换到:
..\OpenCV\V300\sources\3rdparty\ippicv\downloads\windows-b59f865d1ba16e8c84124e19d78eec57\ 路径里的对应文件就可以了。
先停止configure,复制文件到路径覆盖未下载完全的文件,再点击configure。
2、如何调试opencv
在上述提及的教程里,我们已经配置好了opencv源代码工程文件。
现在我们打开对应的工程文件。选中我们要调试的那个dll。因为opencv比较庞大,所以按照功能分成了不同的dll。
这里看看怎么通过自己编写的例子来调试opencv的代码。主要目的是为了学习opencv里面优秀的设计,发现现在opencv都用了比较快速的方法,比如SSE,NEON等优化技术,熟悉代码就变得很有用处。
首先,我们写个简单的项目工程。主要用resize的函数。
Mat img= imread("d:\\lena.jpg");
resize(img,img,Size(img.cols/2,img.rows/2));
1
2
然后,打开opencv工程文件,找到对应的imgwarp.cpp,resize函数在这个文件中。这里应该是在opencv_imgproc下的。
对opencv_imgproc,右击,选择属性,弹出如下对话框。在对应的配置属性->调试选项中,修改命令为我们刚刚写好的opencvBase工程目录下debug文件的exe文件。调试器类型修改为混合。表示调试该dll时,选择用我们选好的exe程序调用。
之后在opencv_imgproc项目上右击,将其设置为启动项目。
为了更好的观察是否进到了opencv代码里面,在imgwarp.cpp中,找到resize函数,设置断点。并且开始进行调试。
可以看到,这是已经进入到了resize函数当中。
那现在又有个问题,当前的设置并不能让我们修改opencv的代码并调试,只能进行断点跟踪。
假设我们想要修改opencv的代码并调试应该怎样进行?
3、修改并调试opencv源码
这里我们需要把opencv工程生成的dll复制到我们需要的系统路径下。
在一开始配置的时候,我们给opencv配置了环境变量,使得能够在对应的环境变量路径下找到dll文件。而为了调试我们生成的dll,只需要将这些工程所生成的dll文件复制到对应的环境变量路径中。也可以在生成dll的时候,直接配置生成的地址为对应的opencv\build\x86\vc11\bin
在这里,我配置的是:
D:\opencv3.0\build\x86\vc11\bin,为了更加方便,直接设置opencv_imgproc的输出目录为D:\opencv3.0\build\x86\vc11\bin,
在resize中,添加打印语句:
然后生成解决方案。
在opencvBase工程或者opencv源代码工程中,重新编译运行。都可以看到:
法二:https://blog.csdn.net/roslei/article/details/78637031
关于在vs中查看opencv的源码,一直是我想实现的,
可是看网上搜怎么看opencv源码,就仅仅一个版本 ,cmake编译源码,然后打开opencv.sln,搜索你要看的函数名称,,或者不打开open.sln,仅仅打开某个功能的.sln,,在modules文件夹下任意模块的中的sln,也可以,这个会快点嘛,,可是可是可是
一般想看源码的情况 大部分都是在自己的opencv程序,debug调试当中,f12进入函数定义,直接想跳入opencv的源码,这才叫真正的看源码吧,
今天在overflow搜了好多,加上自己的尝试,ok了,
1,cmake编译opencv源码,然后打开oepncv.sln,debug,release下都build一遍,这是会出现bin文件,lib文件,以及install文件:
bin文件你会发现有了dll,还有pdb文件,一一对应,lib文件同样也多了exp文件;
而install文件你会发现和一键安装opencv时生成的文件一样, 有lib include bin;
我之前配置文件时时选择install内的lib bin路径, 但是今天看完国外的一些建议后,说 pdb文件是很重要的,它是调试符号文件,包含了源码的路径细节,所以我又重新配置的opencv的各个路径,但是bin下的符号文件怎么添加到vs中呢,,在 工具-》选项-》调试下,常规栏目中 勾选 启用原服务器支持,它下面的也勾选,,然后调试下面的 符号 勾选Microsoft符号服务器。
以上是按stack overflow上的做法,但是程序你生成ok后,debug运行,这是你要看输出窗口,依然还是显示
。。
已加载“D:\\opencv_imgproc249d.dll”。已加载符号。无法查找或打开 PDB 文件。
。。
system2的pbd显示ok, opencv的找不到,,,所以在你单步执行时,遇到opencv自带的函数,F11进入,你仍然进入的是.h头文件,而不是相应的cpp
分割线
ok,下面的方向就是彻底能看到调试时源码了,
2、既然vs还是提示看不到opencv的pdb文件,那还是在工具-》选项-》调试-》符号,没有正确配置,
首先我尝试的是在Microsoft符号服务器下右上角有个添加,我输入opencv_calib3d249d.pdb,然后运行,看输出窗口还是提示说 无法查找或打开 PDB 文件,,又发现右上角是文件夹的新建,ok,我把debug的pdb路径输入,D:\opencv2492\opencv\build20170706gai\bin\Debug,,在运行程序加断点,完美,输出窗口
。。
已加载“D:\opencv2492\opencv\build20170706gai\install\bin\opencv_imgproc249d.dll”。已加载符号。
。。
在opencv自带函数处加断点,F11,哇,cvLoadImage(), 调到opencv的src文件内的d:\opencv249\opencv\sources\modules\highgui\src\loadsave.cpp,,可以看到oepncv自带函数的实现了,点云库PCL想看源码,也一样
但有个不太好,之前常用F12进入函数定义,程序运行不运行都可以调到cpp定义,在这是不行的,必须程序是在运行状态下,debug下,F11单步执行才可以进入opencv源码的cpp
补充:
1,cmake release也生成了pdb文件,那release下也可以应该看到源码的
2,把opencv源码路径也要加上,忘说了,在配置属性 -》vc++目录-》源目录,D:\opencv2492\opencv\sources\modules
3、调试看源码应该不止这一种方式,看overflow,,静态lib??,,待尝试
说明:
法一中,在引用项目.exe时总会出现访问被拒绝,不清楚原因。
主要是在OPENCV debug命令行中输入运行工程的.exe路径,然后选择混合编译。最后
将输出的动态库输入到系统目录中,即可修改opencv源代码,实现断点调试。
法二、主要是在项目工程中加入.pdb文件,将opencv源代码输入到工程目录,则可以进行断点调试,但只能在运行过程中F11进入断点调试。