Explorar o código

Z991239-6031 #comment 优化脸部跟踪功能实现

80274480 hai 7 meses
pai
achega
fa3f54bb2e

+ 16 - 9
Module/mod_facetracking/Event.h

@@ -1,16 +1,23 @@
 #pragma once
-#define		EVENT_MOD_FACE_ENVLIGHT_LESS			0x31280001	//环境光不足,级别3。
-#define		EVENT_MOD_FACE_IMG_VAGUE				0x31280002	//图像不清,外部线条和轮廓模糊,不能识别客户,影响到服务,级别3。
-#define		EVENT_MOD_FACE_FACELIGHT_LESS			0x31280003	//客户脸部光度不足,可能为外部光源过于强烈,或拍照光源故障,级别1。
+#define		EVENT_MOD_FACE_ENVLIGHT_LESS			0x30280001	//环境光不足,级别3。
+#define		EVENT_MOD_FACE_IMG_VAGUE				0x30280002	//图像不清,外部线条和轮廓模糊,不能识别客户,影响到服务,级别3。
+#define		EVENT_MOD_FACE_FACELIGHT_LESS			0x30280003	//客户脸部光度不足,可能为外部光源过于强烈,或拍照光源故障,级别1。
 
-#define		EVENT_MOD_FACE_BREAKDOWN				0x31280004	//人脸识别opencv库崩溃,原因不明,告知自检模块重启人脸模块,级别2。
-
-#define		EVENT_MOD_FACE_CAMBUG_BLACK				0x31280005	//摄像头故障,导致采集的图像全黑,无法进行图像处理,级别3。
-#define		EVENT_MOD_FACE_CAMBUG_WHITE				0x31280006	//摄像头故障,导致采集的图像全白,无法进行图像处理,级别3。
-#define		EVENT_MOD_FACE_ENVLIGHT_TOOLIGHT		0x31280007	//环境光过亮,可能为摄像头故障或环境变化,已经不能进行服务,级别3。
-#define		EVENT_MOD_FACE_CAM_COVER				0x31280008	//摄像头遮挡,遮挡场景为,光度降低,没有任何可识别的图像,但有信号,级别2。
+#define		EVENT_MOD_FACE_BREAKDOWN				0x30280004	//人脸识别opencv库崩溃,原因不明,告知自检模块重启人脸模块,级别2。
 
+#define		EVENT_MOD_FACE_CAMBUG_BLACK				0x30280005	//摄像头故障,导致采集的图像全黑,无法进行图像处理,级别3。
+#define		EVENT_MOD_FACE_CAMBUG_WHITE				0x30280006	//摄像头故障,导致采集的图像全白,无法进行图像处理,级别3。
+#define		EVENT_MOD_FACE_ENVLIGHT_TOOLIGHT		0x30280007	//环境光过亮,可能为摄像头故障或环境变化,已经不能进行服务,级别3。
+#define		EVENT_MOD_FACE_CAM_COVER				0x30280008	//摄像头遮挡,遮挡场景为,光度降低,没有任何可识别的图像,但有信号,级别2。
 
+#define		EVENT_MOD_CUSTOMER_CLOSE				0x30200001  //客户接近 1.5m
+#define		EVENT_MOD_CUSTOMER_LEAVE				0x30200002  //客户消失或退出到接近距离1.5M之外
+#define		EVENT_MOD_CUSTOMER_ENTEROPERATE			0x30200003  //客户进入操作距离0.5m
+#define		EVENT_MOD_CUSTOMER_BACKTOCLOSE			0x30200004  //客户退回到接近距离
+#define		EVENT_MOD_CUSTOMER_APPEAR				0x30200006  //有人出现
+#define		EVENT_MOD_CUSTOMER_CHANGE				0x30200005  //客户已经换人
+#define		EVENT_MOD_CUSTOMER_CAPTUREFACE			0x30200011  //捕获脸部事件
+#define		EVENT_MOD_CUSTOMER_LOSEFACE				0x30200012  //失去脸部事件
 	
 	
 	

+ 18 - 37
Module/mod_facetracking/mod_facetracking.cpp

@@ -34,6 +34,22 @@ using namespace AssistantChannel;
 
 // 脸部跟踪&拍照 devel: 0x302
 
