将基于OpenCV+C++函数的My/NoPy转换暴露为Python

2024-10-01 13:34:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我遇到了一个问题,试图公开动态C++库函数,链接到OpenCV,并使用OpenCV的强> Mat <强>数据类型,使用Python 2.7,使用NoMPy <强> NDARLY < /强>。在

我提出了一个类似于lightalchemist's solution here的解决方案,还尝试过使用boost::python和boost::numpy(也链接到python2.7)described in this SO question.

现在我还是坚持前者。我已经到了可以在iPython中加载模块的地步了,我看到了一个我正试图使用inspect模块移植的函数,我甚至可以调用它,甚至可以执行它。但是,当我试图使用numpyLocatorsee lightalchemist's solution)类将Mat对象转换回ndarray时,这个问题会特别出现。 首先,当我试图从一个外部C++执行文件中调用<强> PyopCopvIn,并且它使用NUMPyApLoalApter作为编码时,它在

中出现了分段错误。
PyEnsureGIL gil;

,每次都没有留言。Lightalchemist的解决方案并没有在pyopencv_-to中使用它(编辑:如果传入的ndarray已经被分配),而且它似乎可以工作。但是,官方的OpenCV cv2.cpp也使用了分配器,所以如果我尝试使用它,函数甚至不能将输入ndarray转换为Mat。在

当我尝试使用iPython中的模块时,它看到了函数。同样,它正确地执行它(将进程打印到控制台),但是当它从到达pyopencv_时,它会分离错误并杀死iPython shell。在

编辑:我使用的exacty与lightalchemist使用的源代码相同,只是我公开了一个函数,与官方OpenCV端口一样:

^{pr2}$

有人知道如何解决这个转换问题吗?在


Tags: 模块函数编辑官方链接错误ipython解决方案
1条回答
网友
1楼 · 发布于 2024-10-01 13:34:31

问题不是

PyEnsureGIL gil;

声明。如果我试图使用外部C++函数,那就不起作用了。当我试图将两个输出值打包成一个时,问题实际上发生了:

^{pr2}$

临时工作只是使用以下语句:

return pyopencv_from(edgeGrad);

编辑: 对不起,我又搞砸了。Py_BuildValue工作正常。刚刚又测试了一下我的功能,一切正常。我一定是忘了上次测试return关键字了,所以它给了我“error return without exception set”

以下是完整的函数代码(我希望它对任何将OpenCV移植到python的人都有用)

static PyObject* pycvex_findEdgesCGTG(PyObject* , PyObject* args, PyObject* kw)
{
    PyObject* pyobj_source = NULL;
    Mat source;
    Mat edgeGrad;
    Mat edgeOri;
    const char* keywords[] = { "src", NULL };
    if( PyArg_ParseTupleAndKeywords(args, kw, "O:findEdgesCGTG", (char**)keywords, &pyobj_source) &&
        pyopencv_to(pyobj_source, source));
    {
        ERRWRAP2(findEdgesCGTG(source,edgeGrad,edgeOri));
        return Py_BuildValue("(NN)", pyopencv_from(edgeGrad), pyopencv_from(edgeOri));
    }
    return NULL;
}

更新:

这里是我使用OpenCV的Mat类编写的公开C++代码的github repo,尽可能少的疼痛。这是用于OpenCV 3.X的。在

对于opencv2.X,您可以使用Yati Sagade的this code/示例。如果您想公开使用opencv Mat类的函数,而不必担心显式转换,那么很容易将我代码中的Booost转换器与Yati代码中的转换函数相适应。在

相关问题 更多 >