Przeglądaj źródła

Z991239-2154 #comment fix: 优化人脸捕获流程,解决存在异常日志过多问题

陈礼鹏80274480 4 lat temu
rodzic
commit
274e5df289

+ 3 - 0
Module/mod_facetracking/Event.h

@@ -17,6 +17,9 @@
 #define EVENT_MOD_BEGIN_RECORD		0x20830061
 #define EVENT_MOD_END_RECORD		0x20830062
 
+#define EVENT_MOD_CUSTOMERAWARE_BEGIN	0x30830001
+#define EVENT_MOD_CUSTOMERAWARE_END		0x30830002
+
 	
 	
 	

+ 12 - 8
Module/mod_facetracking/mod_facetracking.cpp

@@ -140,8 +140,8 @@ public:
 			spFunction->SetTimer(1, this, 500);
 		}
 		spFunction->SubscribeLog(m_UUid1, this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_HEADLIGHT_GREEN_OFF,NULL,false);
-		spFunction->SubscribeLog(m_UUid2, this, Log_Event, Severity_None, Error_IgnoreAll, EVENT_MOD_BEGIN_RECORD,NULL,false);
-		spFunction->SubscribeLog(m_UUid3, this, Log_Event, Severity_None, Error_IgnoreAll, EVENT_MOD_END_RECORD,NULL,false);
+		spFunction->SubscribeLog(m_UUid2, this, Log_Event, Severity_None, Error_IgnoreAll, EVENT_MOD_CUSTOMERAWARE_BEGIN,NULL,false);
+		spFunction->SubscribeLog(m_UUid3, this, Log_Event, Severity_None, Error_IgnoreAll, EVENT_MOD_CUSTOMERAWARE_END,NULL,false);
 		pTransactionContext->SendAnswer(Error);
 	}
 
@@ -175,24 +175,27 @@ public:
 			Dbg("set light change");
 			m_facecapture->SetLightChange();
 		}
-		else if (dwUserCode == EVENT_MOD_BEGIN_RECORD)
+		else if (dwUserCode == EVENT_MOD_CUSTOMERAWARE_BEGIN)
 		{
 			CSimpleStringA strValue;
 			GetFunction()->GetSysVar("CameraState", strValue);
 			if (strValue[0]  == 'N')
 			{
 				m_facecapture->SetCameraState(0);
-				Dbg("Begin start Camera,set Camera State to 0");
+				m_facecapture->StartFaceCapture();
+				Dbg("Begin start Camera,set Camera State to 0, and start face capture!");
 			}
 			else if (strValue[0]  == 'E')
 			{
 				m_facecapture->SetCameraState(1);
-				Dbg("Begin start Camera,set Camera State to 1");
+				m_facecapture->StartFaceCapture();
+				Dbg("Begin start Camera,set Camera State to 1, and start face capture!");
 			}
 			else if (strValue[0]  == 'O')
 			{
 				m_facecapture->SetCameraState(2);
-				Dbg("Begin start Camera,set Camera State to 2");
+				m_facecapture->StartFaceCapture();
+				Dbg("Begin start Camera,set Camera State to 2, and start face capture!");
 			}
 			else if (strValue[0]  == 'B')
 			{
@@ -200,10 +203,11 @@ public:
 				Dbg("Begin start Camera,set Camera State to 3");
 			}	
 		}
-		else if (dwUserCode == EVENT_MOD_END_RECORD)
+		else if (dwUserCode == EVENT_MOD_CUSTOMERAWARE_END)
 		{
-			Dbg(" stop Camera,set camera stat to Error");
+			Dbg("stop Camera,set camera stat to Error, and stop face capture!");
 			m_facecapture->SetCameraState(3);
+			m_facecapture->StopFaceCapture();
 		}
 	}
 

+ 83 - 47
Other/libfacecapture/libfacecapture.cpp

