Home | History | Annotate | Download | only in scene1
      1 # Copyright 2014 The Android Open Source Project
      2 #
      3 # Licensed under the Apache License, Version 2.0 (the "License");
      4 # you may not use this file except in compliance with the License.
      5 # You may obtain a copy of the License at
      6 #
      7 #      http://www.apache.org/licenses/LICENSE-2.0
      8 #
      9 # Unless required by applicable law or agreed to in writing, software
     10 # distributed under the License is distributed on an "AS IS" BASIS,
     11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12 # See the License for the specific language governing permissions and
     13 # limitations under the License.
     14 
     15 import its.image
     16 import its.device
     17 import its.objects
     18 import its.caps
     19 import os.path
     20 import numpy
     21 import pylab
     22 import matplotlib
     23 import matplotlib.pyplot
     24 
     25 def main():
     26     """Test 3A lock + YUV burst (using auto settings).
     27 
     28     This is a test that is designed to pass even on limited devices that
     29     don't have MANUAL_SENSOR or PER_FRAME_CONTROLS. The test checks
     30     YUV image consistency while the frame rate check is in CTS.
     31     """
     32     NAME = os.path.basename(__file__).split(".")[0]
     33 
     34     BURST_LEN = 8
     35     SPREAD_THRESH_MANUAL_SENSOR = 0.01
     36     SPREAD_THRESH = 0.03
     37     FPS_MAX_DIFF = 2.0
     38 
     39     with its.device.ItsSession() as cam:
     40         props = cam.get_camera_properties()
     41         its.caps.skip_unless(its.caps.ae_lock(props) and
     42                              its.caps.awb_lock(props))
     43 
     44         # Converge 3A prior to capture.
     45         cam.do_3a(do_af=True, lock_ae=True, lock_awb=True)
     46 
     47         # After 3A has converged, lock AE+AWB for the duration of the test.
     48         req = its.objects.fastest_auto_capture_request(props)
     49         req["android.control.awbLock"] = True
     50         req["android.control.aeLock"] = True
     51 
     52         # Capture bursts of YUV shots.
     53         # Get the mean values of a center patch for each.
     54         r_means = []
     55         g_means = []
     56         b_means = []
     57         caps = cam.do_capture([req]*BURST_LEN)
     58         for i,cap in enumerate(caps):
     59             img = its.image.convert_capture_to_rgb_image(cap)
     60             its.image.write_image(img, "%s_frame%d.jpg"%(NAME,i))
     61             tile = its.image.get_image_patch(img, 0.45, 0.45, 0.1, 0.1)
     62             means = its.image.compute_image_means(tile)
     63             r_means.append(means[0])
     64             g_means.append(means[1])
     65             b_means.append(means[2])
     66 
     67         # Pass/fail based on center patch similarity.
     68         for means in [r_means, g_means, b_means]:
     69             spread = max(means) - min(means)
     70             print "Patch mean spread", spread, \
     71                     " (min/max: ",  min(means), "/", max(means), ")"
     72             threshold = SPREAD_THRESH_MANUAL_SENSOR \
     73                     if its.caps.manual_sensor(props) else SPREAD_THRESH
     74             assert(spread < threshold)
     75 
     76 if __name__ == '__main__':
     77     main()
     78 
     79