微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 手机设计讨论 > MTK手机平台交流 > MTK手势拍照识别率如何调整

MTK手势拍照识别率如何调整

时间:10-02 整理:3721RD 点击:

1. 调整GDLevel
灵敏度(DR)提高了,误判率(FPR)也会提高。
GDLevel (defalt 1) 0~4: 0 (High DR, High FPR)
4 (Low DR, Low FPR)
请调整GDLevel.
alps/mediatek/custom/common/hal/CAMERA/camera/camera_custom_gesture.cpp
void get_gesture_CustomizeData(GS_Customize_PARA *GSDataOut)
{
GSDataOut->GDLevel = 4;
}
92 KK1.MP1需要打 Patch:ALPS01650682.

2. 如果按照1 调整之后,对识别率还不满意的话
更改gs_hal.cpp
2.1新增以下定义

  1. #define DUMP_GS_DETECTED_FRAME (1)
  2. // While count detected frames > DELAY_GS_COUNT_DETECTED
  3. // in DELAY_GS_COUNT_IN_FRAMES duration, consider there is
  4. // a gesture in preview, otherwise consider it is false positive.
  5. #define USE_DELAY_GS_OUTPUT (1)
  6. #define DELAY_GS_COUNT_DETECTED (3)
  7. #define DELAY_GS_COUNT_IN_FRAMES (6)
  8. static MUINT32 g_GSDetectedFrames;
  9. static MUINT32 g_GSCountFrames;

复制代码


其中新增的这几个值就是起调节作用的。
當USE_DELAY_GS_OUTPUT enable才有用
DELAY_GS_COUNT_DETECTED 越大, 侦测誤判率越低, 但偵測率也會下降, 建议 1 <=
DELAY_GS_COUNT_DETECTED <= 3
DELAY_GS_COUNT_IN_FRAMES越大, 侦测率會變高, 但誤判率也會上升, 建议 6 <=
DELAY_GS_COUNT_IN_FRAMES
2.2getInstance() 方法中添加

  1. getInstance()
  2. {
  3. ... ...
  4. if ( 0 == oldCount )
  5. {
  6. if ( ! pHalGS )
  7. {
  8. MY_LOGW("Get Instance Warning!");
  9. }
  10. pHalGS = new halGS();
  11. //add start
  12. g_GSDetectedFrames = 0;
  13. g_GSCountFrames = 0;
  14. //add end
  15. }
  16. ... ...
  17. }

复制代码

2.3添加

  1. halGS::halGSDo(
  2. MUINT8 *ImageBuffer2, //Preview Size Image
  3. MINT32 rRotation_Info
  4. )
  5. {
  6. ... ...
  7. //result DetectResult[MAX_FACE_NUM];
  8. GD_RESULT DetectResult[MAX_FACE_NUM];
  9. m_pmtkGSObj->GdGetResult( (MUINT8 *)&DetectResult, GD_TRACKING_DISPLAY);
  10. //add start
  11. #if DUMP_GS_DETECTED_FRAME
  12. if (DetectResult->face_num) {
  13. char szFileName[100]={'\0'};
  14. FILE * pRawFp;
  15. int i4WriteCnt;
  16. static int count = 0;
  17. MY_LOGD("Gsture is detected...dump result");
  18. sprintf(szFileName, "/sdcard/GSsrc_%04dx%04d_%04d.raw", m_GSW, m_GSH, count);
  19. count++;
  20. pRawFp = fopen(szFileName, "wb");
  21. if (NULL == pRawFp )
  22. {
  23. MY_LOGD("Can't open file to save RAW Image\n");
  24. while(1);
  25. }
  26. i4WriteCnt = fwrite((void *)ImageBuffer2,1, (m_GSW * m_GSH),pRawFp);
  27. fflush(pRawFp);
  28. fclose(pRawFp);
  29. }
  30. #endif
  31. //add end
  32. static int last_face_num;
  33. ... ...
  34. }

复制代码

