8

I need to send an OpenCv image from C++ to Python to do some processing on it. The Mat will be received through the code but for simplicity I am using imread here for the question.

What I did in the C++ part of the code was:

#include <Python.h>
#include <arrayobject.h>
#include <iostream>
#include <opencv2/opencv.hpp>


#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION


using namespace cv;
using namespace std;

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    Mat image = imread("test.jpg");

    Py_Initialize();
    PyObject *pName, *pModule, *pDict, *pFunc, *pArgs, *pValue;

    pName = PyUnicode_FromString("prog");
    if (pName == NULL)
    {
        PyErr_Print();
        return 0;
    }

    pModule = PyImport_Import(pName);
    if (pModule == NULL)
    {
        PyErr_Print();
        return 0;
    }
    pDict = PyModule_GetDict(pModule);
    pFunc = PyDict_GetItemString(pDict, "add");
    if (pFunc == NULL)
    {
        PyErr_Print();
        return 0;
    }

    pArgs = PyTuple_New(1);
    import_array ();

    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)
        cout<<"Calling the add method failed"<<endl;

    long result = PyLong_AsLong(pResult);
    cout<<"Result = "<<result<<endl;

    Py_Finalize();
    return 0;
}

This code compiles and runs.

For the Python part:

import cv2
import numpy as np

def add (a):
    print ("Contents of a :")
    print (a)

    # mat_array = cv2.fromarray(a, numpy.float32)
    vis0 = cv.fromarray(a)

    return 0

The Python code receives the numpy array from C++ (I think) and when I print the contents of a, I have an output (so I think I am receiving the image from C++).

Now I need to convert the data in a to a cv2 Mat in Python so that I can work on it.

Once I reach the mat_array = cv2.fromarray(a, numpy.float32) line or vis0 = cv.fromarray(a) the code crashes with the following output:

Exception ignored in: <module 'threading' from '/usr/lib/python3.5/threading.py'>
Traceback (most recent call last):
File "/usr/lib/python3.5/threading.py", line 1283, in _shutdown
assert tlock.locked()
SystemError: <built-in method locked of _thread.lock object at 0x7ff0f34d20d0> returned a result with an error set

How do I correctly send / receive the Mat object?

1

1 Answer 1

3

Please find my answer here. You can also find other answer here. for converting numpy -> cv::Mat and cv::Mat -> numpy.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.