4

我编写了一个 C++ 方法,我需要从中将结构返回给 Python。我已经能够mat按照此链接中描述的方法使用 BOOST 将 OpenCV 从 Python 发送到 C++ 。

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

任何示例或参考链接都会很好。我在发布这个问题之前尝试过谷歌搜索,但我无法获得任何示例或解释链接。

4

2 回答 2

5

您可以使用 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;
}

请查看此链接:https ://wiki.python.org/moin/boost.python/handle以确保您为您的案例使用适当的 boost::python::handle<> 函数。

如果您需要不需要返回 cv::Mat 但不同的数据,您可以考虑使用 boost::python::list 或 boost::python::dict。例如,如果您想将 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 包装器:

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

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

于 2013-10-05T15:23:34.453 回答
-1

这可能有点太晚了,但看看https://github.com/spillai/numpy-opencv-converter

于 2016-02-03T17:23:58.197 回答