<p>我现在已经解决了这个问题,下面是一些小问题的解决方案(见下文)</p>
<P>假设你有这样的C++代码:</p>
<pre><code>#include <opencv/cv.h>
#include <opencv/highgui.h>
using namespace cv;
...
Mat img = imread("1.jpg", CV_LOAD_IMAGE_GRAYSCALE);
...
</code></pre>
<p>在GDB下调试这些代码时,我想看看内存中的数据“img”是什么样子的。多亏了GDB和OpenCV,它们都有Python接口,下面是Python漂亮的脚本(我在GPLv3下发布了脚本代码)</p>
<p>在此之前,你需要
1、启用python的GDB
2、OpenCV python接口(在Windows下,是一个文件cv2.pyd)
3、安装python,numpy</p>
^{pr2}$
<p>上面的脚本添加了一个新的GDB命令“plot”,以显示内存中的数据cv::Mat。
现在,你只需输入:“sourcecvplot.py要将此脚本加载到GDB,然后键入:“plot img”在OpenCV的窗口中显示cv::Mat,要让GDB继续,只需关闭调试器窗口。在</p>
<p>顺便说一句:我发现了一个问题,如果我在脚本源代码中取消了“#print v”的注释,那么这个脚本将抱怨这样的消息并中止:</p>
^{3}$
<p>但是如果我直接在GDB的命令行中运行命令“print img”,它会显示:</p>
<pre><code>$2 = {flags = 1124024320, dims = 2, rows = 243, cols = 322, data = 0xb85020 "\370\362èèé?èè?èé?è?è?èèèèèèè\372\357èèèèèèèèèèèèèèè?è?èèèè???èè?èéèèè?èè??èèèéèééèèèèèèèèèèèèèèèè?è?èèèèèèè?èèè?è"..., refcount = 0xb981c8, datastart = 0xb85020 "\370\362èèé?èè?èé?è?è?èèèèèèè\372\357èèèèèèèèèèèèèèè?è?èèèè???èè?èéèèè?èè??èèèéèééèèèèèèèèèèèèèèèè?è?èèèèèèè?èèè?è"..., dataend = 0xb981c6 "\255\272\001", datalimit = 0xb981c6 "\255\272\001", allocator = 0x0, size = {p = 0x22fe64}, step = {p = 0x22fe8c, buf = {322, 1}}}
</code></pre>
<p>我不确定如何解决这个问题,但我可以肯定地看到python试图将原始缓冲区解码为普通文本是有问题的。(我正在使用WinXP)</p>
<p>非常感谢Tromey,Andre峎,Pmuldoon对GDB IRC的热情帮助,也感谢Hui Ning的大力帮助和建议,解决方案也在GDB maillist <a href="https://sourceware.org/ml/gdb/2013-04/msg00104.html" rel="nofollow">Post in GDB maillist</a>上发布,同时我也愿意将此贡献给OpenCV社区<a href="http://answers.opencv.org/question/25092/visualize-in-memory-opencv-image-or-matrix-from/" rel="nofollow">Visualize in memory OpenCV image or matrix from GDB pretty printers</a></p>