#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())
ничего не делает!