gpt4 book ai didi

c++ - 使用 BOOST.python 将结构从 C++ 返回到 Python

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:54:27 27 4
gpt4 key购买 nike

我已经编写了一个 C++ 方法,我需要从中向 Python 返回一个结构。我已经能够按照此 link 中描述的方法使用 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 点的 vector 返回给 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);
}

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

关于c++ - 使用 BOOST.python 将结构从 C++ 返回到 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19185574/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com