Fixed pyopencv_to w/FLANN IndexParams in python3.

The keys() and values() functions on dictionaries in Python 3 no longer
return lists.  pyopencv_to() for flann::IndexParams now iterates over
the dictionary in a way that is version-agnostic.
This commit is contained in:
Gabe Schwartz 2014-05-21 14:29:54 -04:00
parent cf5dd88cf2
commit c19b6ed20e

View File

@ -999,19 +999,18 @@ template<>
bool pyopencv_to(PyObject *o, cv::flann::IndexParams& p, const char *name) bool pyopencv_to(PyObject *o, cv::flann::IndexParams& p, const char *name)
{ {
(void)name; (void)name;
bool ok = false; bool ok = true;
PyObject* keys = PyObject_CallMethod(o,(char*)"keys",0); PyObject* key = NULL;
PyObject* values = PyObject_CallMethod(o,(char*)"values",0); PyObject* item = NULL;
Py_ssize_t pos = 0;
if( keys && values ) if(PyDict_Check(o)) {
{ while(PyDict_Next(o, &pos, &key, &item)) {
int i, n = (int)PyList_GET_SIZE(keys); if( !PyString_Check(key) ) {
for( i = 0; i < n; i++ ) ok = false;
{
PyObject* key = PyList_GET_ITEM(keys, i);
PyObject* item = PyList_GET_ITEM(values, i);
if( !PyString_Check(key) )
break; break;
}
String k = PyString_AsString(key); String k = PyString_AsString(key);
if( PyString_Check(item) ) if( PyString_Check(item) )
{ {
@ -1034,14 +1033,14 @@ bool pyopencv_to(PyObject *o, cv::flann::IndexParams& p, const char *name)
p.setDouble(k, value); p.setDouble(k, value);
} }
else else
{
ok = false;
break; break;
}
} }
ok = i == n && !PyErr_Occurred();
} }
Py_XDECREF(keys); return ok && !PyErr_Occurred();
Py_XDECREF(values);
return ok;
} }
template<> template<>