我正在尝试使用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。我想知道是否有人可以指出我在这里做错了什么,因为我有点难过。
答案 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])
现在可以工作并返回我想要的数据数组。