2019-03-06

2019-03-06  本文已影响0人  qinxing

围,一起努力吧~

工作

BUG:手动增益不能连续增大

现象:从web端将增益快门改成手动,会发现随着增益的增大,图片亮度先递增,到了54时,图片瞬间变暗,再继续递增。
思路:从增益从上到下传递的地方推断出可能会改变的地方:
业务--ispctrl层--hal层--camera层的aec输出(aec.biz)--camera层的sensor模块的(设置)--写入寄存器
过程:经过排查发现随着web界面上增益的增大,aec的输出是逐步增大的,对sensor模块进行打印,发现寄存器写入的值也是正确的。怀疑是寄存器初始化有问题,和8056平台的IMX385进行比较,没有找到异常。查看手册,发现相比于290,增益寄存器是两个字节组成的,而web界面上的53对应的是0xff,54对应的是0x100,猜测可能是寄存器只写了低八位。

image.png
查看代码:
    reg_setting->reg_setting[reg_count].reg_addr =
    sensor_lib_ptr.exp_gain_info.global_gain_addr;
    reg_setting->reg_setting[reg_count].reg_data = gain & 0xFF;
    reg_setting->reg_setting[reg_count].delay = 0;
    reg_count = reg_count + 1;

发现代码真的仅仅对地址0x3014h进行了赋值,没有将高八位赋值。
增加代码:

    reg_setting->reg_setting[reg_count].reg_addr =
    sensor_lib_ptr.exp_gain_info.global_gain_addr+1;
    reg_setting->reg_setting[reg_count].reg_data = (gain & 0x100) >> 8;
    reg_setting->reg_setting[reg_count].delay = 0;
    reg_count = reg_count + 1;

解决问题。但是需要注意代码中reg_setting[reg_count]reg_count是否进行初始化,是否会出现数组溢出的问题?此处没有细查。
小结
对增益从web端的传递到寄存器的过程加深了理解。

帮助对日夜切换代码修改

  1. 将结构体从HAL层的qcameraparameter传递到qcameraHWI。实现了按值传递和按地址传递,最终选择按地址传递。
  2. 定位日夜切换代码会对ISP传递过来的参数造成影响的BUG
    小结:由于高通将每个模块的变量都分离开来,不能随意获取,同样每个模块的函数也不能随意使用,可能会将这个模块中定义的实例又刷新一遍

学习

参考博客制作在线相册,希望实现目标:

  1. 由于使用的七牛网图片,希望实现在线加载所有图片(不用每每次上传图片都对网站有所更改)
  2. 实现瀑布流相册效果(不会对图片进行裁切)
  3. 预览是缩略图,点开是原图(加快网页加载速度)

图片列表获取

我这里先用Python获取到七牛云上相应的bucket的列表。可以很容易的获得到所有的文件名列表。
但希望同时获得图片大小,这样可以用JavaScript对图片进行相应比例的缩放。但发现直接获取的图片数据要么不全,要么太大,导致加载速度太慢。
因此考虑在上传的时候将图片重命名,或者加上exif信息,这样在线获取图片大小就快多了。

# -*- coding: utf-8 -*-
# flake8: noqa
from qiniu import Auth
from qiniu import BucketManager
from qiniu import build_batch_stat
import requests
import ast
import time
access_key = 'ymnOv5ZzF9x5oPDWKqCZiTWB2QERX-GB6DnyaWaL'
secret_key = 'NIDcseYMO-u-4WZv0VFqJhPkn_wHwsDTeCXHq9r8'
q = Auth(access_key, secret_key)
bucket = BucketManager(q)
bucket_name = 'album'
#参数设置
# 前缀
prefix = None
# 列举条目-None代表所有
limit = None
# 列举出除'/'的所有文件以及以'/'为分隔的所有前缀
delimiter = None
# 标记
marker = None
now_time = time.time()
ret, eof, info = bucket.list(bucket_name, prefix, marker, limit, delimiter)

print('getBuckFile\n')
# print(info)
assert len(ret.get('items')) is not None
# info中的text_body才是我们想要的内容,但是是字符串 字符串转dict比较麻烦,
# 需要通过ast.literal_eval转成dict类型
# 我们发现ret是dict类型,里面的items的值是一个list
# 每个list代表了每个文件,每个文件又是是dict类型
# VScode debug时可以将鼠标悬停,查看变量属性;用spyder更加方便一点
filelist = []
for filename in ret.get('items'):
    filelist.append(filename.get('key'))
now_time = time.time() - now_time
print('get bucket time:'+str(now_time))

ops = build_batch_stat(bucket_name, filelist)
ret, info = bucket.batch(ops)
now_time = time.time() - now_time
print('get bucket info time:'+str(now_time))

ret, info = bucket.stat(bucket_name, filelist[0])
now_time = time.time() - now_time
print('get file exif time:'+str(now_time))
# print(ret)
bucket_address = 'http://pnbj1h9rr.bkt.clouddn.com/'
exif = '?exif'
# for...in..循环不能修改list的值;用list下标查找就可以修改list的值
"""
for count in range(len(filelist)):
    r = requests.get(bucket_address+filelist[count]+exif)
    p = ast.literal_eval(r.text)
    if 'PixelXDimension' in p:
        filelist[count] += ' '+str(p.get('PixelXDimension').get('val'))+ \
            ' '+ str(p.get('PixelYDimension').get('val'))
print(filelist)
"""
imageinfo='?imageinfo'
r=requests.get(bucket_address+filelist[20]+imageinfo)
now_time = time.time() - now_time
print('get imageinfo time:'+str(now_time))

print(r.content)
now_time = time.time() - now_time
print('print text time:'+str(now_time))

小结

  1. VScode debug时可以将鼠标悬停,查看变量属性;用spyder更加方便一点
  2. for...in..循环不能修改list的值;用list下标查找就可以修改list的值
  3. 可以通过ast.literal_eval将字符串转成dict类型
上一篇下一篇

猜你喜欢

热点阅读