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