diff options
Diffstat (limited to 'src/test/checkcamera.py')
-rwxr-xr-x | src/test/checkcamera.py | 225 |
1 files changed, 225 insertions, 0 deletions
diff --git a/src/test/checkcamera.py b/src/test/checkcamera.py new file mode 100755 index 0000000..1146679 --- /dev/null +++ b/src/test/checkcamera.py @@ -0,0 +1,225 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# libavg - Media Playback Engine. +# Copyright (C) 2003-2014 Ulrich von Zadow +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# Current versions can be found at www.libavg.de +# +# Original author of this file is Robert Parcus <betoparcus@gmail.com> +# + +from libavg import * +import camcfgs +import optparse + +from testcase import * + +def parseCmdLine(): + global g_TestParams + + validCameras = ('Dragonfly', 'FireflyMV', 'Firei', 'DFx31BF03', 'QuickCamProLinux', + 'QuickCamProBGRWin', 'QuickCamPro9Win') + parser = optparse.OptionParser(usage= +"""%prog cameraname [option]. +A test to check camera features support by libavg. Supported cameras are """ ++ str(validCameras)) +# parser.add_argument(dest='camera', action='store', type=str, +# choices=validCameras, help = 'Select which camera model to test.') + parser.add_option('--test-params', '-p', dest='testParams', action='store_true', + default=False, + help='Execute optional tests for camera params like gain, shutter, etc.') + (options, args) = parser.parse_args() + g_TestParams = options.testParams + if len(args) != 1: + parser.error("Must be invoked with camera name as argument") + cameraName = args[0] + if cameraName == 'Dragonfly': + return camcfgs.Dragonfly2 + elif cameraName == 'FireflyMV': + return camcfgs.FireflyMV + elif cameraName == 'Firei': + return camcfgs.Firei + elif cameraName == 'DFx31BF03': + return camcfgs.DFx31BF03Cfg + elif cameraName == 'QuickCamProLinux': + return camcfgs.QuickCamProLinux + elif cameraName == 'QuickCamPro9Win': + return camcfgs.QuickCamPro9Win + elif cameraName == 'QuickCamProBGRWin': + return camcfgs.QuickCamProBGRWin + else: + parser.error("Unknown camera name '" + cameraName + "'.") + +class CameraTestCase(AVGTestCase): + def __init__(self, cameraCfg, fmt, testFuncName, *testFuncArgs): + self.cameraCfg = cameraCfg + self.fmt = fmt + self.testFuncArgs = testFuncArgs + AVGTestCase.__init__(self, testFuncName) + + def testFormat(self): + self.__dumpFormat() + self.loadEmptyScene() + self.__openCamera() + self.actions = [None, None] + avg.player.setOnFrameHandler(self.__onFrame) + avg.player.play() + self.assertEqual(self.cam.framenum, 2) + self.cam = None + + def testIllegalFormat(self): + self.loadEmptyScene() + self.assertException(lambda: self.__openCamera()) + + def testCreateDelete(self): + # Create and delete without ever calling play. + self.__openCamera() + self.cam.unlink(True) + + def testParams(self): + def buildParamActionList(testCfg): + actions = [] + actions.append(setDefaultParams) + actions.append(None) + for val in testCfg.testValues: + actions.append(lambda paramName=testCfg.name, val=val: + setCamParam(paramName, val)) + actions.append(None) + actions.append(None) + actions.append(None) + actions.append(lambda name=testCfg.name: calcCamImgAverage(name)) + actions.append(lambda testCfg=testCfg: checkCamImageChange(testCfg)) + return actions + + def setDefaultParams(): + for (paramName, val) in cameraCfg.defaultParams.iteritems(): + if paramName == "setWhitebalance": + self.cam.setWhitebalance(*val) + else: + setattr(self.cam, paramName, val) + + def setCamParam(paramName, val): + if paramName == 'setwhitebalance': + self.cam.setWhitebalance(*val) + else: + setattr(self.cam, paramName, val) + + def calcCamImgAverage(param): + bmp = self.cam.getBitmap() + self.camBmps.append(bmp) + if isColorParam(param): + colour = [] + colour.append(bmp.getChannelAvg(0)) + colour.append(bmp.getChannelAvg(1)) + colour.append(bmp.getChannelAvg(2)) + self.averages.append(colour) + else: + self.averages.append(bmp.getAvg()) + + def checkCamImageChange(testCfg): + + def saveCamImages(): +# print +# print "Average image brightnesses: ",minAverages, medAverages, maxAverages + dir = AVGTestCase.getImageResultDir() + for (i, category) in enumerate(("min", "med", "max")): + self.camBmps[i].save(dir+"/cam"+testCfg.name+category+".png") + + minAverages = self.averages[0] + medAverages = self.averages[1] + maxAverages = self.averages[2] + ok = False + if isColorParam(testCfg.name): + pass + else: + if minAverages+testCfg.minMedDiff > medAverages: + saveCamImages() + self.fail() + if medAverages+testCfg.medMaxDiff > maxAverages: + saveCamImages() + self.fail() + self.averages = [] + self.camBmps = [] + + def isColorParam(paramName): + return paramName in ['saturation', 'setwhitebalance'] + + testCfg = self.testFuncArgs[0] + print >>sys.stderr, testCfg.name, " ", + self.loadEmptyScene() + self.__openCamera() + self.actions = buildParamActionList(testCfg) + avg.player.setOnFrameHandler(self.__onFrame) + self.averages = [] + self.camBmps = [] + avg.player.play() + self.cam = None + + def __openCamera(self): + self.cam = avg.CameraNode(driver=self.cameraCfg.driver, + device=self.cameraCfg.device, unit=self.cameraCfg.unit, + fw800=self.cameraCfg.fw800, framerate=self.fmt.framerate, + capturewidth=self.fmt.size[0], captureheight=self.fmt.size[1], + pixelformat=self.fmt.pixelformat, + parent=avg.player.getRootNode()) + self.cam.play() + self.lastCameraFrame = -1 + self.assert_(self.cam.isAvailable()) + + def __onFrame(self): + # We execute one action per camera frame. +# print self.cam.framenum + if self.cam.framenum != self.lastCameraFrame: + self.lastCameraFrame += 1 + if len(self.actions) == self.lastCameraFrame: + avg.player.stop() + else: + action = self.actions[self.lastCameraFrame] + if action != None: + action() + + def __dumpFormat(self): + print >>sys.stderr, str(self.fmt.size)+", "+str(self.fmt.pixelformat)+ \ + ", "+str(self.fmt.framerate)+" ", + +def dumpCameraCfg(cfg): + print >>sys.stderr, "Camera config: driver="+cfg.driver+", device="+cfg.device+ \ + ", unit="+str(cfg.unit) + + +cameraCfg = parseCmdLine() +AVGTestCase.cleanResultDir() +suite = unittest.TestSuite() +dumpCameraCfg(cameraCfg) +for fmt in cameraCfg.formats: + suite.addTest(CameraTestCase(cameraCfg, fmt, "testFormat")) +suite.addTest(CameraTestCase(cameraCfg, cameraCfg.illegalFormat, "testIllegalFormat")) +suite.addTest(CameraTestCase(cameraCfg, cameraCfg.formats[0], "testCreateDelete")) +if g_TestParams: + for testCfg in cameraCfg.paramTests: + suite.addTest(CameraTestCase(cameraCfg, cameraCfg.formats[0], "testParams", + testCfg)) +testRunner = unittest.TextTestRunner(verbosity = 2) +testResult = testRunner.run(suite) + +if testResult.wasSuccessful(): + exitCode = 0 +else: + exitCode = 1 +sys.exit(exitCode) + + |