Update to 2.0.0 tree from current Fremantle build
[opencv] / tests / swig_python / test_adaptors.py
diff --git a/tests/swig_python/test_adaptors.py b/tests/swig_python/test_adaptors.py
new file mode 100755 (executable)
index 0000000..449dd38
--- /dev/null
@@ -0,0 +1,113 @@
+#!/usr/bin/env python
+
+"""A simple TestCase class for testing the adaptors.py module.
+
+2007-11-xx, Vicent Mas <vmas@carabos.com> Carabos Coop. V.
+2007-11-08, minor modifications for distribution, Mark Asbach <asbach@ient.rwth-aachen.de>
+"""
+
+import unittest
+import os
+
+import PIL.Image
+import numpy
+
+import cvtestutils
+import cv
+import highgui
+import adaptors
+
+import sys
+
+class AdaptorsTestCase(unittest.TestCase):
+    def test00_array_interface(self):
+        """Check if PIL supports the array interface."""
+        self.assert_(PIL.Image.VERSION>='1.1.6',
+            """The installed PIL library doesn't support the array """
+            """interface. Please, update to version 1.1.6b2 or higher.""")
+
+
+    def test01_PIL2NumPy(self):
+        """Test the adaptors.PIL2NumPy function."""
+
+        a = adaptors.PIL2NumPy(self.pil_image)
+        self.assert_(a.flags['WRITEABLE'] == True,
+            'PIL2NumPy should return a writeable array.')
+        b = numpy.asarray(self.pil_image)
+        self.assert_((a == b).all() == True,
+            'The returned numpy array has not been properly constructed.')
+
+
+    def test02_NumPy2PIL(self):
+        """Test the adaptors.NumPy2PIL function."""
+
+        a = numpy.asarray(self.pil_image)
+        b = adaptors.NumPy2PIL(a)
+        self.assert_(self.pil_image.tostring() == b.tostring(),
+            'The returned image has not been properly constructed.')
+
+
+    def test03_Ipl2PIL(self):
+        """Test the adaptors.Ipl2PIL function."""
+    
+        i = adaptors.Ipl2PIL(self.ipl_image)
+        self.assert_(self.pil_image.tostring() == i.tostring(),
+            'The returned image has not been properly constructed.')
+
+
+    def test04_PIL2Ipl(self):
+        """Test the adaptors.PIL2Ipl function."""
+
+        i = adaptors.PIL2Ipl(self.pil_image)
+        self.assert_(self.ipl_image.imageData == i.imageData,
+            'The returned image has not been properly constructed.')
+
+
+    def test05_Ipl2NumPy(self):
+        """Test the adaptors.Ipl2NumPy function."""
+    
+        a = adaptors.Ipl2NumPy(self.ipl_image)
+        a_1d = numpy.reshape(a, (a.size, ))
+        # For 3-channel IPL images  the order of channels will be BGR
+        # but NumPy array order of channels will be RGB so a conversion
+        # is needed before we can compare both images
+        if self.ipl_image.nChannels == 3:
+            rgb = cv.cvCreateImage(cv.cvSize(self.ipl_image.width, self.ipl_image.height), self.ipl_image.depth, 3)
+            cv.cvCvtColor(self.ipl_image, rgb, cv.CV_BGR2RGB)
+            self.assert_(a_1d.tostring() == rgb.imageData,
+                'The returned image has not been properly constructed.')
+        else:
+            self.assert_(a_1d.tostring() == self.ipl_image.imageData,
+                'The returned image has not been properly constructed.')
+
+
+    def test06_NumPy2Ipl(self):
+        """Test the adaptors.NumPy2Ipl function."""
+
+        a = adaptors.Ipl2NumPy(self.ipl_image)
+        b = adaptors.NumPy2Ipl(a)
+        self.assert_(self.ipl_image.imageData == b.imageData,
+            'The returned image has not been properly constructed.')
+
+    def load_image( self, fname ):
+        self.ipl_image = highgui.cvLoadImage(fname, 4|2)
+        self.pil_image = PIL.Image.open(fname, 'r')
+
+class AdaptorsTestCase1(AdaptorsTestCase):
+    def setUp( self ):
+        self.load_image( os.path.join(cvtestutils.datadir(),'images','cvSetMouseCallback.jpg'))
+
+class AdaptorsTestCase2(AdaptorsTestCase):
+    def setUp( self ):
+        self.load_image( os.path.join(cvtestutils.datadir(),'images','baboon.jpg'))
+
+def suite():
+    cases=[]
+    cases.append( unittest.TestLoader().loadTestsFromTestCase( AdaptorsTestCase1 ) )
+    cases.append( unittest.TestLoader().loadTestsFromTestCase( AdaptorsTestCase2 ) )
+
+    return unittest.TestSuite(cases)
+
+if __name__ == '__main__':
+        unittest.TextTestRunner(verbosity=2).run(suite())
+