我正在尝试为一些使用OpenCV的C++代码编写一个python包装器,但是我很难将结果(一个OpenCV C++ Mat对象)返回给python解释器.
我查看了OpenCV的源代码,发现文件cv2.cpp具有转换函数,可以在PyObject*和OpenCV的Mat之间来回执行转换.我使用了那些转换函数,但在我尝试使用它们时遇到了分段错误.
我基本上需要一些关于如何使用OpenCV来连接python和C++代码的建议/示例代码/在线参考,特别是能够将OpenCV的C++ Mat返回给python解释器,或者可能建议如何/从何处开始调查原因分段错误.
目前我正在使用Boost Python来包装代码.
在此先感谢任何回复.
相关代码:
// This is the function that is giving the segmentation fault.
PyObject* ABC::doSomething(PyObject* image)
{
Mat m;
pyopencv_to(image, m); // This line gives segmentation fault.
// Some code to create cppObj from CPP library that uses OpenCV
cv::Mat processedImage = cppObj->align(m);
return pyopencv_from(processedImage);
}
Run Code Online (Sandbox Code Playgroud)
从OpenCV的源代码转换函数如下.转换代码在带有"if(!PyArray_Check(o))..."的注释行中给出了分段错误.
static int pyopencv_to(const PyObject* o, Mat& m, const char* name = "<unknown>", bool allowND=true)
{
if(!o || o == Py_None)
{
if( !m.data )
m.allocator …Run Code Online (Sandbox Code Playgroud) 我想从我的python代码传递回调到c ++
我希望我的代码看起来像这样:在C++中:
typedef void (*MyCallback_t) (CallbackInfo);
class MyClass
{...
void setcallback(MyCallback_t cb);
...
}
Run Code Online (Sandbox Code Playgroud)
并在python中使用它:
import mylib
def myCallback(mylib_CallbackInfo):
...
t = mylib.MyClass()
t.setcallback(myCallback)
Run Code Online (Sandbox Code Playgroud)
我在问题附近看到了一些话题,但无法解决
例如: 使用Python和C++实时处理和回调有建议使用boost :: python和关于GLI的警告,但没有示例.和这里
如何从一门外语线程(C++)调用Python函数有一个与Python代码的一部分,并以"BOOST_PYTHON_MODULE"部分没有充分说明
我还发现链接使用py_boost_function.hpp例如在Boost python howto但它没有编译和实际我无法理解如何使用它.
我有以下两个C++异常的简单层次结构:
class LIB_EXP ClusterException : public std::exception {
public:
ClusterException() { }
ClusterException(const std::string& what) { init(what); }
virtual const char* what() const throw() { return what_.c_str(); }
virtual ~ClusterException() throw() {}
virtual ClusterException* clone() { return new ClusterException(*this); }
protected:
void init(const std::string& what) { what_ = what; }
private:
std::string what_;
};
class LIB_EXP ClusterExecutionException : public ClusterException {
public:
ClusterExecutionException(const std::string& jsonResponse);
std::string getErrorType() const throw() { return errorType_; }
std::string getClusterResponse() const throw() { return clusterResponse_; …Run Code Online (Sandbox Code Playgroud) 我目前正在使用Boost.Python为Python编写C++扩展.此扩展中的函数可能会生成一个包含错误信息的异常(除了描述发生的事件的人类可读字符串之外).我希望我可以将这个异常导出到Python,这样我就能抓住它并用额外的信息做些什么.
例如:
import my_cpp_module
try:
my_cpp_module.my_cpp_function()
except my_cpp_module.MyCPPException, e:
print e.my_extra_data
Run Code Online (Sandbox Code Playgroud)
不幸的是,Boost.Python似乎将所有C++异常(都是其子类std::exception)转换为RuntimeError.我意识到Boost.Python允许一个人实现自定义异常转换,但是,需要使用PyErr_SetObject一个PyObject*(对于异常的类型)和一个PyObject*(对于异常的值) - 我都不知道如何从我的Boost中获取. Python类.也许有一种方法(这将是伟大的),我还没有找到.否则有人知道如何导出自定义C++异常,以便我可以在Python中捕获它吗?
boost.python如何处理Python 3?它只是Python 2吗?
我有一个带签名的功能:
function(std::vector<double> vector);
Run Code Online (Sandbox Code Playgroud)
而且我已经暴露了它,但它没有接受Python列表.我已经查看了其他的SO答案,并且大多数都涉及更改函数以接受boost :: python :: lists,但我不想更改函数.我想我可以使用vector_indexing_suite为这个函数编写一个简单的包装器,但是我有很多这种形式的函数,而不愿为每一个函数编写一个包装器.有没有办法自动生成Python list-> std :: vector映射?
我对boost.python相当新,并尝试将函数的返回值公开给python.
函数签名如下所示:
std::unique_ptr<Message> someFunc(const std::string &str) const;
Run Code Online (Sandbox Code Playgroud)
在python中调用函数时,我收到以下错误:
TypeError: No to_python (by-value) converter found for C++ type: std::unique_ptr<Message, std::default_delete<Message> >
Run Code Online (Sandbox Code Playgroud)
我在python中的函数调用如下所示:
a = mymodule.MyClass()
a.someFunc("some string here") # error here
Run Code Online (Sandbox Code Playgroud)
我试图暴露std :: unique_ptr但只是无法让它工作..有人知道如何正确暴露指针类?谢谢!
编辑: 我尝试了以下内容:
class_<std::unique_ptr<Message, std::default_delete<Message>>, bost::noncopyable ("Message", init<>())
;
Run Code Online (Sandbox Code Playgroud)
这个例子编译,但我仍然得到上面提到的错误.此外,我试图暴露类Message本身
class_<Message>("Message", init<unsigned>())
.def(init<unsigned, unsigned>())
.def("f", &Message::f)
;
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Boost.Python将我的C++类公开给Python.这是我正在尝试做的简化版本:
我有一个派生自boost :: noncopyable的类A和一个带有一个方法的类B,该方法将A作为参数引用.
class A : boost::noncopyable { /*...*/ };
class B {
public:
virtual void do_something(A& a) {
/*...*/
}
};
Run Code Online (Sandbox Code Playgroud)
我正在公开课程如下:
/* Wrapper for B, so B can be extended in python */
struct BWrap : public B, wrapper<B> {
void do_something(A &a) {
if (override do_something = this->get_override("do_something")) {
do_something(a);
return;
}
else {
B::do_something(a);
}
}
void default_do_something(A& a) { this->B::do_something(a); }
};
BOOST_PYTHON_MODULE(SomeModule) {
class_<A, boost::noncopyable>("A");
class_<BWrap, boost::noncopyable>("B")
.def("do_something", &B::do_something, &BWrap::default_do_something)
;
}
Run Code Online (Sandbox Code Playgroud)
我像这样在python中扩展B: …
我正在寻找一种简单的方法将C++类实例暴露给python嵌入式解释器.
我想将我的C++世界Foo实例暴露给python世界(并被视为Foo类).
这是可能的,如果是这样,怎么样?
我认为这几乎就像在第一个答案中: boost :: python :: ptr或PyInstance_New用法
我想这意味着我应该boost.Python用来包装我的图书馆?
我唯一的目标是在嵌入式python解释器中操作我的Coo Coo实例(不确定它是否可以使用前面的方法完成).
希望我很清楚,谢谢你的帮助.
更新
谢谢你的回答.事实上,我已经将我的Foo类暴露给python(使用swig).
是)我有的:
我的Foo课程:
class Foo{...};
Run Code Online (Sandbox Code Playgroud)
我的包装库(包括Foo类)暴露给python:所以我可以启动python解释器并执行以下操作:
import my_module
foo=my_modulde.Foo()
Run Code Online (Sandbox Code Playgroud)
我想要的是:
有一个C++主程序嵌入python解释器并操纵C++世界变量.
int main(int argc, char **argv)
{
Foo foo; // instanciates foo
Py_Initialize();
Py_Main(argc, argv); // starts the python interpreter
// and manipulates THE foo instance in it
Py_Finalize();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在更清楚了吗?:)
我的项目包括一个大型C++库和Python绑定(通过Boost.Python).测试套件主要是在Python绑定之上编写的,我想用清理程序运行它,从ASAN开始.
我正在运行macOS(10.13.1 FWIW,但我也遇到了以前版本的问题),我似乎找不到在Python模块上运行ASAN的方法(我非常怀疑这与Boost.Python有关) ,我想它与其他技术一样).
这是一个简单的Python模块:
// hello_ext.cc
#include <boost/python.hpp>
char const* greet()
{
auto* res = new char[100];
std::strcpy(res, "Hello, world!");
delete [] res;
return res;
}
BOOST_PYTHON_MODULE(hello_ext)
{
using namespace boost::python;
def("greet", greet);
}
Run Code Online (Sandbox Code Playgroud)
这是我使用的Makefile,为MacPorts制作:
// Makefile
CXX = clang++-mp-4.0
CXXFLAGS = -g -std=c++14 -fsanitize=address -fno-omit-frame-pointer
CPPFLAGS = -isystem/opt/local/include $$($(PYTHON_CONFIG) --includes)
LDFLAGS = -L/opt/local/lib
PYTHON = python3.5
PYTHON_CONFIG = python3.5-config
LIBS = -lboost_python3-mt $$($(PYTHON_CONFIG) --ldflags)
all: hello_ext.so
hello_ext.so: hello_ext.cc
$(CXX) $(CPPFLAGS) $(CXXFLAGS) $(LDFLAGS) -shared -o $@ $< $(LIBS)
check: …Run Code Online (Sandbox Code Playgroud) boost-python ×10
c++ ×9
python ×9
boost ×6
exception ×2
c++11 ×1
callback ×1
iterator ×1
opencv ×1
python-3.x ×1
swig ×1
unique-ptr ×1