Я пытаюсь передать объект cv :: Mat из кода C ++ в скрипт на python, чтобы там были какие-то манипуляции (для упрощения я просто опубликую код, чтобы просто отобразить изображение).
В коде c ++ я сделал следующее:
import_array();
Mat image = imread("test.jpg");
PyObject *pName, *pModule, *pDict, *pFunc, *pArgs, *pValue;
pName = PyUnicode_FromString("test");
if (pName == NULL)
{
PyErr_Print();
break ;
}
pModule = PyImport_Import(pName);
if (pModule == NULL)
{
PyErr_Print();
break;
}
pDict = PyModule_GetDict(pModule);
pFunc = PyDict_GetItemString(pDict, "check");
if (pFunc == NULL)
{
PyErr_Print();
break;
}
pArgs = PyTuple_New(1);
npy_intp dimensions[3] = {image.rows, image.cols, image.channels()};
pValue = PyArray_SimpleNewFromData(image.dims + 1, (npy_intp*)&dimensions, NPY_UINT8, image.data);
PyTuple_SetItem(pArgs, 0, pValue);
PyObject* pResult = PyObject_CallObject(pFunc, pArgs);
if(pResult == NULL)
LERROR<<"error calling";
на стороне питона
import cv2
import numpy as np
def check(a):
image = a
print (image.shape)
print (type(image))
cv2.imshow("win",a)
return 0
форма выводится как (ширина канала по высоте), тип отображается как ndarray, но код ошибки в функции imshow.
Я попробовал cv2.imread ("test.jpg") на стороне Python и получил те же результаты, когда печать формы и типа и imshow сработали, поэтому я думаю, что что-то не хватает при попытке получить данные из c ++.
Это правильный путь или я что-то упустил?