@@ -176,6 +176,11 @@ class Clibfacecapture_impl
 public:
 	Clibfacecapture_impl(BOOL *pResult,CHostApi *pHostAPI,CVideoMonitorEvent*pHost,LPCSTR EnvironMinVideoName,LPCSTR EnvironMaxVideoName,LPCSTR OperateVideoName=NULL,MonitorEnum eMonitorType=MotionTarckAndFaceDetect)
 	{
+		m_pResult = pResult;
+		m_pHostApi = pHostAPI;
+		m_pHostEvent = pHost;
+		m_eType = eMonitorType;
+
 		m_pFaceCascade	= NULL;		//脸部分类器
 		m_pEyeCascade	= NULL;		//眼睛分类器
 		m_pMouthCascade = NULL;		//嘴巴分类器
@@ -188,7 +193,6 @@ public:
 #else
 		m_videomonitorthreadid = 0;
 #endif
-
 		m_bStopVieoMonitor = FALSE;
 		m_pEnvironMinVideoQueue = NULL;
 		m_pEnvironMaxVideoQueue =NULL;
@@ -199,15 +203,29 @@ public:
 		m_nImgHeight		= 0;
 		m_pMhImg = NULL;
 		m_pMhBuf = NULL;
-		m_pHostApi = NULL;
 		m_bLightChange = FALSE;
 		m_nCameraStae = 0;
 		m_nLastBuf = 0;
 		m_nCapFaceNum = 0;
 		m_bCapFaceCompleted = FALSE;
-		m_pHostEvent = NULL;
 		m_eMonitorState = NoBody;
 
+		memset(m_envminqueuename, 0, MAX_PATH);
+		memset(m_envmaxqueuename, 0, MAX_PATH);
+		memset(m_optqueuename, 0, MAX_PATH);
+
+		if (NULL != EnvironMinVideoName){
+			strncpy(m_envminqueuename, EnvironMinVideoName, (strlen(EnvironMinVideoName) > MAX_PATH) ? (MAX_PATH - 1) : strlen(EnvironMinVideoName));
+		}
+
+		if (NULL != EnvironMaxVideoName) {
+			strncpy(m_envmaxqueuename, EnvironMaxVideoName, (strlen(EnvironMaxVideoName) > MAX_PATH) ? (MAX_PATH - 1) : strlen(EnvironMaxVideoName));
+		}
+
+		if (NULL != OperateVideoName) {
+			strncpy(m_optqueuename, OperateVideoName, (strlen(OperateVideoName) > MAX_PATH) ? (MAX_PATH - 1) : strlen(OperateVideoName));
+		}
+
 #ifdef RVC_OS_WIN
 		InitializeCriticalSection(&CS);
 
@@ -233,68 +251,73 @@ public:
 			return;
 		}
 		*pResult = InitFaceCapture(m_stFaceConfig.strFaceDataDirPath);