+static struct {
+	int monitor_id;
+	int evt_code;
+	char* evt_msg;
+} monitor_id_evtmsg[] = {
+	{0, EVENT_MOD_CUSTOMER_CLOSE, "客户接近 1.5m"},
+	{1, EVENT_MOD_CUSTOMER_LEAVE, "客户消失或退出到接近距离1.5M之外"},
+	{2, EVENT_MOD_CUSTOMER_ENTEROPERATE, "客户进入操作距离0.5m"},
+	{3, EVENT_MOD_CUSTOMER_BACKTOCLOSE, "客户退回到接近距离"},
+	{4, EVENT_MOD_CUSTOMER_APPEAR, "有人出现"},
+	{5, EVENT_MOD_CUSTOMER_CHANGE, "客户已经换人"},
+	{6, EVENT_MOD_CUSTOMER_CAPTUREFACE, "捕获脸部事件"},
+	{7, EVENT_MOD_CUSTOMER_LOSEFACE, "失去脸部事件"},
+	{8, EVENT_MOD_FACE_BREAKDOWN,"the opencv library breakdown"}
+};
+
 class CFaceTrackingEntity;
 
 class ChannelClient : public ChannelService_ClientBase
@@ -421,44 +437,9 @@ public:
 
 	////////////////////////////////////////////////////////////////////////////////////
 	// CVideoMonitorEvent
-
-	virtual void GenerateCloseEvent()
-	{
-		LogEvent(Severity_Middle, 0x30200001, "客户接近 1.5m");
-	}
-	virtual void GenerateLeaveEvent()
-	{
-		LogEvent(Severity_Middle, 0x30200002, "客户消失或退出到接近距离1.5M之外");
-	}
-	virtual void GenerateEnterOperateEvent()
-	{
-		LogEvent(Severity_Middle, 0x30200003, "客户进入操作距离0.5m"); 
-	}
-	virtual void GenerateBackToCloseEvent()
-	{
-		LogEvent(Severity_Middle, 0x30200004, "客户退回到接近距离"); 
-	}
-	virtual void GenerateAppearEvent()					//有人出现在视野中
-	{
-		LogEvent(Severity_Middle, 0x30200006, "有人出现"); 
-	}
-	virtual void GenerateCustomerChangeEvent()
-	{
-		LogEvent(Severity_Middle, 0x30200005, "客户已经换人");
-	}
-	virtual void GenerateCaptureFaceEvent()
-	{
-		LogEvent(Severity_Middle, 0x30200011, "捕获脸部事件");
-	}
-	virtual void GenerateLoseFaceEvent()
-	{
-		LogEvent(Severity_Middle, 0x30200012, "失去脸部事件");
-	}
-	 
-	virtual void GenerateFaceCaptureFC()
+	void GenerateMonitorEvent(video_monitor_event_type eType)
 	{
-		//发送最高等级错误事件,由健康模块重启对应实体
-		LogEvent(Severity_High,EVENT_MOD_FACE_BREAKDOWN,"the opencv library breakdown");
+		LogEvent(Severity_Middle, monitor_id_evtmsg[eType].evt_code, monitor_id_evtmsg[eType].evt_msg);
 	}
 
 private:

+ 4 - 0
Module/mod_interactivecontrol/InteractiveControl.xml

@@ -678,4 +678,8 @@
   <message name="EnvCameraCapProcess">
     <param name="envcapmsg" type="wstring"/>
   </message>
+  <!-- 运动检测和脸部跟踪信息 -->
+  <message name="FaceTrackingMsg">
+    <param name="Trackingmsg" type="wstring"/>
+  </message>
 </entity>

+ 16 - 16
Other/libfacecapture/libfacecapture.cpp

@@ -1478,7 +1478,7 @@ private:
 							CalcUpbodyRegion(pFaceRect);
 							m_stAllFaceInfo.astFaceInfo[0].stRegion.stUpperBodyRect = *pFaceRect;
 						}
-						m_pHostEvent->GenerateCloseEvent();	//产生有人靠近事件
+						m_pHostEvent->GenerateMonitorEvent(Close);	//产生有人靠近事件
 					}
 					else if (pFaceRect->height >= (int)(m_nImgHeight/m_stFaceConfig.fOperateFaceSize))
 					{
@@ -1492,7 +1492,7 @@ private:
 							CalcUpbodyRegion(pFaceRect);
 							m_stAllFaceInfo.astFaceInfo[0].stRegion.stUpperBodyRect = *pFaceRect;
 						}
-						m_pHostEvent->GenerateEnterOperateEvent();	//产生有人进入操作距离事件
+						m_pHostEvent->GenerateMonitorEvent(EnterOperate);	//产生有人进入操作距离事件
 					}
 					else
 					{
@@ -1505,7 +1505,7 @@ private:
 							 m_pHostApi->Debug(FACECAP_INFO, "有人出现!");
 							 m_eMonitorState = SomebodyFar;			//进入远距离有人状态
 						 }
