回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<>在调试C++ OpenCV程序时,我想在GDB下面看到我的程序中的一个图像,我想在GDB下可视化数据。幸运的是我有:</p>
<ol>
<li>支持python的GDB</li>
<li>我已经安装了python2.7.4、numpy库和opencv官方版本2.4.4</li>
<li>我已经将python接口文件“cv2.pyd”安装到python的site packages文件夹中。在</li>
</ol>
<p>现在,我可以运行一个纯python脚本来加载和显示图像。但是当我试图显示来自GDB的图像时,我的问题就来了。(图像在我的C++程序中)</p>
<pre><code>#include <opencv/cv.h>
#include <opencv/highgui.h>
using namespace cv;
...
Mat orgImg = imread("1.jpg", CV_LOAD_IMAGE_GRAYSCALE);
</code></pre>
<p>然后我设置一个断点,然后GDB命中断点,我在GDB的命令行中运行这样的命令</p>
^{pr2}$
<p>在测试.py是一个尝试显示图像的python脚本:</p>
<pre><code>import gdb
import cv2
import numpy
class PlotterCommand(gdb.Command):
def __init__(self):
super(PlotterCommand, self).__init__("plot",
gdb.COMMAND_DATA,
gdb.COMPLETE_SYMBOL)
def invoke(self, arg, from_tty):
args = gdb.string_to_argv(arg)
v = gdb.parse_and_eval(args[0])
t = v.type.strip_typedefs()
print t
a = numpy.asarray(v)
cv2.namedWindow('debugger')
cv2.imshow('debugger',a)
cv2.waitKey(0)
PlotterCommand()
</code></pre>
<p>之后,我只运行命令</p>
<pre><code>plot orgImg
</code></pre>
<p>但是GDB得到一个错误:</p>
<pre><code>cv::Mat
Python Exception <type 'exceptions.TypeError'> mat data type = 17 is not supported:
Error occurred in Python command: mat data type = 17 is not supported
Error occurred in Python command: mat data type = 17 is not supported
</code></pre>
<p>你看,GDB下的python对象是“cv::Mat”,但是它不能转换成正确的python对象来显示。有人能帮我吗?谢谢。在</p>
<p><strong>编辑:</strong>
我尝试创建一个使用cv(而不是cv2)的更简单的脚本,但它仍然不起作用:</p>
<pre><code>import gdb
import cv2.cv as cv
class PlotterCommand(gdb.Command):
def __init__(self):
super(PlotterCommand, self).__init__("plot",
gdb.COMMAND_DATA,
gdb.COMPLETE_SYMBOL)
def invoke(self, arg, from_tty):
args = gdb.string_to_argv(arg)
v = gdb.parse_and_eval(args[0])
a = cv.CreateImageHeader((v['cols'],v['rows']), cv.IPL_DEPTH_8U, 1)
cv.SetData(a, v['data'])
cv.NamedWindow('debugger')
cv.ShowImage('debugger', a)
cv.WaitKey(0)
PlotterCommand()
</code></pre>
<p>上述代码不能作为语句使用”cv.SetData公司(a,v['data'])“并不真正执行缓冲区地址分配。在</p>
<p>“v”是cv::Mat的表示形式,其内容如下:</p>
<pre><code>{flags = 1124024320, dims = 2, rows = 44, cols = 37, data = 0x3ef2d0 '\377' <repeats 200 times>..., refcount = 0x3ef92c, datastart = 0x3ef2d0 '\377' <repeats 200 times>..., dataend = 0x3ef92c "\001", datalimit = 0x3ef92c "\001", allocator = 0x0, size = {p = 0x22fe10}, step = {p = 0x22fe38, buf = {37, 1}}}
</code></pre>
<p>所以,您可以看到“data”字段是原始缓冲区指针,但我不确定如何传输它gdb.价值到python缓冲区类型。在</p>