2016-04-15 10 views
2

Für ein Projekt muss ich einige C++ - Module in Python verbinden. Dazu benötige ich einen Konverter, der ein Python-Tupel in ein cv :: Size (openCV-Objekt) konvertiert. Hier ist meine C++ Funktion:Aufruf einiger PyObject-Funktionen verursacht segfault - Boost python

cv::Size tupleToSize(PyObject* obj) 
{ 
    // Check if obj is a tuple : 
    if (!PyTuple_CheckExact(obj)) 
     return cv::Size(-1,-1); 

    // Element Extraction : 
    PyObject* x = PyTuple_GetItem(obj,0); 
    PyObject* y = PyTuple_GetItem(obj,1); 

    // TODO : extract values from x and y 
    // Trying to create two variables a et b that contains the values 
    long a = PyLong_AsLong(x); 
    long b = PyLong_AsLong(y); 
    /* The first line causes a SegFault*/ 

    // New cv::Size with extracted values : 
    cv::Size ret(a,b); 
    return ret; 
} 

Und hier ist das wichtigste, die meine Funktion aufruft:

int main() 
{ 

    // New cv:Size : 
    Size s(10,20); 
    // Conversion : 
    PyObject* ss = SizeToTuple(s); // I have a SizeToTuple function that works fine. 
    // Reconversion : 
    Size sss = tupleToSize(ss); /* SEGFAULT */ 


    return 0; 

} 

Also, ich frage mich, ob meine PyObject x und y ist nicht vom Typ Lange, so habe ich beschlossen, Überprüfen Sie ihren Typ, aber wenn ich einige Funktionen wie aufrufen:

Sie verursachen auch einen segfault.

Also bin ich ziemlich fest. Hast du irgendwelche Vorschläge? Danke im Voraus.

+0

Der Python-Interpreter sollte initialisiert werden, bevor die meisten dieser Aufrufe ausgeführt werden. Siehe [diese] (http://stackoverflow.com/a/19816546/1053968) Antwort. –

Antwort

1

Dank Tanner Sansburry, löste ich das Problem, indem Sie gerade hinzufügen:

Py_Initialize(); 

in meinem Code.

Problem gelöst!

Verwandte Themen