-						 m_pHostEvent->GenerateAppearEvent();	//产生有人出现事件
+						 m_pHostEvent->GenerateMonitorEvent(Appear);	//产生有人出现事件
 					}
 				}
 			}
@@ -1569,7 +1569,7 @@ private:
 						m_pHostApi->Debug(FACECAP_INFO, "有人靠近!");
 						m_eMonitorState = SomebodyClose;		//进入有人靠近状态
 					}
-					m_pHostEvent->GenerateCloseEvent();		//产生有人靠近事件
+					m_pHostEvent->GenerateMonitorEvent(Close);		//产生有人靠近事件
 				}
 				else if (pFaceRect->height >= (int)(m_nImgHeight/m_stFaceConfig.fOperateFaceSize))
 				{
@@ -1579,7 +1579,7 @@ private:
 						m_pHostApi->Debug(FACECAP_INFO, "有人进入操作距离!");
 						m_eMonitorState = SomebodyOperate;			//进入有人靠近状态
 					}
-					m_pHostEvent->GenerateEnterOperateEvent();	//产生有人进入操作距离事件
+					m_pHostEvent->GenerateMonitorEvent(EnterOperate);	//产生有人进入操作距离事件
 				}
 				else
 				{
@@ -1594,7 +1594,7 @@ private:
 						m_pHostApi->Debug(FACECAP_INFO, "远距离,有人出现!");
 						m_eMonitorState = SomebodyFar;			//进入远距离有人状态
 					}
-					m_pHostEvent->GenerateAppearEvent();	//产生有人出现事件
+					m_pHostEvent->GenerateMonitorEvent(Appear);	//产生有人出现事件
 				}
 			}
 			CvRect*pFaceRect = (CvRect*)cvGetSeqElem(pfaceSeq, nCurafaceSerial);
@@ -1752,7 +1752,7 @@ private:
 			{
 				m_eMonitorState = SomebodyOperate;
 				m_stAllFaceInfo.astFaceInfo[0].eScene = ForwardScened;
-				m_pHostEvent->GenerateEnterOperateEvent();  //产生有人进入操作距离事件
+				m_pHostEvent->GenerateMonitorEvent(EnterOperate);  //产生有人进入操作距离事件
 				m_pHostApi->Debug(FACECAP_INFO, "有人进入操作距离!");
 				//获取UUID
 				if (m_stAllFaceInfo.astFaceInfo[0].FaceID == 0)
@@ -1767,7 +1767,7 @@ private:
 					m_eMonitorState = SomebodyOperate;
 					m_stAllFaceInfo.astFaceInfo[0].eScene = LockScene;
 				}
-				m_pHostEvent->GenerateCaptureFaceEvent();  //发送捕获人脸事件
+				m_pHostEvent->GenerateMonitorEvent(CaptureFace);  //发送捕获人脸事件
 				//m_pHostApi->Debug("锁定人脸!");
 			}
 		}
@@ -1782,7 +1782,7 @@ private:
 				m_stAllFaceInfo.astFaceInfo[0].stRegion.stUpperBodyRect.width = m_nImgWidth/2;
 				m_stAllFaceInfo.astFaceInfo[0].stRegion.stUpperBodyRect.x = m_nImgHeight/4;
 				m_stAllFaceInfo.astFaceInfo[0].stRegion.stUpperBodyRect.y = m_nImgWidth/4;
-				m_pHostEvent->GenerateLeaveEvent();		//产生客户离开事件
+				m_pHostEvent->GenerateMonitorEvent(Leave);		//产生客户离开事件
 				m_pHostApi->Debug(FACECAP_INFO, "客户离开!");
 				//清除UUID
 				m_stAllFaceInfo.astFaceInfo[0].FaceID = 0;
@@ -1794,7 +1794,7 @@ private:
 			{
 				m_stAllFaceInfo.astFaceInfo[0].eScene = BackwardScened;
 				m_eMonitorState = SomebodyClose;
-				m_pHostEvent->GenerateBackToCloseEvent();  //产生客户退回到接近距离事件
+				m_pHostEvent->GenerateMonitorEvent(BackToClose);  //产生客户退回到接近距离事件
 				m_pHostApi->Debug(FACECAP_INFO, "客户退回到接近距离!");
 			} 
 			else if(SomebodyFar == m_eMonitorState)
@@ -1808,7 +1808,7 @@ private:
 					m_stAllFaceInfo.astFaceInfo[0].FaceID = m_pHostApi->GenerateUUID();
 				}
 			}
