在调试 C++ OpenCV 程序时,我想在 GDB 下的程序中看到一个图像,我的意思是我想在 GDB 下可视化数据。幸运的是我有:
- 支持 python 的 GDB;
- 我已经安装了python 2.7.4、numpy库和opencv正式版2.4.4;
- 我已将 python 接口文件“cv2.pyd”安装到我的 python 站点包文件夹中。
现在,我可以运行一个纯 python 脚本来加载和显示图像。但是当我尝试显示来自 GDB 的图像时,我的问题就出现了。(图像在我的 C++ 程序中)
#include <opencv/cv.h>
#include <opencv/highgui.h>
using namespace cv;
...
Mat orgImg = imread("1.jpg", CV_LOAD_IMAGE_GRAYSCALE);
然后我设置了一个断点,然后 GDB 命中断点,我在 GDB 的命令行中运行这样的命令
source test.py
test.py 是一个尝试显示图像的 python 脚本:
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()
之后,我只运行命令
plot orgImg
但是 GDB 得到一个错误:
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
你看,GDB下的python对象是"cv::Mat",但是它不能转换成正确的python对象来显示。任何人都可以帮助我吗?谢谢。
编辑: 我尝试创建一个使用 cv(不是 cv2)的更简单的脚本,但它仍然不起作用:
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()
上面的代码不起作用,因为语句“cv.SetData(a, v['data'])”并没有真正进行缓冲区地址分配。
“v”是 cv::Mat 的表示形式,其内容如下:
{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}}}
因此,您看到“数据”字段是原始缓冲区指针,但我不确定如何将此 gdb.Value 传输到 python 缓冲区类型。