Я решил свою проблему, используя списки в качестве аргумента возврата C. Если вы list()
возвращаете значение, оно будет работать нормально:
a = np.array([[1.1,1.2],[2.1,2.2],[3.1,3.2],[4.1,4.2]]).reshape(8,1);
return list(a);
Тогда в C я делаю как:
int main(int argc, char *argv[])
{
PyObject *pName, *pModule, *pFunc;
PyObject *pArgs, *pArg, *pResult;
int i = 0, j = 0;
cv::Mat img;
img = cv::imread("..\\..\\x64\\Release\\1.jpg",1);
Py_Initialize();
pName = PyUnicode_DecodeFSDefault("showImage");
pModule = PyImport_Import(pName);
Py_DECREF(pName);
pFunc = PyObject_GetAttrString(pModule, "detect");
pArgs = PyTuple_New(4);
pArg = PyByteArray_FromStringAndSize((char*)img.data, img.total() * img.elemSize());
PyTuple_SetItem(pArgs, 0, pArg);
PyTuple_SetItem(pArgs, 1, PyLong_FromLong(img.cols));
PyTuple_SetItem(pArgs, 2, PyLong_FromLong(img.rows));
PyTuple_SetItem(pArgs, 3, PyLong_FromLong(img.channels()));
pResult = PyObject_CallObject(pFunc, pArgs);
Py_DECREF(pArgs);
if (PyList_Check(pResult)) {
int SIZE = PyList_Size(pResult);
float *arr = new float(SIZE);
for (i = 0; i < SIZE; i++) arr[i] = PyFloat_AsDouble(PyList_GetItem(pResult, i));
for (i = 0; i < SIZE / 2; i++) {
for (j = 0; j < 2; j++) {
printf("%f, ", arr[i * 2 + j]);
}
printf("\n");
}
}
return 0;
}
, в котором последние 14 строк получают возвращенный список и извлекают его элементы.