From 4044fbcb337e57d3b9bac32cb72a6a1605ec835d Mon Sep 17 00:00:00 2001 From: Vadim Pisarevsky Date: Mon, 28 Jan 2013 21:03:59 +0400 Subject: [PATCH] hopefully fixed handling of 'long' Python type in OpenCV bindings (bug #2193). added the corresponding test --- modules/python/src2/cv2.cpp | 16 ++++++++++++++-- modules/python/test/test2.py | 5 +++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/modules/python/src2/cv2.cpp b/modules/python/src2/cv2.cpp index 7e182273b5..02e1b46424 100644 --- a/modules/python/src2/cv2.cpp +++ b/modules/python/src2/cv2.cpp @@ -476,7 +476,12 @@ static bool pyopencv_to(PyObject* obj, int& value, const char* name = " (void)name; if(!obj || obj == Py_None) return true; - value = (int)PyInt_AsLong(obj); + if(PyInt_Check(obj)) + value = (int)PyInt_AsLong(obj); + else if(PyLong_Check(obj)) + value = (int)PyLong_AsLong(obj); + else + return false; return value != -1 || !PyErr_Occurred(); } @@ -741,7 +746,14 @@ template struct pyopencvVecConverter PyObject* item_ij = items_i[j]; if( PyInt_Check(item_ij)) { - int v = PyInt_AsLong(item_ij); + int v = (int)PyInt_AsLong(item_ij); + if( v == -1 && PyErr_Occurred() ) + break; + data[j] = saturate_cast<_Cp>(v); + } + else if( PyLong_Check(item_ij)) + { + int v = (int)PyLong_AsLong(item_ij); if( v == -1 && PyErr_Occurred() ) break; data[j] = saturate_cast<_Cp>(v); diff --git a/modules/python/test/test2.py b/modules/python/test/test2.py index b15d0d294e..c7491ad974 100644 --- a/modules/python/test/test2.py +++ b/modules/python/test/test2.py @@ -42,6 +42,11 @@ class Hackathon244Tests(NewOpenCVTests): self.assert_(cv2.norm(a, cv2.NORM_L1) == 15) absa1 = cv2.absdiff(a, 0) self.assert_(cv2.norm(absa1, absa0, cv2.NORM_INF) == 0) + + def test_imencode(self): + a = np.zeros((480, 640), dtype=np.uint8) + flag, ajpg = cv2.imencode("img_q90.jpg", a, [cv2.IMWRITE_JPEG_QUALITY, 90]) + self.assert_(flag == True and ajpg.dtype == np.uint8 and ajpg.shape[0] > 1 and ajpg.shape[1] == 1) if __name__ == '__main__': print "testing", cv.__version__