草庐IT

相机面试问题总结

liujun3512159 2025-05-27 原文

1,Camera基本工作原理

答案: 光线通过镜头Lens进入摄像头内部,然后经过IR Filter过滤红外光,最后到达sensor(传感器),senor分为按照材质可以分为CMOS和CCD两种,可以将光学信号转换为电信号,再通过内部的ADC电路转换为数字信号,然后传输给DSP(如果有的话,如果没有则以DVP的方式传送数据到基带芯片baseband,此时的数据格式Raw Data,后面有讲进行加工)加工处理,转换成RGB、YUV等格式输出。

数据流是如何从sensor到APP的?

上述描述结束后,在ISP处理后面的阶段,数据会进行分流,分为capture,preview,video等以供后续动作使用。例如zsl拍照,就是通过下发request,并获取capture stream的数据流,进行编码压缩,进而上报APP,完成拍照动作

2,OTP是干什么的?platform otp和sensor otp的区别?

OTP用于存储Lens shading参数、AWB参数、AF position等数据的校准数据,用于校准

平台端 otp:没有otp的自校正功能,需要我们BB端(服务器)进行校校准,从存储空间(外挂eeprom或者sensor内部存储空间)中read出数据,然后将数据送给BB(BBinder)进行校准。

sensor otp:sensor有otp的自校准功能,从存储空间(外挂eeprom或者sensor内部存储空间)中read出数据,然后写回sensor寄存器,送给BB端的RawData是已经校正过的数据

3,Qcom CPP功能/MTK 数据流程

QCOM:高通CPP主要功能包括Denoise,Scale,Sharpen,Rotate

MTK:Pass1, Pass2; Pass1主要是加入tuning参数以及其他处理,Pass2主要是完成Crop,Resize、数据分流等操作

双摄同步FrameSync,AEsync
双摄verification原理?如果有问题,如何分析?(中心点,光轴,AE不同步)
是否遇到过花屏/变绿的情况,如何解决?都有哪些原因会导致该问题?尺寸不能被16整除;

4,高通平台,如何做sensor兼容?,

平台已经做好兼容,只要在camera_config.xml中配置上sensor_name即可区分不同sensor。

5,打开相机预览界面卡顿,对比正常log和卡顿log,发现在人脸识别环节处理速度较慢,导致帧率下降。

解决办法:1.更新人脸识别算法库。2.是人脸识别时跳帧处理,减少耗时。

6,简述HDR或者美颜算法的移植过程

以HDR算法为例,首先,需要在Android.mk中添加需要编译的源文件,需要加载的头文件,指定编译生成的so库.在parameters中增加hdr模式key值,在takepicture函数中从HDR算法中获取需要拍照的张数及EV值,在parameters中增加hdr模式,encodedata函数中增加进入HDR算法的入口函数m_QCameraArcHDR.init和m_QCameraArcHDR.process,将拍的三张图片帧以EV值分别为-6,0,6去处理.

7,开发过程中遇到的问题:闪光灯状态设为auto,暗环境下拍照,点击缩略图查看图片,返回相机界面迅速再拍照,闪光灯有时会不闪.

分析:查看log拍照过程中flashmode设置正确,takepicture之前和之后分别加log打印mFlashNeeded值,显示拍照之前该值为0,拍照过程中该值变成1,查看相关代码,mFlashNeeded是在metadata callback中从AE中获取的,而获取值和拍照在两个不同的线程中完成的,两个线程会出现同步不上的情况,所以会引起这个问题.

解决办法:在拍照之前,判断flashmode为auto, mFlashNeeded为0时,等待100毫秒左右的时间,让另外一个线程有时间获取mFlashNeeded值的状态.,

8,遇到的问题: 图像中有不断变化的细密的水平条纹(与荧光灯的频闪造成的大面积的滚动水平条纹不同,表现出来的是一个像素高的水平条纹状躁点,位置不固定,数量比较多,而且随光线强弱有一定的变化)

解决办法: 因为设置某些sensor寄存器的时候,会影响到这些水平条纹的颜色,所以基本上排除是在数据传输过程中板子对数据造成的干扰,也排除接触不良的可能性,应该是数据在sensor内部已经存在这些水平条纹。此外相同的初始化序列,相同的sensor,在厂商的demo版上也没有发生这种情况,所以也基本排除软件的问题。最后,发现原先为了节省硬件成本,将sensor的两个电压相同的模拟电和数字电由同一芯片输出供给,导致两者之间互相干扰,影响了sensor的正常工作

9,切某些模式后预览亮度变暗怎么分析.

排查:直接从驱动搜索sensor_fill_exposure_array接口下发的参数中的gain值和fl_line值,从实际设入sensor的参数来判断是由于iso的设定还是帧率的设定导致变暗的问题.

10,HAL3 cts (获取到的sensitivity的值和实际设定的值始终有略微的差值)

分析过程:首先看代码先确定HAL3中getsensitivity和setsensitivity对应操作到的参数具体是ISO值(也就是驱动中对应的gain值),发现每次都有略微的差值,怀疑是哪边的某种转换丢失了部分值,确定最终下到驱动的值是多少(发现和get到的值一致,也是丢了某些精度).代码从下往上排查传入sensor_fill_exposure_array的gain参数在传入前有没有什么转换(同时邮件咨询FAE驱动中有无对应转换动作),代码上看到gain在传入sensor_fill_exposure_array前(set_exposure时)经过了驱动接口的sensor_calculate_exposure函数的操作,使的gain值失去了一定的精度.咨询FAE得知是由于sensor本身并不是无级的可设置gian值,需要根据下发的gain切到对应的实际能支持的最接近的gain值上.所以和下发的gain值有了略微区别.

