From f5461aae17ea13ead6e336019b3e891c60f4cd08 Mon Sep 17 00:00:00 2001 From: Stefan van der Walt Date: Thu, 2 Dec 2010 11:15:46 +0200 Subject: [PATCH 1/5] ENH: Find libcv.so.2.1 in addition to just libcv.so. --- scikits/image/opencv/_libimport.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scikits/image/opencv/_libimport.py b/scikits/image/opencv/_libimport.py index b5a2d924..1d1a791d 100644 --- a/scikits/image/opencv/_libimport.py +++ b/scikits/image/opencv/_libimport.py @@ -32,7 +32,7 @@ def _import_opencv_lib(which="cv"): ] if sys.platform.startswith('linux'): - extensions = ['.so', '.so.1'] + extensions = ['.so', '.so.2.1', '.so.1'] elif sys.platform.startswith("darwin"): extensions = ['.dylib'] else: From f8a3ea48bd6c2577dbe6d905a924f0625825eec6 Mon Sep 17 00:00:00 2001 From: Stefan van der Walt Date: Thu, 2 Dec 2010 11:16:40 +0200 Subject: [PATCH 2/5] DOC: Wrappers are now for OpenCV 2.1. --- DEPENDS.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DEPENDS.txt b/DEPENDS.txt index 578815bf..38d394b0 100644 --- a/DEPENDS.txt +++ b/DEPENDS.txt @@ -14,7 +14,7 @@ Optional Requirements You can use this scikit with the basic requirements listed above, but some functionality is only available with the following installed: -`Open CV `_ (>= 2.0). +`Open CV `_ (version 2.1). Required for functions in ``scikits.image.opencv``. `PyQt4 `_ From c11a226261ba4566b230c79c1e2036d37e56f522 Mon Sep 17 00:00:00 2001 From: Stefan van der Walt Date: Thu, 2 Dec 2010 13:48:00 +0200 Subject: [PATCH 3/5] ENH: Fix cvUndistort2 according to OpenCV 2.1 calling convention. --- scikits/image/opencv/opencv_cv.pyx | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/scikits/image/opencv/opencv_cv.pyx b/scikits/image/opencv/opencv_cv.pyx index c728eeb7..fb10f255 100644 --- a/scikits/image/opencv/opencv_cv.pyx +++ b/scikits/image/opencv/opencv_cv.pyx @@ -275,7 +275,7 @@ c_cvCalibrateCamera2 = ( ctypes.addressof(cv.cvCalibrateCamera2))[0] # cvUndistort2 -ctypedef void (*cvUndistort2Ptr)(IplImage*, IplImage*, CvMat*, CvMat*) +ctypedef void (*cvUndistort2Ptr)(IplImage*, IplImage*, CvMat*, CvMat*, CvMat*) cdef cvUndistort2Ptr c_cvUndistort2 c_cvUndistort2 = (ctypes.addressof(cv.cvUndistort2))[0] @@ -2241,7 +2241,7 @@ def cvCalibrateCamera2(np.ndarray object_points, np.ndarray image_points, #------------- @cvdoc(package='cv', group='calibration', doc=\ -'''cvUndistort2(src, intrinsics, distortions) +'''cvUndistort2(src, intrinsics, distortions, new_intrinsics=None) Undistorts an image given the camera intrinsics matrix and distortions vector. These values can be calculated using cvCalibrateCamera2. @@ -2254,13 +2254,16 @@ intrinsics : ndarray, 3x3, dtype=float64 The camera intrinsics matrix. distortions : ndarray, 5-vector, dtype=float64 The camera distortion coefficients. +new_intrinsics : ndarray, 3x3, dtype=float64, optional + Determine the subset of the source image that is visible after + correction. Returns ------- out : ndarray The undistorted image the same size and dtype as the source image.''') -def cvUndistort2(src, intrinsics, distortions): +def cvUndistort2(src, intrinsics, distortions, new_intrinsics=None): validate_array(src) assert_dtype(intrinsics, [FLOAT64]) assert_dtype(distortions, [FLOAT64]) @@ -2278,19 +2281,26 @@ def cvUndistort2(src, intrinsics, distortions): cdef IplImage outimg cdef IplImage intrimg cdef IplImage distimg + cdef IplImage new_intrinsics_img populate_iplimage(src, &srcimg) populate_iplimage(out, &outimg) populate_iplimage(intrinsics, &intrimg) populate_iplimage(distortions, &distimg) + cdef CvMat* cvnew_intrinsics = NULL cdef CvMat* cvintr = cvmat_ptr_from_iplimage(&intrimg) cdef CvMat* cvdist = cvmat_ptr_from_iplimage(&distimg) - c_cvUndistort2(&srcimg, &outimg, cvintr, cvdist) + if new_intrinsics is not None: + populate_iplimage(new_intrinsics, &new_intrinsics_img) + cvnew_intrinsics = cvmat_ptr_from_iplimage(&new_intrinsics_img) + + c_cvUndistort2(&srcimg, &outimg, cvintr, cvdist, cvnew_intrinsics) PyMem_Free(cvintr) PyMem_Free(cvdist) + PyMem_Free(cvnew_intrinsics) return out From 31e1edfb57c6b27744aaf2438e6214e3099de734 Mon Sep 17 00:00:00 2001 From: Stefan van der Walt Date: Thu, 2 Dec 2010 13:48:27 +0200 Subject: [PATCH 4/5] ENH: Add test for cvUndistort2 with new intrinsics provided. --- scikits/image/opencv/tests/test_opencv_cv.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/scikits/image/opencv/tests/test_opencv_cv.py b/scikits/image/opencv/tests/test_opencv_cv.py index f09fbf99..681539d6 100644 --- a/scikits/image/opencv/tests/test_opencv_cv.py +++ b/scikits/image/opencv/tests/test_opencv_cv.py @@ -304,6 +304,21 @@ class TestUndistort2(OpenCVTest): assert_array_almost_equal(undist, self.lena_RGB_U8) assert_array_almost_equal(undistg, self.lena_GRAY_U8) + @opencv_skip + def test_cvUndistort2_new_intrinsics(self): + intrinsics = np.array([[1, 0, 0], + [0, 1, 0], + [0, 0, 1]], dtype='float64') + distortions = np.array([0., 0., 0., 0., 0.], dtype='float64') + + undist = cvUndistort2(self.lena_RGB_U8, intrinsics, distortions, + intrinsics) + undistg = cvUndistort2(self.lena_GRAY_U8, intrinsics, distortions, + intrinsics) + + assert_array_almost_equal(undist, self.lena_RGB_U8) + assert_array_almost_equal(undistg, self.lena_GRAY_U8) + From bf6dd96773793679eb5c5302939365d3b7b8d5f9 Mon Sep 17 00:00:00 2001 From: Stefan van der Walt Date: Thu, 2 Dec 2010 13:49:15 +0200 Subject: [PATCH 5/5] ENH: Add parameter checking for cvCalibrateCamera2. --- scikits/image/opencv/opencv_cv.pyx | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/scikits/image/opencv/opencv_cv.pyx b/scikits/image/opencv/opencv_cv.pyx index fb10f255..a47819b3 100644 --- a/scikits/image/opencv/opencv_cv.pyx +++ b/scikits/image/opencv/opencv_cv.pyx @@ -2185,6 +2185,19 @@ def cvCalibrateCamera2(np.ndarray object_points, np.ndarray image_points, assert_dtype(point_counts, [INT32]) assert_ndims(point_counts, [1]) + if not object_points.shape[1] == 3: + raise ValueError("Object points must be Nx3") + + if not image_points.shape[1] == 2: + raise ValueError("Image points must be Nx2") + + if not len(image_points) == len(object_points): + raise ValueError("Must provide same number of image and object points.") + + if np.sum(point_counts) != len(image_points): + raise ValueError("Point counts must sum to length of image_points " + "(is %d must be %d)." % (np.sum(point_counts), len(image_points))) + # Allocate a new intrinsics array cdef np.npy_intp intrinsics_shape[2] intrinsics_shape[0] = 3