我试图使用boost / python.h来计算C ++中两个numpy数组的差异。
我的c代码看起来类似于:
#include <boost/python.hpp>
#include "boost/python/extract.hpp"
#include "boost/python/numeric.hpp"
using namespace boost::python;
void setArray(boost::python::numeric::array structure,
boost::python::numeric::array bct,
int size_x, int size_y,
boost::python::numeric::array data1, boost::python::numeric::array data2,
int data1_div, int data2_div, int neutral) {
for (int ix = 0; ix < size_x; ix++) {
for (int iy = 0; iy < size_y; iy++) {
boost::uint8_t d1 = extract<boost::uint8_t>(data1[iy][ix]);
boost::uint8_t d2 = extract<boost::uint8_t>(data2[iy][ix]);
boost::uint8_t x = d2/data1_div + neutral - d1/data2_div;
bct[x] += 1;
structure[iy][ix] = x;
}
}
}
BOOST_PYTHON_MODULE(img_diff) {
boost::python::numeric::array::set_module_and_type("numpy", "ndarray");
def("setArray", &setArray);
}
如何从python中使用它的一个例子是:
import numpy as np
import img_diff
h_stripe = 3
l_stripe = 7
data1_div = 17
data2_div = 17
neutral = 16
data1 = np.array(np.random.randint(0, 16, (h_stripe, l_stripe))*data1_div, dtype=np.int)
data2 = np.array(np.random.randint(0, 16, (h_stripe, l_stripe))*data2_div, dtype=np.int)
structure = np.zeros((h_stripe, l_stripe), np.uint8)
bct = np.zeros((32, ), np.uint)
img_diff.setArray(structure, bct, l_stripe, h_stripe, data1, data2, data1_div, data2_div, neutral)
只要data1和data2的dtype是numpy.int,这样就可以了。但是,由于内存问题,我必须使用numpy.uint8。使用uint8,我收到错误
TypeError: No registered converter was able to produce a C++ rvalue of type unsigned char from this Python object of type numpy.uint8
任何人都可以解释为什么它适用于int但不适用于uint8?另外,为什么可以使用uint8作为结构?
有一个好方法,如何解决这个问题?