ssh框架做音乐网站,高埗镇仿做网站,建材城电商网站建设,sql网站源码问题背景
手机越做越紧凑#xff0c;需要模组和芯片尺寸越做越小#xff0c;在尺寸一定的基础上#xff0c;高像素和大像素#xff0c;对于手机摄像头来说#xff0c;一直是一对矛盾的存在。
高像素#xff1a;带来高分辨率画质大像素#xff1a;带来暗态下高感光度和…问题背景
手机越做越紧凑需要模组和芯片尺寸越做越小在尺寸一定的基础上高像素和大像素对于手机摄像头来说一直是一对矛盾的存在。
高像素带来高分辨率画质大像素带来暗态下高感光度和低噪声的画质。
以上两者都非常重要为了两者兼得4cell1感光芯片应运而生也称之为“Tetra cell”“Quad bayer”“four cell”等该芯片基于经典的Bayer阵列将每一种颜色以4个pixel排列组合成功可以让一款摄像头在高像素和大像素之间自由切换。现如今4cell1感光芯片兼具了常态的高像素和暗态的高感光低噪声的表现已经成为目前手机摄像头的主力军。 同时也带来问题如下图左边实拍图比右图多了许多齿狀格子等伪色。主要原因是芯片本身硬件感光和Remosaic造成的为了优化这种现象‘CrossTalk校准’登场去除由于信号差别造成的格子锯齿状等色块干扰。 什么是crosstalk 在感光芯片中crosstalk串扰现象是指相邻像素之间的信号互相影响导致的一种干扰。当一个像素受到光照并转换成电信号时其附近的像素可能会因为光电效应或其他物理机制而感应到部分光强这不属于它们自身的光学响应而是由于彼此之间产生的非线性相互作用。这种串扰可能导致图像质量下降尤其是在高密度像素阵列如CMOS传感器中更为明显因为它增加了错误信息的传播机会。为了减少crosstalk设计者通常会采用各种技术比如优化像素布局、增加隔离层等措施。 解决办法crosstalk串扰校准。 Crosstalk校准工具通常将全图分成多个ROI方块计算各像素通道的能量并确定其补偿数据芯片再使用这些校准数据让原本不均匀状态的能量分布变得更为平衡。
问题分析
一般是模组厂家在模组出厂的时候会使用上述的crosstalk工具将校准补偿数据烧录在eeprom里面。在调试模组成像效果的时候需要从eeprom中读取crosstalk数据(QSC),然后写入感光芯片中的特定寄存器中进行校准。 注意 4cell1芯片还会涉及到PD补偿坏点补偿等其他的内容而整个流程通常需要先补偿PD点再做Crosstalk校准然后再Remosaic成为正常的Bayer去应用。针对软件的Remosaic这其中所有的步骤通常都封装在芯片厂商提供的一个算法库里面手机端调用该算法库去实现4cell1芯片兼具常态时候的高分辨率和暗态时候的高感光度然后你就可以美美地拍照了。 ———————————————— 版权声明本文为博主原创文章遵循 CC 4.0 BY-SA 版权协议转载请附上原文出处链接和本声明。原文链接https://blog.csdn.net/qq_41897352/article/details/117336884
当向sensor寄存器0x53c0 ~ 0x54df写入Crosstalk补偿数据时候sensor要么在sleep mode0x0100 0要么crosstalk disable寄存器0x5000[6] 0
关键代码
在文件camxeepromdriver.xsd添加Crosstalk对应的QSC数据属性可以模仿SPC的填写方法如在eeprom的xml文件模仿SPC的数据格式填写如下。 QSC!--Specifies the availability of the specified data and type of endiannesselement for operation --QSCData descriptionMemory Type!--Specifies whether a particular OTP data available or not --isAvailabletrue/isAvailable!--Type of the EndiannessValid values are: BIG, LITTLE --endiannessBIG/endianness/QSCDataQSCSettings!--Specifies memory offset value and mask information --dataOffset!--Offset value in the OTP memory --offset0x1798/offset!--mask value which will be applied to obtain required data bits --mask0xFF/mask/dataOffset!--register address value to write QSC data --QSCAddress0x53c0/QSCAddress!--size of the QSC data settings --settingsSize288/settingsSize/QSCSettings!--Register address / data size in bytes --addressType range[1,4]2/addressType!--Register address / data size in bytes --dataType range[1,4]1/dataType!--Delay in milli seconds. Delay is 0 if not explicitly provided --delay0/delay/QSC在仓库camx中先将EEPROM中的crosstalk校准数据读取出来主要实现在src/core/camxeepromdata.cpp中的FormatQSCData();FormatQSCData函数在构造函数EEPROMData::EEPROMData(中调用。FormatQSCData函数是模仿者FormatSPCData函数写的。如下 /// EEPROMData::FormatQSCDataVOID EEPROMData::FormatQSCData(){QSCInfo* pQSCFormatInfo (m_pEEPROMDriverData-formatInfo.QSC);QSCCalibrationData* pQSCData (m_pSensorInfoTable-moduleCaps.OTPData.QSCCalibration);MemoryInfo dataOffset { 0 };pQSCData-isAvailable pQSCFormatInfo-QSCData.isAvailable;if (TRUE pQSCFormatInfo-QSCData.isAvailable){UINT32 totalRegCount 0;for (UINT16 i 0; i pQSCFormatInfo-QSCSettingsCount; i){totalRegCount pQSCFormatInfo-QSCSettings[i].settingsSize;}pQSCData-settings.regSettingCount totalRegCount;pQSCData-settings.regSetting static_castRegisterSetting*(CAMX_CALLOC(sizeof(RegisterSetting) * totalRegCount));if (NULL ! pQSCData-settings.regSetting){RegisterData* pRegData static_castRegisterData*(CAMX_CALLOC(sizeof(RegisterData) * totalRegCount));if (NULL ! pRegData){RegisterSetting* pCurRegOffset pQSCData-settings.regSetting;for (UINT16 i 0; i pQSCFormatInfo-QSCSettingsCount; i){/// copy to local structures so that original offset values wont be modified because of incrementsUtils::Memcpy(dataOffset, pQSCFormatInfo-QSCSettings[i].dataOffset, sizeof(MemoryInfo));UINT32 dataSize MaskLengthInBytes(dataOffset.mask);if (NULL ! pQSCData-settings.regSetting){for (UINT16 index 0; index pQSCFormatInfo-QSCSettings[i].settingsSize; index, pCurRegOffset){(pCurRegOffset)-registerAddr pQSCFormatInfo-QSCSettings[i].QSCAddress index;(pCurRegOffset)-registerData pRegData;(pCurRegOffset)-registerData[0] FormatDataTypeInteger((dataOffset), pQSCFormatInfo-QSCData.endianness);dataOffset.offset static_castUINT16(dataSize);(pCurRegOffset)-regAddrType pQSCFormatInfo-addressType;(pCurRegOffset)-regDataType pQSCFormatInfo-dataType;(pCurRegOffset)-operation OperationType::WRITE;if (0 ! pQSCFormatInfo-delay){(pCurRegOffset)-delayUsExists TRUE;(pCurRegOffset)-delayUsID 0;(pCurRegOffset)-delayUs pQSCFormatInfo-delay;}}}}}else{CAMX_LOG_ERROR(CamxLogGroupSensor, Calloc failed);}}else{CAMX_LOG_ERROR(CamxLogGroupSensor, Calloc failed);}}}同理也需要模仿DumpWBData函数来实现DumpQSCData 其他地方可以参考模仿AWBSPC的写法在SensorNode::LoadSensorConfigCmds()函数中添加即可打通流程。
具体的说crosstalk补偿写入是发生在配流阶段详细可以参考 CamX-Chi 高通Android Camera HAL框架学习2-configure_streams
验证测试
验证高像素模式下修改前后的预览成像和拍照成像在手机上肉眼无法观察到明显差异。 那么如何保证已经正确地将EEPROM中的crosstalk校准数据写入了感光芯片对应的寄存器中呢
首先验证确保从EEPROM中crosstalk校准数据读取正确这可以通过checksum和dump数据来分别验证。 /// EEPROMDataDump::DumpQSCDataVOID EEPROMDataDump::DumpQSCData(){FILE* pQSCDumpFile NULL;CHAR fileName[FILENAME_MAX] { 0 };QSCCalibrationData* pQSCData (m_pSensorInfoTable-moduleCaps.OTPData.QSCCalibration);if (TRUE pQSCData-isAvailable){OsUtils::SNPrintF(fileName, sizeof(fileName), %s/%s_%s_%s, ConfigFileDirectory,m_pEEPROMDriverData-slaveInfo.EEPROMName, qsc, OTP.txt);pQSCDumpFile OsUtils::FOpen(fileName, w);}if (pQSCDumpFile ! NULL){for (UINT16 index 0; index pQSCData-settings.regSettingCount; index){OsUtils::FPrintF(pQSCDumpFile,addr 0x%x : value 0x%x\n,pQSCData-settings.regSetting[i].registerAddr,pQSCData-settings.regSetting[i].registerData[0]);}OsUtils::FClose(pQSCDumpFile);}}如何确保将crosstalk校准数据准确地写入了sensor对应的寄存器0x53c0 ~ 0x54df中最简单的思路就是去读取写入后寄存器的值。遗憾的是这些寄存器都是只写寄存器。 于是,想到找效果同事去验证下Xtalk补偿回写前后高像素模式拍照图片对比。使用效果专用软件发现补偿后的图片在放大后的效果字体更加清晰说明补偿有不错的收益。
代码评审问题
Xtalk补偿回写是在什么时候写入的是在使用高像素模式的时候进行回写补偿吗sensor寄存器0x5380值0x0f默认打开 Xtalk补偿回写有没有副作用
参考文章
https://blog.csdn.net/qq_41897352/article/details/117336884