Home | History | Annotate | Download | only in scene3
      1 # Copyright 2015 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 os.path
     16 
     17 import its.caps
     18 import its.cv2image
     19 import its.device
     20 import its.image
     21 import its.objects
     22 import its.target
     23 
     24 import numpy
     25 
     26 NAME = os.path.basename(__file__).split(".")[0]
     27 NUM_SAMPLES = 4
     28 THRESH_REL_SHARPNESS_DIFF = 0.1
     29 
     30 
     31 def test_edge_mode(cam, edge_mode, sensitivity, exp, fd, out_surface, chart):
     32     """Return sharpness of the output image and the capture result metadata.
     33 
     34        Processes a capture request with a given edge mode, sensitivity, exposure
     35        time, focus distance, output surface parameter.
     36 
     37     Args:
     38         cam: An open device session.
     39         edge_mode: Edge mode for the request as defined in android.edge.mode
     40         sensitivity: Sensitivity for the request as defined in
     41             android.sensor.sensitivity
     42         exp: Exposure time for the request as defined in
     43             android.sensor.exposureTime.
     44         fd: Focus distance for the request as defined in
     45             android.lens.focusDistance
     46         out_surface: Specifications of the output image format and size.
     47         chart: object that contains chart information
     48 
     49     Returns:
     50         Object containing reported edge mode and the sharpness of the output
     51         image, keyed by the following strings:
     52             "edge_mode"
     53             "sharpness"
     54     """
     55 
     56     req = its.objects.manual_capture_request(sensitivity, exp)
     57     req["android.lens.focusDistance"] = fd
     58     req["android.edge.mode"] = edge_mode
     59 
     60     sharpness_list = []
     61     for n in range(NUM_SAMPLES):
     62         cap = cam.do_capture(req, out_surface, repeat_request=req)
     63         y, _, _ = its.image.convert_capture_to_planes(cap)
     64         chart.img = its.image.normalize_img(its.image.get_image_patch(
     65                 y, chart.xnorm, chart.ynorm, chart.wnorm, chart.hnorm))
     66         if n == 0:
     67             its.image.write_image(
     68                     chart.img, "%s_edge=%d.jpg" % (NAME, edge_mode))
     69             res_edge_mode = cap["metadata"]["android.edge.mode"]
     70         sharpness_list.append(its.image.compute_image_sharpness(chart.img))
     71 
     72     ret = {}
     73     ret["edge_mode"] = res_edge_mode
     74     ret["sharpness"] = numpy.mean(sharpness_list)
     75 
     76     return ret
     77 
     78 
     79 def main():
     80     """Test that the android.edge.mode param is applied correctly.
     81 
     82     Capture non-reprocess images for each edge mode and calculate their
     83     sharpness as a baseline.
     84     """
     85 
     86     with its.device.ItsSession() as cam:
     87         props = cam.get_camera_properties()
     88 
     89         its.caps.skip_unless(its.caps.read_3a(props) and
     90                              its.caps.per_frame_control(props) and
     91                              its.caps.edge_mode(props, 0))
     92 
     93     # initialize chart class and locate chart in scene
     94     chart = its.cv2image.Chart()
     95 
     96     with its.device.ItsSession() as cam:
     97         mono_camera = its.caps.mono_camera(props)
     98         test_fmt = "yuv"
     99         size = its.objects.get_available_output_sizes(test_fmt, props)[0]
    100         out_surface = {"width": size[0], "height": size[1], "format": test_fmt}
    101 
    102         # Get proper sensitivity, exposure time, and focus distance.
    103         s, e, _, _, fd = cam.do_3a(get_results=True, mono_camera=mono_camera)
    104 
    105         # Get the sharpness for each edge mode for regular requests
    106         sharpness_regular = []
    107         edge_mode_reported_regular = []
    108         for edge_mode in range(4):
    109             # Skip unavailable modes
    110             if not its.caps.edge_mode(props, edge_mode):
    111                 edge_mode_reported_regular.append(edge_mode)
    112                 sharpness_regular.append(0)
    113                 continue
    114             ret = test_edge_mode(cam, edge_mode, s, e, fd, out_surface, chart)
    115             edge_mode_reported_regular.append(ret["edge_mode"])
    116             sharpness_regular.append(ret["sharpness"])
    117 
    118         print "Reported edge modes:", edge_mode_reported_regular
    119         print "Sharpness with EE mode [0,1,2,3]:", sharpness_regular
    120 
    121         print "Verify HQ(2) is sharper than OFF(0)"
    122         assert sharpness_regular[2] > sharpness_regular[0]
    123 
    124         print "Verify OFF(0) is not sharper than FAST(1)"
    125         msg = "FAST: %.3f, OFF: %.3f, TOL: %.2f" % (
    126                 sharpness_regular[1], sharpness_regular[0],
    127                 THRESH_REL_SHARPNESS_DIFF)
    128         assert (sharpness_regular[1] >
    129                 sharpness_regular[0] * (1.0 - THRESH_REL_SHARPNESS_DIFF)), msg
    130 
    131         # Verify FAST(1) is not sharper than HQ(2)
    132         msg = "HQ: %.3f, FAST: %.3f, TOL: %.2f" % (
    133                 sharpness_regular[2], sharpness_regular[1],
    134                 THRESH_REL_SHARPNESS_DIFF)
    135         assert (sharpness_regular[2] >
    136                 sharpness_regular[1] * (1.0 - THRESH_REL_SHARPNESS_DIFF)), msg
    137 
    138 if __name__ == "__main__":
    139     main()
    140