调试c++程序时出现GDB cv::Mat python对象问题

2024-10-04 07:30:18 发布

您现在位置:Python中文网/ 问答频道 /正文

<>在调试C++ OpenCV程序时,我想在GDB下面看到我的程序中的一个图像,我想在GDB下可视化数据。幸运的是我有:

  1. 支持python的GDB
  2. 我已经安装了python2.7.4、numpy库和opencv官方版本2.4.4
  3. 我已经将python接口文件“cv2.pyd”安装到python的site packages文件夹中。在

现在,我可以运行一个纯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的命令行中运行这样的命令

^{pr2}$

在测试.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}}}

所以,您可以看到“data”字段是原始缓冲区指针,但我不确定如何传输它gdb.价值到python缓冲区类型。在


Tags: 图像importselfdatainitdeftypearg
2条回答

我现在已经解决了这个问题,下面是一些小问题的解决方案(见下文)

假设你有这样的C++代码:

#include <opencv/cv.h>
#include <opencv/highgui.h>
using namespace cv; 
...
Mat img = imread("1.jpg", CV_LOAD_IMAGE_GRAYSCALE);
...

在GDB下调试这些代码时,我想看看内存中的数据“img”是什么样子的。多亏了GDB和OpenCV,它们都有Python接口,下面是Python漂亮的脚本(我在GPLv3下发布了脚本代码)

在此之前,你需要 1、启用python的GDB 2、OpenCV python接口(在Windows下,是一个文件cv2.pyd) 3、安装python,numpy

^{pr2}$

上面的脚本添加了一个新的GDB命令“plot”,以显示内存中的数据cv::Mat。 现在,你只需输入:“sourcecvplot.py要将此脚本加载到GDB,然后键入:“plot img”在OpenCV的窗口中显示cv::Mat,要让GDB继续,只需关闭调试器窗口。在

顺便说一句:我发现了一个问题,如果我在脚本源代码中取消了“#print v”的注释,那么这个脚本将抱怨这样的消息并中止:

^{3}$

但是如果我直接在GDB的命令行中运行命令“print img”,它会显示:

$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}}}

我不确定如何解决这个问题,但我可以肯定地看到python试图将原始缓冲区解码为普通文本是有问题的。(我正在使用WinXP)

非常感谢Tromey,Andre峎,Pmuldoon对GDB IRC的热情帮助,也感谢Hui Ning的大力帮助和建议,解决方案也在GDB maillist Post in GDB maillist上发布,同时我也愿意将此贡献给OpenCV社区Visualize in memory OpenCV image or matrix from GDB pretty printers

你需要劣质。读取内存将pixmap内容从调试程序传输到gdb进程。也许可以看看Qt Creator实现,它有一个类似的特性来显示QImage数据。在

相关问题 更多 >