-		if (!*pResult)
-		{
+		if (!*pResult){
 			return;
 		}	
 
-		for (int i = 0;i<MAX_FACE_NUM;i++)
-		{
-			m_PreFaceRect[i] = cvRect(0,0,0,0);
+		for (int i = 0; i < MAX_FACE_NUM; i++) {
+			m_PreFaceRect[i] = cvRect(0, 0, 0, 0);
 		}
-		memset(&m_stAllFaceInfo,0,sizeof(CAllFaceInfo));
+		memset(&m_stAllFaceInfo, 0, sizeof(CAllFaceInfo));
+
 		//初始化剪辑区域为屏幕中央区域
-		m_stAllFaceInfo.astFaceInfo[0].stRegion.stUpperBodyRect = cvRect(160,60,320,240);
-		for (int j = 0;j<3;j++)
-		{
-			memset(&m_stCapFace[j],0,sizeof(CLocalFaceInfo));
+		m_stAllFaceInfo.astFaceInfo[0].stRegion.stUpperBodyRect = cvRect(160, 60, 320, 240);
+		for (int j = 0; j < 3; j++) {
+			memset(&m_stCapFace[j], 0, sizeof(CLocalFaceInfo));
 		}
-		memset(m_SaveImgName,0,MAX_PATH);
-		memset(&m_stObjTrackRslt,0,sizeof(CMotionTrackRslt));
-		memset(&m_stBrightAdjParam,0,sizeof(CBrightAdjParam));
-		m_pEnvironMinVideoQueue = new Clibvideoqueue((char *)EnvironMinVideoName);
-		if (EnvironMaxVideoName)
-		{
-			m_pEnvironMaxVideoQueue = new Clibvideoqueue((char*)EnvironMaxVideoName);
+
+		memset(m_SaveImgName, 0, MAX_PATH);
+		memset(&m_stObjTrackRslt, 0, sizeof(CMotionTrackRslt));
+		memset(&m_stBrightAdjParam, 0, sizeof(CBrightAdjParam));
+
+		*pResult = WriteAllFaceInfo(m_stAllFaceInfo);
+		if (!*pResult) {
+			return;
 		}
-		if(OperateVideoName)
-		{
-			m_pOperatorVideoQueue = new Clibvideoqueue((char*)OperateVideoName);
+	}
+
+	bool StartFaceCapture()
+	{
+		m_pEnvironMinVideoQueue = new Clibvideoqueue(m_envminqueuename);
+		if (strlen(m_envmaxqueuename)) {
+			m_pEnvironMaxVideoQueue = new Clibvideoqueue(m_envmaxqueuename);
 		}
-		else
-		{
-			m_pOperatorVideoQueue = NULL;
+		if (strlen(m_optqueuename)) {
+			m_pOperatorVideoQueue = new Clibvideoqueue(m_optqueuename);
 		}
-		*pResult = WriteAllFaceInfo(m_stAllFaceInfo);
-		if(!*pResult)
-		{
-			return;
+		else {
+			m_pOperatorVideoQueue = NULL;
 		}
 		//开始视频监控线程
-		StartVideoMonitor(pHostAPI,pHost,eMonitorType);
+		return StartVideoMonitor(m_pHostApi, m_pHostEvent, m_eType);
 	}
 
-	~Clibfacecapture_impl()
+	bool StopFaceCapture()
 	{
-#ifdef RVC_OS_WIN
-		DeleteCriticalSection(&CS);
-#else
-		pthread_mutex_destroy(&cs_mutex);
-#endif
-		if (m_pEnvironMinVideoQueue)
-		{
+		StopVideoMonitor();
+
+		if (m_pEnvironMinVideoQueue){
 			delete m_pEnvironMinVideoQueue;
 		}
-		if (m_pEnvironMaxVideoQueue)
-		{
+
+		if (m_pEnvironMaxVideoQueue){
 			delete m_pEnvironMaxVideoQueue;
 		}
 
-		if (m_pOperatorVideoQueue)
-		{
+		if (m_pOperatorVideoQueue){
 			delete m_pOperatorVideoQueue;
 		}
 
+		return true;
+	}
+
+	~Clibfacecapture_impl()
+	{
+#ifdef RVC_OS_WIN
+		DeleteCriticalSection(&CS);
+#else
+		pthread_mutex_destroy(&cs_mutex);
+#endif
 		if (m_pMhImg)
 		{
 			cvReleaseImage(&m_pMhImg);
@@ -357,6 +380,8 @@ private:
 	sem_t m_semt;
 
 #endif
+	BOOL* m_pResult;
+	MonitorEnum m_eType;
 
 	CvHaarClassifierCascade* m_pFaceCascade;	//脸部分类器
 	CvHaarClassifierCascade* m_pEyeCascade;		//眼睛分类器
@@ -402,8 +427,12 @@ private:
 	MonitorStateEnum m_eMonitorState;
 	CVideoMonitorEvent*m_pHostEvent;
 	CHostApi* m_pHostApi;
-
 	CameraEnum m_eCamera;
+
+	char m_envminqueuename[MAX_PATH];
+	char m_envmaxqueuename[MAX_PATH];
+	char m_optqueuename[MAX_PATH];
+
 	//初始化
 	BOOL InitFaceCapture(const char *base_dir)
 	{
@@ -2438,8 +2467,6 @@ public:
 	//开始视频监控,pHost:事件,nMonitorFreq:监控频率,单位ms,MonitorType:监控类型,有三种模式可供选择
 	BOOL StartVideoMonitor(CHostApi *pHostAPI,CVideoMonitorEvent*pHost,MonitorEnum eMonitorType)
 	{
-		m_pHostEvent = pHost;
-		m_pHostApi = pHostAPI;
 #ifdef RVC_OS_WIN
 		if (m_hVieoMonitorThread == NULL)
 		{
@@ -2730,7 +2757,6 @@ Clibfacecapture::Clibfacecapture(BOOL *pResult,CHostApi *pHostAPI,CVideoMonitorE
 
 Clibfacecapture::~Clibfacecapture(void)
 {
-	m_pImpl->StopVideoMonitor();
 	delete m_pImpl;
 }
 //快照
@@ -2776,6 +2802,16 @@ void Clibfacecapture::SetCameraState(int nState)
 	m_pImpl->m_nCameraStae = nState;
 }
 
+bool Clibfacecapture::StartFaceCapture()
+{
+	return m_pImpl->StartFaceCapture();
+}
+
+bool Clibfacecapture::StopFaceCapture()
+{
+	return m_pImpl->StopFaceCapture();
+}
+
 BOOL SnapShot(CImageFrame*img)
 {
 	if(img == NULL)

+ 4 - 0
Other/libfacecapture/libfacecapture.h

@@ -207,6 +207,10 @@ public:
 	//开始视频监控,pHost:事件,nMonitorFreq:监控频率,单位ms,MonitorType:监控类型,有三种模式可供选择
 	Clibfacecapture(BOOL *pResult, CHostApi *pHostAPI,CVideoMonitorEvent*pHost,LPCSTR EnvironMinVideoName,LPCSTR EnvironMaxVideoName = NULL,LPCSTR OperateVideoName=NULL,MonitorEnum eMonitorType=MotionTarckAndFaceDetect);
 	~Clibfacecapture(void);
+
+	bool StartFaceCapture();
+	bool StopFaceCapture();
+
 	//快照
 	BOOL SnapShot(CImageFrame&img);
 	//有多少其他用户

+ 26 - 21
Other/libvideocapture/libvideocapture.cpp

@@ -346,13 +346,15 @@ int32_t VideoCaptureImpl::IncomingFrame(uint8_t* videoFrame,
 	}
 	
 
-	video_frame frmi420 = { 0 };
-	frmi420.data[0] = i420y;
-	frmi420.linesize[0] = m_dest_cap_width * 3 / 2;
-	frmi420.width = m_dest_cap_width;
-	frmi420.height = m_dest_cap_height;
-	frmi420.format = VIDEO_FORMAT_I420;
-	m_capture->param.on_frame_i420(m_capture->param.user_data, &frmi420);
+	if (NULL != m_capture->param.on_frame_i420){
+		video_frame frmi420 = { 0 };
+		frmi420.data[0] = i420y;
+		frmi420.linesize[0] = m_dest_cap_width * 3 / 2;
+		frmi420.width = m_dest_cap_width;
+		frmi420.height = m_dest_cap_height;
+		frmi420.format = VIDEO_FORMAT_I420;
+		m_capture->param.on_frame_i420(m_capture->param.user_data, &frmi420);
+	}
 
 	//video_frame_save_bmpfile("VIDEO_FORMAT_I420.bmp", &frmi420);
 
@@ -374,22 +376,24 @@ int32_t VideoCaptureImpl::IncomingFrame(uint8_t* videoFrame,
 
 	//fwrite(rgb24, width * 3 * height, 1, m_pFileirgb);
 
-	video_frame frm = { 0 };
-	frm.data[0] = brg24;
-	frm.linesize[0] = m_dest_cap_width * 3;
-	frm.width = m_dest_cap_width;
-	frm.height = m_dest_cap_height;
-	frm.format = VIDEO_FORMAT_RGB24;
+	if (NULL != m_capture->param.on_frame){
+		video_frame frm = { 0 };
+		frm.data[0] = brg24;
+		frm.linesize[0] = m_dest_cap_width * 3;
+		frm.width = m_dest_cap_width;
+		frm.height = m_dest_cap_height;
+		frm.format = VIDEO_FORMAT_RGB24;
 
-	//video_frame_save_bmpfile("VIDEO_FORMAT_BRG24.bmp", &frm);
+		//video_frame_save_bmpfile("VIDEO_FORMAT_BRG24.bmp", &frm);
 
-	//m_callback->Debug("%s:%d", __FUNCTION__, __LINE__);
-	//m_callback->Debug("m_capture = 0x%0x", m_capture);
-	//m_callback->Debug("%s:%d, m_capture->param = 0x%0x ", __FUNCTION__, __LINE__, m_capture->param);
-	//m_callback->Debug("%s:%d, m_capture->param.on_frame  = 0x%0x", __FUNCTION__, __LINE__, m_capture->param.on_frame);
-	//m_callback->Debug("%s:%d, m_capture->param.user_data = 0x%0x ", __FUNCTION__, __LINE__, m_capture->param.user_data);
-	
-	m_capture->param.on_frame(m_capture->param.user_data, &frm);
+		//m_callback->Debug("%s:%d", __FUNCTION__, __LINE__);
+		//m_callback->Debug("m_capture = 0x%0x", m_capture);
+		//m_callback->Debug("%s:%d, m_capture->param = 0x%0x ", __FUNCTION__, __LINE__, m_capture->param);
+		//m_callback->Debug("%s:%d, m_capture->param.on_frame  = 0x%0x", __FUNCTION__, __LINE__, m_capture->param.on_frame);
+		//m_callback->Debug("%s:%d, m_capture->param.user_data = 0x%0x ", __FUNCTION__, __LINE__, m_capture->param.user_data);
+
+		m_capture->param.on_frame(m_capture->param.user_data, &frm);
+	}
 
 	//m_callback->Debug("%s:%d", __FUNCTION__, __LINE__);
 
@@ -896,6 +900,7 @@ int VideoCaptureImpl::StopVideoCapture()
 		m_bStopCapture = true;
 
 		if (0 == pthread_join(m_CaptureThreadId, NULL))		{
+			m_CaptureThreadId = 0;
 			if (m_callback){
 				m_callback->Debug("thread join video capture thread success.");
 			}