-			m_pHostEvent->GenerateCloseEvent();  //产生有人靠近事件
+			m_pHostEvent->GenerateMonitorEvent(Close);  //产生有人靠近事件
 		}
 	}
 
@@ -2174,7 +2174,7 @@ private:
 								{
 									SetUpperbodyToCenter();								
 									m_eMonitorState = NoBody;
-									m_pHostEvent->GenerateLeaveEvent();
+									m_pHostEvent->GenerateMonitorEvent(Leave);
 									m_pHostApi->Debug(FACECAP_DEBUG, "客户离开!");
 									nSearchFailNum = 0;
 									FSleep(m_stFaceConfig.nSleepLong);
@@ -2202,7 +2202,7 @@ private:
 							{
 								SetUpperbodyToCenter();
 								m_eMonitorState = NoBody;
-								m_pHostEvent->GenerateLeaveEvent();
+								m_pHostEvent->GenerateMonitorEvent(Leave);
 								m_pHostApi->Debug(FACECAP_DEBUG, "客户离开!");
 								nSearchFailNum = 0;
 								FSleep(m_stFaceConfig.nSleepLong);
@@ -2375,7 +2375,7 @@ private:
 								{
 									m_eMonitorState = SomebodyClose;
 									m_stAllFaceInfo.astFaceInfo[0].eScene = UnLockScene;
-									m_pHostEvent->GenerateLoseFaceEvent();  //发送失去人脸事件
+									m_pHostEvent->GenerateMonitorEvent(LoseFace);  //发送失去人脸事件
 									m_pHostApi->Debug(FACECAP_DEBUG, "人脸失去锁定!");
 									nDetectFailNum = 0;
 								}
@@ -2390,7 +2390,7 @@ private:
 							{
 								m_eMonitorState = SomebodyClose;
 								m_stAllFaceInfo.astFaceInfo[0].eScene = UnLockScene;
-								m_pHostEvent->GenerateLoseFaceEvent();  //发送失去人脸事件
+								m_pHostEvent->GenerateMonitorEvent(LoseFace);  //发送失去人脸事件
 								m_pHostApi->Debug(FACECAP_DEBUG, "人脸失去锁定!");
 								nDetectFailNum = 0;
 							}
@@ -2415,7 +2415,7 @@ private:
 				nBreakDownNum++;
 				if (nBreakDownNum == 5)
 				{
-				   m_pHostEvent->GenerateFaceCaptureFC();   //发送人脸崩溃事件
+				   m_pHostEvent->GenerateMonitorEvent(FaceCaptureFC);   //发送人脸崩溃事件
 				   m_pHostApi->Debug(FACECAP_INFO, "opencv library breakdown!");
 				}
 				FSleep(m_stFaceConfig.nSleepShort);

+ 13 - 10
Other/libfacecapture/libfacecapture.h

@@ -170,19 +170,22 @@ enum facecap_loglevel {
 	FACECAP_FATAL = 4
 };
 
+enum video_monitor_event_type {
+	Close,					//有人靠近 1.5M
+	Leave,					//客户离开,客户消失或退出到接近距离外1.5M
+	EnterOperate,			//客户进入操作距离 0.5M
+	BackToClose,			//客户退回到接近距离
+	Appear,					//有人出现在视野中
+	CustomerChange,			//客户已经换人
+	CaptureFace,			//捕获脸部事件
+	LoseFace,				//失去脸部事件
+	FaceCaptureFC			//人脸识别崩溃
+};
+
 class CVideoMonitorEvent
 {
 public:
-	virtual void GenerateCloseEvent() = 0;					//有人靠近 1.5M
-	virtual void GenerateLeaveEvent() = 0;					//客户离开,客户消失或退出到接近距离外1.5M
-	virtual void GenerateEnterOperateEvent() = 0;			//客户进入操作距离 0.5M
-	virtual void GenerateBackToCloseEvent() = 0;			//客户退回到接近距离
-	virtual void GenerateAppearEvent() = 0;					//有人出现在视野中
-	virtual void GenerateCustomerChangeEvent() = 0;			//客户已经换人
-
-	virtual void GenerateCaptureFaceEvent() = 0;			//捕获脸部事件
-	virtual void GenerateLoseFaceEvent() = 0;				//失去脸部事件
-	virtual void GenerateFaceCaptureFC() = 0;               //人脸识别崩溃
+	virtual void GenerateMonitorEvent(video_monitor_event_type eType) = 0;
 };
 
 struct CImageFrame