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新增以下定义
- #define DUMP_GS_DETECTED_FRAME (1)
- // While count detected frames > DELAY_GS_COUNT_DETECTED
- // in DELAY_GS_COUNT_IN_FRAMES duration, consider there is
- // a gesture in preview, otherwise consider it is false positive.
- #define USE_DELAY_GS_OUTPUT (1)
- #define DELAY_GS_COUNT_DETECTED (3)
- #define DELAY_GS_COUNT_IN_FRAMES (6)
- static MUINT32 g_GSDetectedFrames;
- 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() 方法中添加
- getInstance()
- {
- ... ...
- if ( 0 == oldCount )
- {
- if ( ! pHalGS )
- {
- MY_LOGW("Get Instance Warning!");
- }
- pHalGS = new halGS();
- //add start
- g_GSDetectedFrames = 0;
- g_GSCountFrames = 0;
- //add end
- }
- ... ...
- }
- halGS::halGSDo(
- MUINT8 *ImageBuffer2, //Preview Size Image
- MINT32 rRotation_Info
- )
- {
- ... ...
- //result DetectResult[MAX_FACE_NUM];
- GD_RESULT DetectResult[MAX_FACE_NUM];
- m_pmtkGSObj->GdGetResult( (MUINT8 *)&DetectResult, GD_TRACKING_DISPLAY);
- //add start
- #if DUMP_GS_DETECTED_FRAME
- if (DetectResult->face_num) {
- char szFileName[100]={'\0'};
- FILE * pRawFp;
- int i4WriteCnt;
- static int count = 0;
- MY_LOGD("Gsture is detected...dump result");
- sprintf(szFileName, "/sdcard/GSsrc_%04dx%04d_%04d.raw", m_GSW, m_GSH, count);
- count++;
- pRawFp = fopen(szFileName, "wb");
- if (NULL == pRawFp )
- {
- MY_LOGD("Can't open file to save RAW Image\n");
- while(1);
- }
- i4WriteCnt = fwrite((void *)ImageBuffer2,1, (m_GSW * m_GSH),pRawFp);
- fflush(pRawFp);
- fclose(pRawFp);
- }
- #endif
- //add end
- static int last_face_num;
- ... ...
- }
- halGS::halGSGetGestureResult(
- MtkCameraFaceMetadata *GS_result
- ) {
- ... ...
- GSResult_Num = GS_result->number_of_faces;
- //add start
- MY_LOGD("Gesture detect numbers : %d", GSResult_Num);
- #if USE_DELAY_GS_OUTPUT
- if (g_GSDetectedFrames > DELAY_GS_COUNT_DETECTED && GS_result->number_of_faces == 0) {
- g_GSDetectedFrames = 0;
- g_GSCountFrames = 0;
- }
- if (GS_result->number_of_faces > 0 && g_GSDetectedFrames <= DELAY_GS_COUNT_DETECTED) {
- if (g_GSDetectedFrames == 0) {
- g_GSCountFrames = 0;
- }
- g_GSDetectedFrames++;
- }
- if (g_GSDetectedFrames > 0 && g_GSDetectedFrames <= DELAY_GS_COUNT_DETECTED) {
- g_GSCountFrames++;
- if (g_GSCountFrames > DELAY_GS_COUNT_IN_FRAMES) {
- g_GSCountFrames = 0;
- g_GSDetectedFrames = 0;
- } }
- if (g_GSDetectedFrames <= DELAY_GS_COUNT_DETECTED) {
- GSResult_Num = GS_result->number_of_faces = faceCnt = 0;
- }
- MY_LOGD("After process delay output");
- MY_LOGD("detected num : %d, detected count : %d, delay duration : %d", GSResult_Num,
- g_GSDetectedFrames, g_GSCountFrames);
- #endif
- //add end
- for(i=0;i<MAX_FACE_NUM;i++)
- ... ...
- }
3. 如果经过以上两步的调节,如果还无法满足您的需要的话,建议直接不要这个feature 了。
因为手势设别本身就是存在limit ,没办法100% 识别,一定存在误识别率。
另外延伸另外一个问题,如果要开美颜的时候,也做手势识别,请修改以下文件:
4. 修改FeaturePipe.vFB.h
FeaturePipeFDNode 类中新增以下几个private 变量
MUINT32 mGDWidth;
MUINT32 mGDHeight;
MBOOL mGDInited;
5. 修改FeaturePipe.vFB.cpp
修改FeaturePipeFdNode 类
5.1
- FeaturePipeFdNode::FeaturePipeFdNode(
- ... ...
- mFDHeight(0),
- mFDInited(MFALSE),
- //add start
- mGDWidth(0),
- mGDHeight(0),
- mGDInited(MFALSE)
- //add end
- ... ...
- }
- FeaturePipeFdNode::
- onUninit()
- {
- ... ...
- if(mpGDHalObj != NULL)
- {
- LOG_DBG("GD_destroy(vFB)");
- //add start
- if(mGDInited)
- {
- LOG_DBG("GD_Uninit(vFB)");
- mpGDHalObj->halGSUninit();
- }
- //add end
- //mpGDHalObj->halGSUninit();
- mpGDHalObj->destroyInstance();
- mpGDHalObj = NULL;
- }
- ... ...
- }
- FeaturePipeFdNode::doGestureShot(IImageBuffer* pImageBuffer)
- {
- MUINT32 SrcW = pImageBuffer->getImgSize().w;
- MUINT32 SrcH = pImageBuffer->getImgSize().h;
- MUINT32 GD_Result = 0;
- //add start
- if (mGDInited &&
- (mGDWidth != 0) &&
- ((mGDWidth != SrcW) ||
- (mGDHeight != SrcH)))
- {
- mpGDHalObj->halGSUninit();
- mGDInited = MFALSE;
- }
- //Initial GD Start
- if(!mGDInited) {
- //add end
- LOG_DBG("StartGD_Init(vFB): SrcW:%d, SrcH:%d", SrcW, SrcH);
- mpGDHalObj->halGSInit(SrcW, SrcH, (MUINT8 *) mpFDWorkingBuffer, FD_WORKING_BUF_SIZE);
- //add start
- mGDInited = MTRUE;
- }
- mGDWidth = SrcW;
- mGDHeight = SrcH;
- //add end
- mpGDHalObj->halGSDo((MUINT8 *)mFDYBuffer, mRotation);
- GD_Result = mpGDHalObj->halGSGetGestureResult(&mGSFaceMetadata);
- LOG_DBG("Gesture Shot result %d", GD_Result);
- //delete
- //mpGDHalObj->halGSUninit();
- ... ...
- }