Как передать тип opencv Mat в Python и получить массив обратно?

#python #c #opencv

#python #c #opencv

Вопрос:

У меня есть код python для глубокого изучения, который получает изображение и возвращает массив позиций обнаружения в этом изображении.

Я разработал все остальные части моего проекта на C , и я хочу передать изображение opencv Mat (cv::Mat) в скрипт python, и он вернет массив в C .

Есть ли способ передать эти типы данных из / в C / Python? какие функции я должен использовать?

Комментарии:

1. если это не критично для производительности, проще всего сохранить его в файле и прочитать еще раз

2. @user463035818 Производительность — это именно моя проблема.

3. Это то, что вы ищете? Просто передайте указатель на данные в ваш скрипт python и распакуйте его как struct. Затем снова упакуйте его, чтобы передать обратно в ваше приложение на C . Или скомпилируйте свой скрипт на python до C с помощью Cython и попробуйте интегрировать это в свой код. Другой способ сделать это — полностью выполнить это на C или Python и не смешивать, если производительность действительно критична. Tensorflow имеет C API.

4. «Есть ли способ передать эти типы данных из / в C / Python?» — Конечно, взгляните на то, как работают привязки OpenCV Python. На SO есть несколько сообщений о том, как обрабатывать сопоставление Mat с ndarray . Есть также Boost.Numpy.

Ответ №1:

Итак, этого можно достичь двумя способами.

1.) вы можете разработать внутренний сервер для python, а затем предоставить эти API, а затем вы можете использовать свой API для отправки данных и получения результатов обратно.

2.) также вы можете создать свою функцию python, вызываемую программой на c , для этого вы можете использовать lib like Python.h для вызова и получения данных из скрипта python.

Допустим, у вас есть файл python с именем, aiDosomething.py в котором есть функция detect , выполняющая задачу обнаружения. тогда в c вы можете сделать что-то вроде

 #include <Python.h>

int main()
{

pModule = PyImport_ImportModule("aiDosomething");

//chose the function in file Sample

pFunc = PyObject_GetAttrString(pModule,"detect");

pDict = PyModule_GetDict(pModule);   // Create a dictionary for the contents of the module.

//make the args to be passes in the function

pArgs = PyTuple_New(1);     // Create a Python tuple to hold the arguments to the method.
PyTuple_SetItem(pArgs, 0, insertArray); // insertArray can be your cv::mat array

//run the code and get the result
PyObject* pResult = PyObject_CallObject(pFunc, pArgs);
return 0;

}
  

для упрощения вы можете поместить свой код python и c в один каталог.

Комментарии:

1. Это ошибка, возвращаемая, когда я хочу использовать cv::Mat в качестве insertArray: «не существует подходящего преобразования из «cv::Mat» в «PyObject *»»

2. попробуйте преобразовать cv::mat array в обычный массив и отправить его

3. как это возможно? Просто ввести приведение?

4. вы можете представить изображение как 2D-массив, сначала вы инициализируете 2d-массив, имеющий форму, равную cv::Mat, затем вы можете просто перебирать каждое значение в cv::mat, а затем присваивать значение обычному массиву c . Также, если вы мало разбираетесь в c , вы можете напрямую передать свой ImagePath в python и загрузить изображение в саму функцию.

5. Я сделал это без ошибок с помощью PyTuple_SetItem(pArgs, 0, (PyObject*)(char*)img.data); но в скрипте python ничего не отображается. Даже print(img.shape()) ничего не делает!