zoukankan      html  css  js  c++  java
  • 如何修改光圈,焦距等摄像头相关信息

    转自:http://blog.csdn.net/fulinwsuafcie/article/details/18617251

    Android 平台上使用照相机拍照时,一般都会将当前的拍照参数写入到照片详细信息当中去:

    主要有写如下信息:

    那么这些信息是在哪里产生的呢,又是怎么写到照片详细信息中去的呢?

    其中文件名,时间,路径等信息都是通过上层 APP 直接生成并且写入到详细信息的。而其它的信息则和驱动相关,包括照片宽度,高度,照片大小,光圈,焦距,曝光时间,ISO等参数。

    一般摄像头不同,相关的参数就会有差别,摄像头的一些参数信息是直接写在摄像头的驱动信息当中的。我们通过更改驱动信息中的参数就可以最终改变写入到照片详细信息中的各项参数。

    拍照的时候上层会通过 Feature Control这个接口来调用 GetExifInfo 的函数,此时 query 到的信息会写进去。具体如下所示:

    在驱动中有如下代码:

     1 UINT32 HI255BMIPIFeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId,  
     2                              UINT8 *pFeaturePara,UINT32 *pFeatureParaLen)  
     3 {  
     4        UINT16 u2Temp = 0;   
     5     UINT16 *pFeatureReturnPara16=(UINT16 *) pFeaturePara;  
     6     UINT16 *pFeatureData16=(UINT16 *) pFeaturePara;  
     7     UINT32 *pFeatureReturnPara32=(UINT32 *) pFeaturePara;  
     8     UINT32 *pFeatureData32=(UINT32 *) pFeaturePara;  
     9     PNVRAM_SENSOR_DATA_STRUCT pSensorDefaultData=(PNVRAM_SENSOR_DATA_STRUCT) pFeaturePara;  
    10     MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData=(MSDK_SENSOR_CONFIG_STRUCT *) pFeaturePara;  
    11     MSDK_SENSOR_REG_INFO_STRUCT *pSensorRegData=(MSDK_SENSOR_REG_INFO_STRUCT *) pFeaturePara;  
    12     MSDK_SENSOR_GROUP_INFO_STRUCT *pSensorGroupInfo=(MSDK_SENSOR_GROUP_INFO_STRUCT *) pFeaturePara;  
    13     MSDK_SENSOR_ITEM_INFO_STRUCT *pSensorItemInfo=(MSDK_SENSOR_ITEM_INFO_STRUCT *) pFeaturePara;  
    14     MSDK_SENSOR_ENG_INFO_STRUCT *pSensorEngInfo=(MSDK_SENSOR_ENG_INFO_STRUCT *) pFeaturePara;  
    15   
    16   
    17     switch (FeatureId)  
    18     {<span style="white-space:pre"> </span>……  
    19         case SENSOR_FEATURE_GET_RESOLUTION:  
    20             *pFeatureReturnPara16++=HI255B_FULL_GRAB_WIDTH;  
    21             *pFeatureReturnPara16=HI255B_FULL_GRAB_HEIGHT;  
    22             *pFeatureParaLen=4;  
    23         break;  
    24         case SENSOR_FEATURE_GET_EXIF_INFO:            
    25             HI255BMIPIGetExifInfo(*pFeatureData32);  
    26             break;  
    27         default:  
    28             break;            
    29     }  
    30     return ERROR_NONE;  
    31 }   /* HI255BMIPIFeatureControl() */  
    32   
    33 void HI255BMIPIGetExifInfo(UINT32 exifAddr)       
    34 {  
    35     SENSOR_EXIF_INFO_STRUCT * pExifInfo = (SENSOR_EXIF_INFO_STRUCT*)exifAddr;  
    36     pExifInfo->FNumber = 24;  
    37     pExifInfo->CapExposureTime = HI255BMIPI_sensor.capExposureTime;  
    38     pExifInfo->RealISOValue = HI255BMIPI_sensor.isoSpeed;      
    39 }  

    路径:ALPS.JB3.TDD.MP.V2_xxxmediatekcustomcommonkernelimgsensorxxx_mipi_yuvxxxxyuv_Sensor.c
    注意:Exif 信息中,只有光圈即F值,曝光时间及当前实际的 ISO 值是从底层来获取的,其它都是由 hal 层写进去的。

    1,FNumber 按照实际的光圈值填写即可;

    2,拍照的曝光时间在 Capture 函数里面获取,单位为us(微秒),然后赋给全局变量;

    3,ISO 值是指当菜单上的 ISO value 为 Auto 的时候,由驱动通过 ISP 来进行计算得到一个当前的 ISO 值。一般是从 capture 函数里面读当前的 Gain 值, 不同的Gain 值范围对应不同的 ISO 值,这里返回给上层的是 AE_ISO_100, AE_ISO_200 这样的值,与 shutter 一样,不同的sensor 可能判断条件和范围不一样的。

    另外,在HAL层 ALPS.JB3.TDD.MP.V2_TD_XXXmediatekplatformmt6572hardwarecameracorefeatureiopipeaaaaaa_hal_yuv.cpp 文件中会去读取摄像头驱动中所摄的参数,如下函数所示:

     1 MBOOL Hal3AYuv::set3AEXIFInfo(IBaseCamExif *pIBaseCamExif) const  
     2 {  
     3     MY_LOG("[%s()] 
    ", __FUNCTION__);  
     4       
     5     SENSOR_EXIF_INFO_STRUCT mSensorInfo;  
     6     EXIF_INFO_T rEXIFInfo;  
     7     memset(&rEXIFInfo, 0, sizeof(EXIF_INFO_T));  
     8     memset(&mSensorInfo, 0, sizeof(SENSOR_EXIF_INFO_STRUCT));  
     9       
    10     m_pSensorHal->sendCommand(static_cast<halSensorDev_e>(m_i4SensorDev),SENSOR_CMD_GET_YUV_EXIF_INFO,(int)&mSensorInfo,0,0);               
    11       
    12     MY_LOG("FNumber=%d, AEISOSpeed=%d, AWBMode=%d, CapExposureTime=%d, FlashLightTimeus=%d, RealISOValue=%d
    ",   
    13            mSensorInfo.FNumber, m_rParam.u4IsoSpeedMode, m_rParam.u4AwbMode,   
    14            mSensorInfo.CapExposureTime, m_bExifFlashOn, mSensorInfo.RealISOValue);  
    15       
    16     rEXIFInfo.u4FNumber = 24;//mSensorInfo.FNumber>0 ? mSensorInfo.FNumber : 28;  
    17     rEXIFInfo.u4FocalLength = 319;  
    18     rEXIFInfo.u4SceneMode = m_rParam.u4SceneMode;  
    19     rEXIFInfo.u4AWBMode = m_rParam.u4AwbMode;  
    20     rEXIFInfo.u4CapExposureTime = mSensorInfo.CapExposureTime>0? mSensorInfo.CapExposureTime : 0;  
    21     rEXIFInfo.u4FlashLightTimeus = m_bExifFlashOn; //mSensorInfo.FlashLightTimeus>0? mSensorInfo.FlashLightTimeus : 0;  
    22     rEXIFInfo.u4AEISOSpeed = m_rParam.u4IsoSpeedMode;  
    23     rEXIFInfo.i4AEExpBias = 0;  
    24       
    25     pIBaseCamExif->set3AEXIFInfo(&rEXIFInfo);  
    26       
    27     return MTRUE;  
    28 }  

    照片宽高设置之前的博文中有介绍。浏览模式不知道是一个什么东东?而照片大小则是由 JPEG 压缩比来决定的。

     

  • 相关阅读:
    用户交互
    python简介
    maven阿里云镜像setting
    apache虚拟主机的ip用法 包括iis
    apache的虚拟主机配置和指定目录的访问描述(
    apache重定向301 配置,根域名转到www
    前端学习
    一步一步写jQuery插件
    json 和 table控件
    下载相关
  • 原文地址:https://www.cnblogs.com/zl1991/p/5203497.html
Copyright © 2011-2022 走看看