簡體   English   中英

使用BOOST.python從C ++將結構返回給Python

[英]Return a structure to Python from C++ using BOOST.python

我編寫了一個C ++方法,我需要將結構返回給Python。 我已經能夠使用BOOST按照此鏈接中描述的方法將OpenCV mat從Python發送到C ++。

現在我需要走另一條路; 從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;
}

請查看以下鏈接: 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);
}

我沒有測試過這個具體的解決方案,但原則上應該可行。

這可能有點太晚了,但請看一下https://github.com/spillai/numpy-opencv-converter

暫無
暫無

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

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