将结构从C+返回到Python+;使用BOOST.python 我编写了一个C++方法,从中我需要将结构返回到Python。 我已经能够使用PosithPosil按照这个方法发送一个opencv< C++ >代码>从Python到C++。p>

将结构从C+返回到Python+;使用BOOST.python 我编写了一个C++方法,从中我需要将结构返回到Python。 我已经能够使用PosithPosil按照这个方法发送一个opencv< C++ >代码>从Python到C++。p>,c++,python,boost,wrapper,boost-python,C++,Python,Boost,Wrapper,Boost Python,现在我需要走另一条路;从C++返回到Python,然后在Python中访问该结构。能做到吗 任何样品或参考链接将是好的。在发布此问题之前,我尝试过谷歌搜索,但无法获得任何示例或解释链接。您可以使用modules/python/src2/cv2.cpp中的另一个函数: PyObject* pyopencv_from(const cv::Mat& m) { if( !m.data ) Py_RETURN_NONE; cv::Mat temp, *p = (cv::Mat*

现在我需要走另一条路;从C++返回到Python,然后在Python中访问该结构。能做到吗


任何样品或参考链接将是好的。在发布此问题之前,我尝试过谷歌搜索,但无法获得任何示例或解释链接。

您可以使用modules/python/src2/cv2.cpp中的另一个函数:

PyObject* pyopencv_from(const cv::Mat& m)
{
  if( !m.data )
      Py_RETURN_NONE;
  cv::Mat temp, *p = (cv::Mat*)&m;
  if(!p->refcount || p->allocator != &g_numpyAllocator)
  {
      temp.allocator = &g_numpyAllocator;
      m.copyTo(temp);
      p = &temp;
  }
  p->addref();
  return pyObjectFromRefcount(p->refcount);
}
然后,Boost Python包装器将如下所示:

boost::python::object toPython( const cv::Mat &frame )
{
    PyObject* pyObjFrame = pyopencv_from( frame );
    boost::python::object boostPyObjFrame(boost::python::handle<>((PyObject*)pyObjFrame));

    return boostPyObjFrame;
}
boost::python::objecttopython(const-cv::Mat&frame)
{
PyObject*pyObjFrame=pyopencv_from(frame);
boost::python::objectboostpyobjframe(boost::python::handle((PyObject*)pyObjFrame));
返回boostPyObjFrame;
}
请看一下这个链接:确保您为您的案例使用了适当的boost::python::handle函数

如果您不需要返回CV::Mat而是不同的数据,您可能会考虑使用Booo::Python::List或Booo::Python::DIAT.例如,如果您想将一个2D点的向量返回到Python,您可以做一些类似的事情:

boost::python::dict toPython( std::vector<cv::Point> newPoints, std::vector<cv::Point> oldPoints )
{
    boost::python::dict pointsDict;
    boost::python::list oldPointsList;
    boost::python::list newPointsList;

    for( size_t ii = 0; ii < oldPoints.size( ); ++ii )
    {
        oldPointsList.append( boost::python::make_tuple( oldPoints[ii].x, oldPoints[ii].y ) );
    }

    for( size_t ii = 0; ii < newPoints.size( ); ++ii )
    {
        newPointsList.append( boost::python::make_tuple( newPoints[ii].x, newPoints[ii].y ) );
    }

    pointsDict["oldPoints"] = oldPointsList;
    pointsDict["newPoints"] = newPointsList;
    return pointsDict
}
boost::python::dict toPython(std::vector newPoints,std::vector oldPoints)
{
boost::python::dict pointsDict;
boost::python::list oldPointsList;
boost::python::list newpoints列表;
对于(size_t ii=0;ii
最后,Boost Python包装器:

BOOST_PYTHON_MODULE( myWrapper )
{
    // necessary only if array (cv::Mat) is returned
    import_array();
    boost::python::converter::registry::insert( &extract_pyarray, type_id<PyArrayObject>());

    def toPython("toPython", &toPython);
}
BOOST_PYTHON_模块(myWrapper)
{
//仅当返回数组(cv::Mat)时才需要
导入数组();
boost::python::converter::registry::insert(&extract_pyarray,type_id());
def toPython(“toPython”和toPython);
}

我还没有测试过这个特定的解决方案,但原则上它应该可以工作。

这可能有点太晚了,但请看一下

谢谢您的回答。我需要返回一个C++结构。我想我可以从你给出的“Mat”示例中得出结论?如果我返回一个结构,比如Struct samp{int a;char b;},我会尝试一下,然后再给你回复;如何在Python中访问这个?我得到这个错误,原因是什么。我的意图是将一些不同数据类型的变量从C++发送回来作为返回值。我曾想过将其作为结构发送,但即使它是类对象,我也可以。尝试将boostPyObjFrame的定义行更改为:boost::python::object booostPyObjFrame(boost::python::handle(boost::python::borroed((PyObject*)pyObjFrame)),或者仅:boost::python::object booostPyObjFrame(boost::python::handle((PyObject*)*)pyObjFrame))如果您不需要返回转换为Python NoMPy数组的垫子,那么您可以更容易地使用C++代码升压::Python::DICT或Booo::Python::列表将要返回的数据打包。除了链接GITHUB回购,还可以解释这有助于问题的解决。