#!/usr/bin/env python """A simple TestCase class for testing the adaptors.py module. 2007-11-xx, Vicent Mas Carabos Coop. V. 2007-11-08, minor modifications for distribution, Mark Asbach """ 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())