I have a C++ library where const references to OpenCV types are returned. Now
I'm porting the interface to Python and have hit upon what looks to be an old
issue; there doesn't appear to be a way to have boost.python intrinsically
convert a const reference OpenCV type to a Python object (tuple or numpy). My
guess is that I'm missing something, but maybe not. So I'm providing more
details
Right now I'm writing wrapper classes/functions to handle the interface but
would prefer to define a conversion of the types in a way that boost.python can
just do the conversion without individual class/function wrappers explicitly
declared for everything.
For example, if a method returns a member variable of type cv::Vec3d as 'const
cv::Vec3d&', I would like to declare one "const cv:Vec3d& to Python" converter
and have that be used/specified where needed; and another for Python to const
cv:Vec3d&. Sans individual wrapper classes/functions.
Going over the library I've come closest with one of: 1) declare things in such
a way as to get a [paraphrasing] "unable to convert pointer to const
cv::Vec3d&() type" error [in as_to_python_function.hpp - so close!], or 2) use
return_value_policy<copy_const_ref> which Python subsequently can't convert.
I think declaring something along the lines of "class_<cv::Vec3d>..." might
work but then I'm redefining the OpenCV class which I don't like to do since my
library shouldn't make OpenCV types visible in Python.
I am new to boost.python so I'm probably wrong, but it appears the best
solution would be to have as_to_python_function.cpp split into reference and
copy-constructor classes to handle the appropriate differences. Right now the
same class handles both cases.
Any help is appreciated.
I am including a simple example:
#include <boost/python.hpp>
namespace p = boost::python;
class Vec3d
{
public:
Vec3d() {v[0] = v[1] = v[2] = 0.0;}
virtual ~Vec3d() {}
private:
double v[3];
};
class UseVec3d
{
public:
UseVec3d() {}
UseVec3d(const Vec3d& vec) : v(vec) {}
virtual ~UseVec3d() {};
const Vec3d& get_vec() const {return v;}
void set_vec(const Vec3d& vec) {v = vec;}
private:
Vec3d v;
};
BOOST_PYTHON_MODULE(test)
{
p::class_<UseVec3d>("UseVec3d")
.def("get_vec", &UseVec3d::get_vec) //
Error's here
;
}
_______________________________________________
Cplusplus-sig mailing list
[email protected]
https://mail.python.org/mailman/listinfo/cplusplus-sig