解决方法:针对对应sensor型号,把转换前的gain值赋值给获取sensitivity会读取的参数上.

11,sensor图像数据转换流程

sensor内部的感光芯片是按顺序排列的,光线进来通过bayer pattern后中间已经经过光信号到电信号到数字信号的转换了,然后数据开始通过MIPI从sensor传给平台,MIPI打包后(主控最前端)就得到了RAW Data。高通平台的是RAW Data经过ob,shading之后再经过Demosaic转换成了RGB,其实Demosaic就是一个插值出每个像素点R,G,B值的一个过程,之后再由ACE从RGB转换成YUV,hal层那边在通过jpegencodeconfig进行encode成jpeg数据通过回调上传给app。

12,相机专业模式倒计时开启状态下,快门时间调到3s以上,快门计时还没有结束就发出声音

在相机进行专业拍照的时候,状态机进行了改变,走的是非zsl模式,点击拍照会停止预览,然后进行非zsl拍照,可是在停止预览操作到彻底关闭通道和流数据之前查看log发现还会有帧数据进行了上传,这时候状态机是为4的状态下,callback函数那边的playshutter会进行判断,这时候状态机已经为非zsl模式,又有了帧数据,就会进行playshutter。根本原因是stoppreview关闭流和通道需要一些时间,会有一些帧数据依然回调,虽然不会进行处理,可是playshutter那边依然会发出声音。解决办法:自己新添加了一个标志位,当执行stoppreview时候将其置为1,再playshutter那边新增判断条件,不让其发出声音。

13,手动设置ISO&S连拍后,查看照片信息,发现信息显示的ISO&S数值错误

问题分析:手动设置ISO&S后,单拍发现照片信息显示正常,但是连拍照片信息显示错误,将连拍的相片散开发现,只有第一张照片显示正常,其他均错误;进一步抓log分析发现,单拍时,camera处于ZSL模式,而连拍时,camera处于非ZSL模式。

 ZSL模式:sensor通过MIPI接口将数据流传送到ISP中并分成多个相同(size不同)的流(preview流、thumbnail流、capture流),在拍照时,takepicture会从capture流中取到数据传输给APP,此时也就是说,预览和拍照处于相同全尺寸流状态,即拍照只是从流里取一张而已

  非ZSL模式:拍照时,stream off,会停止preview,takepicture从sensor获取一张图片数据传给APP,APP接收到图片后,发送一个命令给sensor,sensor会通过(preview setting、capture setting、video setting等)重新使stream on,重新preview,sensor通过MIPI接口将数据流传送到ISP中并分成多个相同(size不同)的流(preview流、thumbnail流、capture流),takepicture从capture 流获取图片数据传送给APP(故此时的图片信息与第一张图片信息会有所差异),预览是小尺寸,拍照需切换设置到全尺寸,会有一定的延时

解决方案:将连拍模式的camera模式强制转化成ZSL模式,即将hardware/qcom/camera/QCamera2/HAL/QCameraParameters.cpp中setZslMode()函数下的

if(!strcmp(str_asus_camera_mode_val,"PRO")||!strcmp(str_asus_camera_mode_val,"HDR")){}改成

if(/*!strcmp(str_asus_camera_mode_val,"PRO")||*/!strcmp(str_asus_camera_mode_val,"HDR")){}

       

有关相机面试问题总结的更多相关文章

  1. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

  2. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

    尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

  3. ruby - 通过 RVM (OSX Mountain Lion) 安装 Ruby 2.0.0-p247 时遇到问题 - 2

    我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search

  4. ruby - Fast-stemmer 安装问题 - 2

    由于fast-stemmer的问题,我很难安装我想要的任何ruby​​gem。我把我得到的错误放在下面。Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingfast-stemmer:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcreatingMakefilemake"DESTDIR="cleanmake"DESTDIR=

  5. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

    当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

  6. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  7. ruby-on-rails - 简单的 Ruby on Rails 问题——如何将评论附加到用户和文章? - 2

    我意识到这可能是一个非常基本的问题,但我现在已经花了几天时间回过头来解决这个问题,但出于某种原因,Google就是没有帮助我。(我认为部分问题在于我是一个初学者,我不知道该问什么......)我也看过O'Reilly的RubyCookbook和RailsAPI,但我仍然停留在这个问题上.我找到了一些关于多态关系的信息,但它似乎不是我需要的(尽管如果我错了请告诉我)。我正在尝试调整MichaelHartl'stutorial创建一个包含用户、文章和评论的博客应用程序(不使用脚手架)。我希望评论既属于用户又属于文章。我的主要问题是:我不知道如何将当前文章的ID放入评论Controller。

  8. 【高数】用拉格朗日中值定理解决极限问题 - 2

    首先回顾一下拉格朗日定理的内容:函数f(x)是在闭区间[a,b]上连续、开区间(a,b)上可导的函数,那么至少存在一个,使得:通过这个表达式我们可以知道,f(x)是函数的主体,a和b可以看作是主体函数f(x)中所取的两个值。那么可以有,  也就意味着我们可以用来替换 这种替换可以用在求某些多项式差的极限中。方法: 外层函数f(x)是一致的,并且h(x)和g(x)是等价无穷小。此时,利用拉格朗日定理,将原式替换为 ,再进行求解,往往会省去复合函数求极限的很多麻烦。使用要注意:1.要先找到主体函数f(x),即外层函数必须相同。2.f(x)找到后,复合部分是等价无穷小。3.要满足作差的形式。如果是加

  9. 【Java 面试合集】HashMap中为什么引入红黑树,而不是AVL树呢 - 2

    HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候

  10. SPI接收数据异常问题总结 - 2

    SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手

随机推荐