2.4添加

  1. halGS::halGSGetGestureResult(
  2. MtkCameraFaceMetadata *GS_result
  3. ) {
  4. ... ...
  5. GSResult_Num = GS_result->number_of_faces;
  6. //add start
  7. MY_LOGD("Gesture detect numbers : %d", GSResult_Num);
  8. #if USE_DELAY_GS_OUTPUT
  9. if (g_GSDetectedFrames > DELAY_GS_COUNT_DETECTED && GS_result->number_of_faces == 0) {
  10. g_GSDetectedFrames = 0;
  11. g_GSCountFrames = 0;
  12. }
  13. if (GS_result->number_of_faces > 0 && g_GSDetectedFrames <= DELAY_GS_COUNT_DETECTED) {
  14. if (g_GSDetectedFrames == 0) {
  15. g_GSCountFrames = 0;
  16. }
  17. g_GSDetectedFrames++;
  18. }
  19. if (g_GSDetectedFrames > 0 && g_GSDetectedFrames <= DELAY_GS_COUNT_DETECTED) {
  20. g_GSCountFrames++;
  21. if (g_GSCountFrames > DELAY_GS_COUNT_IN_FRAMES) {
  22. g_GSCountFrames = 0;
  23. g_GSDetectedFrames = 0;
  24. } }
  25. if (g_GSDetectedFrames <= DELAY_GS_COUNT_DETECTED) {
  26. GSResult_Num = GS_result->number_of_faces = faceCnt = 0;
  27. }
  28. MY_LOGD("After process delay output");
  29. MY_LOGD("detected num : %d, detected count : %d, delay duration : %d", GSResult_Num,
  30. g_GSDetectedFrames, g_GSCountFrames);
  31. #endif
  32. //add end
  33. for(i=0;i<MAX_FACE_NUM;i++)
  34. ... ...
  35. }

复制代码


3. 如果经过以上两步的调节,如果还无法满足您的需要的话,建议直接不要这个feature 了。
因为手势设别本身就是存在limit ,没办法100% 识别,一定存在误识别率。
另外延伸另外一个问题,如果要开美颜的时候,也做手势识别,请修改以下文件:
4. 修改FeaturePipe.vFB.h
FeaturePipeFDNode 类中新增以下几个private 变量
MUINT32 mGDWidth;
MUINT32 mGDHeight;
MBOOL mGDInited;

5. 修改FeaturePipe.vFB.cpp
修改FeaturePipeFdNode 类
5.1

  1. FeaturePipeFdNode::FeaturePipeFdNode(
  2. ... ...
  3. mFDHeight(0),
  4. mFDInited(MFALSE),
  5. //add start
  6. mGDWidth(0),
  7. mGDHeight(0),
  8. mGDInited(MFALSE)
  9. //add end
  10. ... ...
  11. }

复制代码

5.2

  1. FeaturePipeFdNode::
  2. onUninit()
  3. {
  4. ... ...
  5. if(mpGDHalObj != NULL)
  6. {
  7. LOG_DBG("GD_destroy(vFB)");
  8. //add start
  9. if(mGDInited)
  10. {
  11. LOG_DBG("GD_Uninit(vFB)");
  12. mpGDHalObj->halGSUninit();
  13. }
  14. //add end
  15. //mpGDHalObj->halGSUninit();
  16. mpGDHalObj->destroyInstance();
  17. mpGDHalObj = NULL;
  18. }
  19. ... ...
  20. }

复制代码

5.3

  1. FeaturePipeFdNode::doGestureShot(IImageBuffer* pImageBuffer)
  2. {
  3. MUINT32 SrcW = pImageBuffer->getImgSize().w;
  4. MUINT32 SrcH = pImageBuffer->getImgSize().h;
  5. MUINT32 GD_Result = 0;
  6. //add start
  7. if (mGDInited &&
  8. (mGDWidth != 0) &&
  9. ((mGDWidth != SrcW) ||
  10. (mGDHeight != SrcH)))
  11. {
  12. mpGDHalObj->halGSUninit();
  13. mGDInited = MFALSE;
  14. }
  15. //Initial GD Start
  16. if(!mGDInited) {
  17. //add end
  18. LOG_DBG("StartGD_Init(vFB): SrcW:%d, SrcH:%d", SrcW, SrcH);
  19. mpGDHalObj->halGSInit(SrcW, SrcH, (MUINT8 *) mpFDWorkingBuffer, FD_WORKING_BUF_SIZE);
  20. //add start
  21. mGDInited = MTRUE;
  22. }
  23. mGDWidth = SrcW;
  24. mGDHeight = SrcH;
  25. //add end
  26. mpGDHalObj->halGSDo((MUINT8 *)mFDYBuffer, mRotation);
  27. GD_Result = mpGDHalObj->halGSGetGestureResult(&mGSFaceMetadata);
  28. LOG_DBG("Gesture Shot result %d", GD_Result);
  29. //delete
  30. //mpGDHalObj->halGSUninit();
  31. ... ...
  32. }

复制代码



Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top