1 # Copyright 2013 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 from matplotlib import pylab 19 import os.path 20 import matplotlib 21 import matplotlib.pyplot 22 23 def main(): 24 """Test that BLC and LSC look reasonable. 25 """ 26 NAME = os.path.basename(__file__).split(".")[0] 27 28 r_means_center = [] 29 g_means_center = [] 30 b_means_center = [] 31 r_means_corner = [] 32 g_means_corner = [] 33 b_means_corner = [] 34 35 with its.device.ItsSession() as cam: 36 props = cam.get_camera_properties() 37 expt_range = props['android.sensor.info.exposureTimeRange'] 38 39 # Get AE+AWB lock first, so the auto values in the capture result are 40 # populated properly. 41 r = [[0,0,1,1,1]] 42 ae_sen,ae_exp,awb_gains,awb_transform,_ \ 43 = cam.do_3a(r,r,r,do_af=False,get_results=True) 44 print "AE:", ae_sen, ae_exp / 1000000.0 45 print "AWB:", awb_gains, awb_transform 46 47 # Set analog gain (sensitivity) to 800 48 ae_exp = ae_exp * ae_sen / 800 49 ae_sen = 800 50 51 # Capture range of exposures from 1/100x to 4x of AE estimate. 52 exposures = [ae_exp*x/100.0 for x in [1]+range(10,401,40)] 53 exposures = [e for e in exposures 54 if e >= expt_range[0] and e <= expt_range[1]] 55 56 # Convert the transform back to rational. 57 awb_transform_rat = its.objects.float_to_rational(awb_transform) 58 59 # Linear tonemap 60 tmap = sum([[i/63.0,i/63.0] for i in range(64)], []) 61 62 reqs = [] 63 for e in exposures: 64 req = its.objects.manual_capture_request(ae_sen,e) 65 req["android.tonemap.mode"] = 0 66 req["android.tonemap.curve"] = { 67 "red": tmap, "green": tmap, "blue": tmap} 68 req["android.colorCorrection.transform"] = awb_transform_rat 69 req["android.colorCorrection.gains"] = awb_gains 70 reqs.append(req) 71 72 caps = cam.do_capture(reqs) 73 for i,cap in enumerate(caps): 74 img = its.image.convert_capture_to_rgb_image(cap) 75 its.image.write_image(img, "%s_i=%d.jpg"%(NAME, i)) 76 77 tile_center = its.image.get_image_patch(img, 0.45, 0.45, 0.1, 0.1) 78 rgb_means = its.image.compute_image_means(tile_center) 79 r_means_center.append(rgb_means[0]) 80 g_means_center.append(rgb_means[1]) 81 b_means_center.append(rgb_means[2]) 82 83 tile_corner = its.image.get_image_patch(img, 0.0, 0.0, 0.1, 0.1) 84 rgb_means = its.image.compute_image_means(tile_corner) 85 r_means_corner.append(rgb_means[0]) 86 g_means_corner.append(rgb_means[1]) 87 b_means_corner.append(rgb_means[2]) 88 89 fig = matplotlib.pyplot.figure() 90 pylab.plot(exposures, r_means_center, 'r') 91 pylab.plot(exposures, g_means_center, 'g') 92 pylab.plot(exposures, b_means_center, 'b') 93 pylab.ylim([0,1]) 94 matplotlib.pyplot.savefig("%s_plot_means_center.png" % (NAME)) 95 96 fig = matplotlib.pyplot.figure() 97 pylab.plot(exposures, r_means_corner, 'r') 98 pylab.plot(exposures, g_means_corner, 'g') 99 pylab.plot(exposures, b_means_corner, 'b') 100 pylab.ylim([0,1]) 101 matplotlib.pyplot.savefig("%s_plot_means_corner.png" % (NAME)) 102 103 if __name__ == '__main__': 104 main() 105 106