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 `_ 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: diff --git a/scikits/image/opencv/opencv_cv.pyx b/scikits/image/opencv/opencv_cv.pyx index c728eeb7..a47819b3 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] @@ -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 @@ -2241,7 +2254,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 +2267,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 +2294,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 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) +