Отправка CV :: Mat из C++ в функцию скрипта Python

Я пытаюсь передать объект 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

shape печатается как (ширина и высота каналов), тип отображается как ndarray, но при выполнении функции imshow происходит сбой кода.

Я попробовал cv2.imread ("test.jpg") на стороне Python и получил те же результаты, когда печать формы и типа и imshow действительно работали, поэтому я думаю, что при попытке получить данные из C++ чего-то не хватает.

Это правильный способ или я что-то упускаю?

Что на выходе print image.dtype

ZdaR 10.09.2018 12:06

@ZdaR в обоих случаях вывод uint8

EYakoumi 10.09.2018 13:33

Каково значение image.dims в C++?

Mailerdaimon 10.09.2018 14:06

@Mailerdaimon image.dims = 2 в C++

EYakoumi 10.09.2018 14:35
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
560
0

Другие вопросы по теме