test_predicted_wb.py revision d7dfa1e033245cb60aec98210b6e1d428e4227d6
1d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight# Copyright 2013 The Android Open Source Project
2d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight#
3d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight# Licensed under the Apache License, Version 2.0 (the "License");
4d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight# you may not use this file except in compliance with the License.
5d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight# You may obtain a copy of the License at
6d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight#
7d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight#      http://www.apache.org/licenses/LICENSE-2.0
8d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight#
9d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight# Unless required by applicable law or agreed to in writing, software
10d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight# distributed under the License is distributed on an "AS IS" BASIS,
11d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight# See the License for the specific language governing permissions and
13d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight# limitations under the License.
14d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight
15d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knightimport its.image
16d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knightimport its.device
17d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knightimport its.objects
18d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knightimport os.path
19d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knightimport pprint
20d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knightimport math
21d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knightimport numpy
22d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knightimport matplotlib.pyplot
23d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knightimport mpl_toolkits.mplot3d
24d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight
25d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knightdef main():
26d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight    """Test that valid data comes back in CaptureResult objects.
27d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight    """
28d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight    NAME = os.path.basename(__file__).split(".")[0]
29d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight
30d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight    def r2f(r):
31d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        return float(r["numerator"]) / float(r["denominator"])
32d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight
33d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight    if not its.device.reboot_device_on_argv():
34d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        its.device.reboot_device()
35d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight
36d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight    # Run a first pass, which starts with a 3A convergence step.
37d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight    with its.device.ItsSession() as cam:
38d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        # Get 3A lock first, so the auto values in the capture result are
39d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        # populated properly.
40d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        r = [0,0,1,1]
41d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        sens,exp,awb_gains,awb_transform,_ = cam.do_3a(r,r,r,True,True,False)
42d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight
43d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        # Capture an auto shot using the converged 3A.
44d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        req = its.objects.auto_capture_request()
45d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        fname, w, h, md_obj = cam.do_capture(req)
46d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        img = its.image.load_yuv420_to_rgb_image(fname, w, h)
47d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        its.image.write_image(img, "%s_n=1_pass=1_auto.jpg" % (NAME))
48d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        cap_res = md_obj["captureResult"]
49d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        auto_gains = cap_res["android.colorCorrection.gains"]
50d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        auto_transform = cap_res["android.colorCorrection.transform"]
51d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight
52d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        # Capture a request using default (unit/identify) gains, and get the
53d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        # predicted gains and transform.
54d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        req = its.objects.manual_capture_request(sens, exp/(1000.0*1000.0))
55d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        fname, w, h, md_obj = cam.do_capture(req)
56d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        img = its.image.load_yuv420_to_rgb_image(fname, w, h)
57d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        its.image.write_image(img, "%s_n=2_pass=1_identity.jpg" % (NAME))
58d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        cap_res = md_obj["captureResult"]
59d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        pred_gains_1 = cap_res["android.statistics.predictedColorGains"]
60d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        pred_transform_1 = cap_res["android.statistics.predictedColorTransform"]
61d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight
62d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        # Capture a request using the predicted gains/transform.
63d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        req = its.objects.manual_capture_request(sens, exp/(1000.0*1000.0))
64d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        req["captureRequest"]["android.colorCorrection.transform"] = \
65d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight                pred_transform_1
66d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        req["captureRequest"]["android.colorCorrection.gains"] = pred_gains_1
67d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        fname, w, h, md_obj = cam.do_capture(req)
68d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        img = its.image.load_yuv420_to_rgb_image(fname, w, h)
69d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        its.image.write_image(img, "%s_n=3_pass=1_predicted.jpg" % (NAME))
70d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight
71d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        print "Pass 1 metering gains:", awb_gains
72d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        print "Pass 1 metering transform:", awb_transform
73d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        print "Pass 1 auto shot gains:", auto_gains
74d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        print "Pass 1 auto shot transform:", [r2f(t) for t in auto_transform]
75d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        print "Pass 1 predicted gains:", pred_gains_1
76d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        print "Pass 1 predicted transform:", [r2f(t) for t in pred_transform_1]
77d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight
78d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight    if not its.device.reboot_device_on_argv():
79d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        its.device.reboot_device()
80d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight
81d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight    # Run a second pass after rebooting that doesn't start with 3A convergence.
82d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight    with its.device.ItsSession() as cam:
83d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        # Capture a request using default (unit/identify) gains, and get the
84d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        # predicted gains and transform.
85d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        req = its.objects.manual_capture_request(sens, exp/(1000.0*1000.0))
86d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        fname, w, h, md_obj = cam.do_capture(req)
87d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        img = its.image.load_yuv420_to_rgb_image(fname, w, h)
88d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        its.image.write_image(img, "%s_n=4_pass=2_identity.jpg" % (NAME))
89d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        cap_res = md_obj["captureResult"]
90d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        pred_gains_2 = cap_res["android.statistics.predictedColorGains"]
91d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        pred_transform_2 = cap_res["android.statistics.predictedColorTransform"]
92d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight
93d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        # Capture a request using the predicted gains/transform.
94d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        req = its.objects.manual_capture_request(sens, exp/(1000.0*1000.0))
95d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        req["captureRequest"]["android.colorCorrection.transform"] = \
96d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight                pred_transform_2
97d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        req["captureRequest"]["android.colorCorrection.gains"] = pred_gains_2
98d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        fname, w, h, md_obj = cam.do_capture(req)
99d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        img = its.image.load_yuv420_to_rgb_image(fname, w, h)
100d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        its.image.write_image(img, "%s_n=5_pass=2_predicted.jpg" % (NAME))
101d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight
102d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        print "Pass 2 predicted gains:", pred_gains_2
103d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight        print "Pass 2 predicted transform:", [r2f(t) for t in pred_transform_2]
104d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight
105d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knightif __name__ == '__main__':
106d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight    main()
107d7dfa1e033245cb60aec98210b6e1d428e4227d6Timothy Knight
108