SWIG Python C ++输出数组给出了未知类型'错误

时间:2016-09-14 13:32:42

标签: python c++ numpy swig

我正在尝试使用swig来包装一些c ++代码以将numpy数组传递回python。我正在按照我在网上看到的一些使用numpy.i的例子。这是我的代码的样子。

我在我的类头文件中使用它作为函数定义:

bool grabFrame(int buf_size, unsigned char *buf);

在我的界面文件中,我有:

/* File : OV4682Interface.i */
%module OV4682Interface
%include "std_string.i"

%{
    #define SWIG_FILE_WITH_INIT
    #include "OV4682FrameGrabber.h"
%}

%include "numpy.i"
%init %{
    import_array();
%}

%apply (int DIM1, unsigned char* ARGOUT_ARRAY1) {(int buf_size, unsigned char *buf)};

%include "../inc/OV4682FrameGrabber.h"

我的Python代码如下所示:

import numpy as np
import OV4682Interface as ov

width = 672
height = 380
buf_size = width*height*2

buf = np.zeros(buf_size, dtype=np.uint8)

grab = ov.OV4682FrameGrabber()
grab.grabFrame(buf)

当我运行时,我收到以下错误:

追踪(最近一次通话):   File" OV4682FrameGrabberTest.py",第44行,in     grab.grabFrame(BUF)   文件" /home/ubuntu/rgb_ir_frame_grabber/build/lib/OV4682Interface.py" ;,第117行,在grabFrame中     def grabFrame(self,* args):return _OV4682Interface.OV4682FrameGrabber_grabFrame(self,* args) TypeError:期望的int维度。 '未知类型'给出。

由于某种原因,我收到一个错误,说传入的数组的类型是未知的,但是我已经明确地将dtype设置为np.uint8。我想知道是否有人可以指出我在这里做错了什么,因为我有点难过。

1 个答案:

答案 0 :(得分:0)

看起来我对这篇文章(SWIG+c+Python: Passing and receiving c arrays)的答案看起来不够仔细。我没注意到swig将输出数组添加到返回列表中,只是希望传入数组的大小。

我将方法定义更改为:

void grabFrame(int buf_size, unsigned char *buf);

我改变了python调用:

buf = grab.grabFrame(np.shape(buf)[0])

现在可以工作并返回我想要的数据数组。