簡體   English   中英

將OpenCv Mat從C ++傳遞到Python

[英]Passing OpenCv Mat from C++ to Python

我需要將一個OpenCv圖像從C ++發送到Python來對其進行一些處理。 Mat將通過代碼收到,但為了簡單起見,我在這里使用imread來解決問題。

我在C ++部分代碼中所做的是:

#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;
}

此代碼編譯並運行。

對於Python部分:

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

的Python代碼接收numpy的陣列從C ++(我認為)和當我打印的內容a ,我有一個輸出(所以我想我選自C接收圖像++)。

現在,我需要將數據轉換成a以Python中的CV2墊,這樣我可以在它的工作。

一旦我到達mat_array = cv2.fromarray(a, numpy.float32)行或者vis0 = cv.fromarray(a) ,代碼就會崩潰並輸出以下內容:

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

如何正確發送/接收Mat對象?

在這里找到我的答案。 你也可以在這里找到其他答案。 轉換numpy -> cv::Matcv::Mat -> numpy

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM